From 574d6a8e74f3da2ee6b130de765ff6ad42de3eb2 Mon Sep 17 00:00:00 2001
From: Arcaratus <byou64@gmail.com>
Date: Mon, 23 Nov 2020 21:03:19 -0500
Subject: [PATCH] Creating a usable API (#1713)

* Initial stab at API structuring

* Throwing all the things into the API*
Eliminated all internal imports
Also added some helpful comments
*except for the ritual stuff

* Reducing the API
Threw back the altar/incense/unnecessary items to main
Added in a functional API instance

* API cleanup
Removing all the unnecessities
Smushed and vaporized some redundant recipe stuffs

* Made API dummy instances
Refactor packaging
---
 .../java/wayoftime/bloodmagic/BloodMagic.java |   2 -
 .../wayoftime/bloodmagic/altar/AltarUtil.java |   5 -
 .../bloodmagic/altar/BloodAltar.java          |  10 +-
 .../bloodmagic/altar/ComponentType.java       |  14 +-
 .../{api/tile => altar}/IBloodAltar.java      |  12 +-
 .../{api/tile => altar}/IBloodRune.java       |   6 +-
 .../bloodmagic/api/IBloodMagicAPI.java        |  78 ++++-
 .../api/IBloodMagicRecipeRegistrar.java       | 100 ------
 .../api/IBloodMagicValueManager.java          |   8 +-
 .../api/compat/EnumDemonWillType.java         |  46 +++
 .../api/{item => compat}/IAltarReader.java    |   2 +-
 .../ICustomAlchemyConsumable.java             |   2 +-
 .../{will => api/compat}/IDemonWill.java      |   6 +-
 .../compat}/IDemonWillConduit.java            |   4 +-
 .../{will => api/compat}/IDemonWillGem.java   |   5 +-
 .../{item => compat}/IDemonWillViewer.java    |   5 +-
 .../compat}/IDemonWillWeapon.java             |   5 +-
 .../compat}/IDiscreteDemonWill.java           |   5 +-
 .../{incense => api/compat}/IIncensePath.java |   5 +-
 .../api/{item => compat}/IMultiWillTool.java  |   6 +-
 .../bloodmagic/api/tile/IAltarComponent.java  |  14 -
 .../bloodmagic/block/enums/BloodRuneType.java |  11 +-
 .../bloodmagic/client/ClientEvents.java       |   2 +-
 .../bloodmagic/client/hud/Elements.java       |   4 +-
 .../client/hud/element/ElementDemonAura.java  |   2 +-
 .../bloodmagic/common/block/BlockAltar.java   |   2 +-
 .../common/block/BlockBloodRune.java          |   2 +-
 .../common/block/BlockDemonCrucible.java      |   4 +-
 .../common/block/BlockDemonCrystal.java       |  33 +-
 .../common/block/BlockMasterRitualStone.java  |   2 +-
 .../bloodmagic/common/block/BlockPath.java    |   2 +-
 .../common/block/BloodMagicBlocks.java        |   2 +-
 .../common/data/GeneratorItemModels.java      |   2 +-
 .../data/recipe/builder/ARCRecipeBuilder.java |   6 +-
 .../builder/AlchemyArrayRecipeBuilder.java    |   2 +-
 .../builder/AlchemyTableRecipeBuilder.java    |   4 +-
 .../builder/BloodAltarRecipeBuilder.java      |   2 +-
 .../builder/TartaricForgeRecipeBuilder.java   |   2 +-
 .../common/item/BloodMagicItems.java          |   3 +-
 .../{orb => common/item}/BloodOrb.java        |   8 +-
 .../{api => common}/item/IActivatable.java    |   4 +-
 .../{api => common}/item/IBindable.java       |   2 +-
 .../bloodmagic/common/item/IBloodOrb.java     |  15 +
 .../common/item/ItemActivationCrystal.java    |   1 -
 .../common/item/ItemBindableBase.java         |   1 -
 .../bloodmagic/common/item/ItemBloodOrb.java  |   2 -
 .../common/item/ItemDemonCrystal.java         |   4 +-
 .../common/item/ItemDemonWillGauge.java       |   2 +-
 .../common/item/ItemRitualDiviner.java        |   2 +-
 .../common/item/ItemRitualReader.java         |   4 +-
 .../bloodmagic/common/item/ItemSigil.java     |   3 +-
 .../item => common/item/arc}/IARCTool.java    |   5 +-
 .../common/item/arc/ItemARCToolBase.java      |   1 -
 .../item => common/item/sigil}/ISigil.java    |   6 +-
 .../common/item/sigil/ItemSigilAir.java       |   1 -
 .../item/sigil/ItemSigilBloodLight.java       |   1 -
 .../item/sigil/ItemSigilDivination.java       |   7 +-
 .../common/item/sigil/ItemSigilLava.java      |   1 -
 .../item/sigil/ItemSigilToggleable.java       |   3 +-
 .../common/item/sigil/ItemSigilVoid.java      |   1 -
 .../common/item/sigil/ItemSigilWater.java     |   1 -
 .../common/item/soul/ItemMonsterSoul.java     |   4 +-
 .../common/item/soul/ItemSentientAxe.java     |   8 +-
 .../common/item/soul/ItemSentientPickaxe.java |   8 +-
 .../common/item/soul/ItemSentientShovel.java  |   8 +-
 .../common/item/soul/ItemSentientSword.java   |   8 +-
 .../common/item/soul/ItemSoulGem.java         |   8 +-
 .../common/recipe/ARCRecipeProvider.java      |   2 +-
 .../common/recipe/BloodMagicRecipeType.java   |  10 +-
 .../serializer/ARCRecipeSerializer.java       |   6 +-
 .../AlchemyArrayRecipeSerializer.java         |   4 +-
 .../AlchemyTableRecipeSerializer.java         |   4 +-
 .../BloodAltarRecipeSerializer.java           |   4 +-
 .../TartaricForgeRecipeSerializer.java        |   4 +-
 .../impl/BloodOrbDeferredRegister.java        |   2 +-
 .../impl/BloodOrbRegistryObject.java          |   2 +-
 .../impl/EntityTypeRegistryObject.java        |   2 +-
 .../BloodMagicRecipeSerializers.java          |  25 +-
 .../AlchemyTableRecipeCategory.java           |   2 +-
 .../jei/altar/BloodAltarRecipeCategory.java   |   4 +-
 .../compat/jei/arc/ARCRecipeCategory.java     |   2 +-
 .../array/AlchemyArrayCraftingCategory.java   |   2 +-
 .../forge/TartaricForgeRecipeCategory.java    |   2 +-
 .../bloodmagic/core/data/SoulTicket.java      |   5 +-
 .../core/recipe/IngredientBloodOrb.java       |   2 +-
 .../core/registry/AlchemyArrayRegistry.java   |   2 +-
 .../AlchemyArrayRendererRegistry.java         |   2 +-
 .../bloodmagic/core/registry/OrbRegistry.java |   2 +-
 .../demonaura/WorldDemonWillHandler.java      |   2 +-
 .../bloodmagic/event/ItemBindEvent.java       |   2 +-
 .../bloodmagic/gson/Serializers.java          |   2 +-
 .../bloodmagic/impl/BloodMagicAPI.java        |  51 +--
 .../bloodmagic/impl/BloodMagicCorePlugin.java |  12 +
 .../impl/BloodMagicRecipeRegistrar.java       | 317 +-----------------
 .../incense/EnumTranquilityType.java          |  13 +
 .../incense/ITranquilityHandler.java          |   3 +
 .../bloodmagic/incense/TranquilityStack.java  |   3 +
 .../network/DemonAuraClientPacket.java        |   2 +-
 .../wayoftime/bloodmagic/orb/IBloodOrb.java   |  11 -
 .../{api => }/recipe/BloodMagicRecipe.java    |   4 +-
 .../bloodmagic/recipe/IRecipeARC.java         |  42 ---
 .../recipe/IRecipeAlchemyArray.java           |  30 --
 .../recipe/IRecipeAlchemyTable.java           |  32 --
 .../bloodmagic/recipe/IRecipeBloodAltar.java  |  30 --
 .../recipe/IRecipeTartaricForge.java          |  35 --
 .../{api => }/recipe/RecipeARC.java           |  26 +-
 .../{api => }/recipe/RecipeAlchemyArray.java  |  22 +-
 .../{api => }/recipe/RecipeAlchemyTable.java  |  20 +-
 .../{api => }/recipe/RecipeBloodAltar.java    |  32 +-
 .../{api => }/recipe/RecipeTartaricForge.java |  19 +-
 .../helper}/FluidStackIngredient.java         |   3 +-
 .../helper}/IgnoredIInventory.java            |   2 +-
 .../helper}/InputIngredient.java              |   2 +-
 .../helper}/SerializerHelper.java             |   2 +-
 .../helper}/TagResolverHelper.java            |   2 +-
 .../registry/ModTranquilityHandlers.java      |  31 --
 .../bloodmagic/ritual/IMasterRitualStone.java |   2 +-
 .../wayoftime/bloodmagic/ritual/Ritual.java   |   2 +-
 .../ritual/types/RitualCrushing.java          |   2 +-
 .../ritual/types/RitualFeatheredKnife.java    |   4 +-
 .../bloodmagic/ritual/types/RitualLava.java   |   2 +-
 .../tile/TileAlchemicalReactionChamber.java   |   6 +-
 .../bloodmagic/tile/TileAlchemyTable.java     |   8 +-
 .../wayoftime/bloodmagic/tile/TileAltar.java  |   6 +-
 .../bloodmagic/tile/TileDemonCrucible.java    |   8 +-
 .../bloodmagic/tile/TileDemonCrystal.java     |   2 +-
 .../tile/TileDemonCrystallizer.java           |   4 +-
 .../bloodmagic/tile/TileIncenseAltar.java     |   2 +-
 .../tile/TileMasterRitualStone.java           |   4 +-
 .../bloodmagic/tile/TileSoulForge.java        |  10 +-
 .../tile/container/ContainerAlchemyTable.java |   2 +-
 .../tile/container/ContainerSoulForge.java    |   4 +-
 .../java/wayoftime/bloodmagic/util/Utils.java |   2 +-
 .../util/handler/event/GenericHandler.java    |   6 +-
 .../util/handler/event/WillHandler.java       |   6 +-
 .../bloodmagic/util/helper/NetworkHelper.java |   6 +-
 .../util/helper/PlayerSacrificeHelper.java    |   2 +-
 .../providers/IBaseProvider.java              |   6 +-
 .../providers/IEntityTypeProvider.java        |   2 +-
 .../{api => util}/text/IHasTextComponent.java |   2 +-
 .../text/IHasTranslationKey.java              |   2 +-
 .../bloodmagic/will/DemonWillHolder.java      |   1 +
 .../bloodmagic/will/EnumDemonWillType.java    |  54 ---
 .../will/PlayerDemonWillHandler.java          |   3 +
 144 files changed, 558 insertions(+), 990 deletions(-)
 rename src/main/java/wayoftime/bloodmagic/{api/tile => altar}/IBloodAltar.java (81%)
 rename src/main/java/wayoftime/bloodmagic/{api/tile => altar}/IBloodRune.java (61%)
 delete mode 100644 src/main/java/wayoftime/bloodmagic/api/IBloodMagicRecipeRegistrar.java
 create mode 100644 src/main/java/wayoftime/bloodmagic/api/compat/EnumDemonWillType.java
 rename src/main/java/wayoftime/bloodmagic/api/{item => compat}/IAltarReader.java (77%)
 rename src/main/java/wayoftime/bloodmagic/api/{item => compat}/ICustomAlchemyConsumable.java (85%)
 rename src/main/java/wayoftime/bloodmagic/{will => api/compat}/IDemonWill.java (93%)
 rename src/main/java/wayoftime/bloodmagic/{will => api/compat}/IDemonWillConduit.java (78%)
 rename src/main/java/wayoftime/bloodmagic/{will => api/compat}/IDemonWillGem.java (92%)
 rename src/main/java/wayoftime/bloodmagic/api/{item => compat}/IDemonWillViewer.java (73%)
 rename src/main/java/wayoftime/bloodmagic/{will => api/compat}/IDemonWillWeapon.java (69%)
 rename src/main/java/wayoftime/bloodmagic/{will => api/compat}/IDiscreteDemonWill.java (90%)
 rename src/main/java/wayoftime/bloodmagic/{incense => api/compat}/IIncensePath.java (73%)
 rename src/main/java/wayoftime/bloodmagic/api/{item => compat}/IMultiWillTool.java (53%)
 delete mode 100644 src/main/java/wayoftime/bloodmagic/api/tile/IAltarComponent.java
 rename src/main/java/wayoftime/bloodmagic/{orb => common/item}/BloodOrb.java (84%)
 rename src/main/java/wayoftime/bloodmagic/{api => common}/item/IActivatable.java (88%)
 rename src/main/java/wayoftime/bloodmagic/{api => common}/item/IBindable.java (95%)
 create mode 100644 src/main/java/wayoftime/bloodmagic/common/item/IBloodOrb.java
 rename src/main/java/wayoftime/bloodmagic/{api/item => common/item/arc}/IARCTool.java (69%)
 rename src/main/java/wayoftime/bloodmagic/{api/item => common/item/sigil}/ISigil.java (75%)
 delete mode 100644 src/main/java/wayoftime/bloodmagic/orb/IBloodOrb.java
 rename src/main/java/wayoftime/bloodmagic/{api => }/recipe/BloodMagicRecipe.java (92%)
 delete mode 100644 src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java
 delete mode 100644 src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyArray.java
 delete mode 100644 src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyTable.java
 delete mode 100644 src/main/java/wayoftime/bloodmagic/recipe/IRecipeBloodAltar.java
 delete mode 100644 src/main/java/wayoftime/bloodmagic/recipe/IRecipeTartaricForge.java
 rename src/main/java/wayoftime/bloodmagic/{api => }/recipe/RecipeARC.java (76%)
 rename src/main/java/wayoftime/bloodmagic/{api => }/recipe/RecipeAlchemyArray.java (66%)
 rename src/main/java/wayoftime/bloodmagic/{api => }/recipe/RecipeAlchemyTable.java (75%)
 rename src/main/java/wayoftime/bloodmagic/{api => }/recipe/RecipeBloodAltar.java (72%)
 rename src/main/java/wayoftime/bloodmagic/{api => }/recipe/RecipeTartaricForge.java (73%)
 rename src/main/java/wayoftime/bloodmagic/{api/event/recipes => recipe/helper}/FluidStackIngredient.java (99%)
 rename src/main/java/wayoftime/bloodmagic/{api/inventory => recipe/helper}/IgnoredIInventory.java (95%)
 rename src/main/java/wayoftime/bloodmagic/{api/event/recipes => recipe/helper}/InputIngredient.java (96%)
 rename src/main/java/wayoftime/bloodmagic/{api => recipe/helper}/SerializerHelper.java (98%)
 rename src/main/java/wayoftime/bloodmagic/{api/event/recipes => recipe/helper}/TagResolverHelper.java (94%)
 delete mode 100644 src/main/java/wayoftime/bloodmagic/registry/ModTranquilityHandlers.java
 rename src/main/java/wayoftime/bloodmagic/{api => util}/providers/IBaseProvider.java (74%)
 rename src/main/java/wayoftime/bloodmagic/{api => util}/providers/IEntityTypeProvider.java (92%)
 rename src/main/java/wayoftime/bloodmagic/{api => util}/text/IHasTextComponent.java (75%)
 rename src/main/java/wayoftime/bloodmagic/{api => util}/text/IHasTranslationKey.java (63%)
 delete mode 100644 src/main/java/wayoftime/bloodmagic/will/EnumDemonWillType.java

diff --git a/src/main/java/wayoftime/bloodmagic/BloodMagic.java b/src/main/java/wayoftime/bloodmagic/BloodMagic.java
index 42eab61d..5783c983 100644
--- a/src/main/java/wayoftime/bloodmagic/BloodMagic.java
+++ b/src/main/java/wayoftime/bloodmagic/BloodMagic.java
@@ -55,7 +55,6 @@ import wayoftime.bloodmagic.impl.BloodMagicAPI;
 import wayoftime.bloodmagic.impl.BloodMagicCorePlugin;
 import wayoftime.bloodmagic.network.BloodMagicPacketHandler;
 import wayoftime.bloodmagic.potion.BloodMagicPotions;
-import wayoftime.bloodmagic.registry.ModTranquilityHandlers;
 import wayoftime.bloodmagic.ritual.RitualManager;
 import wayoftime.bloodmagic.structures.ModDungeons;
 import wayoftime.bloodmagic.tile.TileAlchemicalReactionChamber;
@@ -133,7 +132,6 @@ public class BloodMagic
 		ModLoadingContext context = ModLoadingContext.get();
 		context.registerConfig(ModConfig.Type.CLIENT, ConfigManager.CLIENT_SPEC);
 
-		ModTranquilityHandlers.init();
 		ModDungeons.init();
 	}
 
diff --git a/src/main/java/wayoftime/bloodmagic/altar/AltarUtil.java b/src/main/java/wayoftime/bloodmagic/altar/AltarUtil.java
index 68f26d49..b02d469a 100644
--- a/src/main/java/wayoftime/bloodmagic/altar/AltarUtil.java
+++ b/src/main/java/wayoftime/bloodmagic/altar/AltarUtil.java
@@ -12,7 +12,6 @@ import net.minecraft.block.material.Material;
 import net.minecraft.tileentity.TileEntity;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
-import wayoftime.bloodmagic.api.tile.IAltarComponent;
 import wayoftime.bloodmagic.impl.BloodMagicAPI;
 import wayoftime.bloodmagic.common.block.BlockBloodRune;
 import wayoftime.bloodmagic.tile.TileAltar;
@@ -35,10 +34,6 @@ public class AltarUtil
 				BlockPos componentPos = pos.add(component.getOffset());
 				BlockState worldState = world.getBlockState(componentPos);
 
-				if (worldState.getBlock() instanceof IAltarComponent)
-					if (((IAltarComponent) worldState.getBlock()).getType(world, worldState, componentPos) == component.getComponent())
-						continue;
-
 				if (component.getComponent() == ComponentType.NOTAIR && worldState.getMaterial() != Material.AIR
 						&& !worldState.getMaterial().isLiquid())
 					continue;
diff --git a/src/main/java/wayoftime/bloodmagic/altar/BloodAltar.java b/src/main/java/wayoftime/bloodmagic/altar/BloodAltar.java
index 628d5286..b2a180c6 100644
--- a/src/main/java/wayoftime/bloodmagic/altar/BloodAltar.java
+++ b/src/main/java/wayoftime/bloodmagic/altar/BloodAltar.java
@@ -20,13 +20,13 @@ import net.minecraftforge.fluids.capability.templates.FluidTank;
 import net.minecraftforge.items.ItemHandlerHelper;
 import wayoftime.bloodmagic.api.event.BloodMagicCraftedEvent;
 import wayoftime.bloodmagic.impl.BloodMagicAPI;
-import wayoftime.bloodmagic.api.recipe.RecipeBloodAltar;
+import wayoftime.bloodmagic.recipe.RecipeBloodAltar;
 import wayoftime.bloodmagic.block.enums.BloodRuneType;
 import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
 import wayoftime.bloodmagic.core.data.Binding;
-import wayoftime.bloodmagic.api.item.IBindable;
-import wayoftime.bloodmagic.orb.BloodOrb;
-import wayoftime.bloodmagic.orb.IBloodOrb;
+import wayoftime.bloodmagic.common.item.IBindable;
+import wayoftime.bloodmagic.common.item.BloodOrb;
+import wayoftime.bloodmagic.common.item.IBloodOrb;
 import wayoftime.bloodmagic.tile.TileAltar;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
@@ -201,7 +201,7 @@ public class BloodAltar// implements IFluidHandler
 			RecipeBloodAltar recipe = BloodMagicAPI.INSTANCE.getRecipeRegistrar().getBloodAltar(tileAltar.getWorld(), input);
 			if (recipe != null)
 			{
-				if (recipe.getMinimumTier().ordinal() <= altarTier.ordinal())
+				if (recipe.getMinimumTier() <= altarTier.ordinal())
 				{
 					this.isActive = true;
 					this.recipe = recipe;
diff --git a/src/main/java/wayoftime/bloodmagic/altar/ComponentType.java b/src/main/java/wayoftime/bloodmagic/altar/ComponentType.java
index 6c9c6a5e..30cae9dc 100644
--- a/src/main/java/wayoftime/bloodmagic/altar/ComponentType.java
+++ b/src/main/java/wayoftime/bloodmagic/altar/ComponentType.java
@@ -9,7 +9,6 @@ public enum ComponentType
 {
 	GLOWSTONE, BLOODSTONE, BEACON, BLOODRUNE, CRYSTAL, NOTAIR;
 
-	public static final ComponentType[] VALUES = values();
 	private static final String BASE = "chat.bloodmagic.altar.comp.";
 	private String key;
 
@@ -22,4 +21,17 @@ public enum ComponentType
 	{
 		return key;
 	}
+
+	public static ComponentType getType(String type)
+	{
+		for (ComponentType t : values())
+		{
+			if (t.name().equalsIgnoreCase(type))
+			{
+				return t;
+			}
+		}
+
+		return null;
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/api/tile/IBloodAltar.java b/src/main/java/wayoftime/bloodmagic/altar/IBloodAltar.java
similarity index 81%
rename from src/main/java/wayoftime/bloodmagic/api/tile/IBloodAltar.java
rename to src/main/java/wayoftime/bloodmagic/altar/IBloodAltar.java
index 1d212292..08f8253c 100644
--- a/src/main/java/wayoftime/bloodmagic/api/tile/IBloodAltar.java
+++ b/src/main/java/wayoftime/bloodmagic/altar/IBloodAltar.java
@@ -1,14 +1,18 @@
-package wayoftime.bloodmagic.api.tile;
-
-import wayoftime.bloodmagic.altar.AltarTier;
+package wayoftime.bloodmagic.altar;
 
+/**
+ * Any Tile that implements this will be considered to be a Blood Altar
+ */
 public interface IBloodAltar
 {
 	int getCapacity();
 
 	int getCurrentBlood();
 
-	AltarTier getTier();
+	/**
+	 * @return - The actual human-readable tier (ordinal + 1) of the altar
+	 */
+	int getTier();
 
 	int getProgress();
 
diff --git a/src/main/java/wayoftime/bloodmagic/api/tile/IBloodRune.java b/src/main/java/wayoftime/bloodmagic/altar/IBloodRune.java
similarity index 61%
rename from src/main/java/wayoftime/bloodmagic/api/tile/IBloodRune.java
rename to src/main/java/wayoftime/bloodmagic/altar/IBloodRune.java
index 95c6d207..e5cde2ba 100644
--- a/src/main/java/wayoftime/bloodmagic/api/tile/IBloodRune.java
+++ b/src/main/java/wayoftime/bloodmagic/altar/IBloodRune.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.tile;
+package wayoftime.bloodmagic.altar;
 
 import javax.annotation.Nullable;
 
@@ -7,10 +7,10 @@ import net.minecraft.world.World;
 import wayoftime.bloodmagic.block.enums.BloodRuneType;
 
 /**
- * Any block that implements this interface wil be considered as Blood Runes for the Blood Altar
+ * Any Block that implements this interface wil be considered as Blood Runes for the Blood Altar
  */
 public interface IBloodRune
 {
 	@Nullable
-	BloodRuneType getBloodRune(World world, BlockPos pos);
+    BloodRuneType getBloodRune(World world, BlockPos pos);
 }
diff --git a/src/main/java/wayoftime/bloodmagic/api/IBloodMagicAPI.java b/src/main/java/wayoftime/bloodmagic/api/IBloodMagicAPI.java
index d9ea2988..f252309d 100644
--- a/src/main/java/wayoftime/bloodmagic/api/IBloodMagicAPI.java
+++ b/src/main/java/wayoftime/bloodmagic/api/IBloodMagicAPI.java
@@ -3,6 +3,11 @@ package wayoftime.bloodmagic.api;
 import javax.annotation.Nonnull;
 
 import net.minecraft.block.BlockState;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.util.LazyValue;
+import org.apache.logging.log4j.LogManager;
+
+import java.util.function.Predicate;
 
 /**
  * The main interface between a plugin and Blood Magic's internals.
@@ -11,12 +16,22 @@ import net.minecraft.block.BlockState;
  * Magic. More advanced integration is out of the scope of this API and are
  * considered "addons".
  *
- * To get an instance of this without actually creating an
- * {@link IBloodMagicPlugin}, use {@link BloodMagicPlugin.Inject}.
+ * Use INSTANCE to get an instance of the API without actually implementing anything
  */
 public interface IBloodMagicAPI
 {
-
+	LazyValue<IBloodMagicAPI> INSTANCE = new LazyValue<>(() ->
+	{
+		try
+		{
+			return (IBloodMagicAPI) Class.forName("wayoftime.bloodmagic.impl.BloodMagicAPI").getDeclaredField("INSTANCE").get(null);
+		}
+		catch (ReflectiveOperationException e)
+		{
+			LogManager.getLogger().warn("Unable to find BloodMagicAPI, using a dummy instance instead...");
+			return new IBloodMagicAPI() {};
+		}
+	});
 //	/**
 //	 * Retrieves the instance of the blacklist.
 //	 *
@@ -25,24 +40,19 @@ public interface IBloodMagicAPI
 //	@Nonnull
 //	IBloodMagicBlacklist getBlacklist();
 
-	/**
-	 * Retrieves the instance of the recipe registrar.
-	 *
-	 * @return the active {@link IBloodMagicRecipeRegistrar} instance
-	 */
-	@Nonnull
-	IBloodMagicRecipeRegistrar getRecipeRegistrar();
-
 	/**
 	 * Retrieves the instance of the value manager.
 	 *
 	 * @return the active {@link IBloodMagicValueManager} instance
 	 */
 	@Nonnull
-	IBloodMagicValueManager getValueManager();
+	default IBloodMagicValueManager getValueManager()
+	{
+		return new IBloodMagicValueManager() {};
+	}
 
 	/**
-	 * Registers an {@link IBlockState} as a given component for the Blood Altar.
+	 * Registers a {@link BlockState} as a given component for the Blood Altar.
 	 * <p>
 	 * Valid component types:
 	 * <ul>
@@ -57,10 +67,10 @@ public interface IBloodMagicAPI
 	 * @param state         The state to register
 	 * @param componentType The type of Blood Altar component to register as.
 	 */
-	void registerAltarComponent(@Nonnull BlockState state, @Nonnull String componentType);
+	default void registerAltarComponent(@Nonnull BlockState state, @Nonnull String componentType) {}
 
 	/**
-	 * Removes an {@link IBlockState} from the component mappings
+	 * Removes a {@link BlockState} from the component mappings
 	 * <p>
 	 * Valid component types:
 	 * <ul>
@@ -75,6 +85,42 @@ public interface IBloodMagicAPI
 	 * @param state         The state to unregister
 	 * @param componentType The type of Blood Altar component to unregister from.
 	 */
-	void unregisterAltarComponent(@Nonnull BlockState state, @Nonnull String componentType);
+	default void unregisterAltarComponent(@Nonnull BlockState state, @Nonnull String componentType) {}
 
+	/**
+	 * Registers a {@link Predicate<BlockState>} for tranquility handling
+	 * <p>
+	 * Valid tranquility types:
+	 * <ul>
+	 * <li>PLANT</li>
+	 * <li>CROP</li>
+	 * <li>TREE</li>
+	 * <li>EARTHEN</li>
+	 * <li>WATER</li>
+	 * <li>FIRE</li>
+	 * <li>LAVA</li>
+	 * </ul>
+	 *
+	 * @param predicate Predicate to be used for the handler (goes to ITranquilityHandler)
+	 * @param tranquilityType Tranquility type that the handler holds
+	 * @param value The amount of tranquility that the handler has
+	 */
+	default void registerTranquilityHandler(Predicate<BlockState> predicate, String tranquilityType, double value) {}
+
+	/**
+	 * Gets the total Will that a Player contains
+	 * <p>
+	 * Valid tranquility types:
+	 * <ul>
+	 * <li>DEFAULT</li>
+	 * <li>CORROSIVE</li>
+	 * <li>DESTRUCTIVE</li>
+	 * <li>VENGEFUL</li>
+	 * <li>STEADFAST</li>
+	 * </ul>
+	 */
+	default double getTotalDemonWill(String willType, PlayerEntity player)
+	{
+		return 0;
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/api/IBloodMagicRecipeRegistrar.java b/src/main/java/wayoftime/bloodmagic/api/IBloodMagicRecipeRegistrar.java
deleted file mode 100644
index 46b8bd80..00000000
--- a/src/main/java/wayoftime/bloodmagic/api/IBloodMagicRecipeRegistrar.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package wayoftime.bloodmagic.api;
-
-/**
- * Allows recipe addition and removal.
- */
-public interface IBloodMagicRecipeRegistrar
-{
-
-//	/**
-//	 * Adds a new recipe to the Blood Altar.
-//	 *
-//	 * @param input       An input {@link Ingredient}.
-//	 * @param output      An output {@link ItemStack}.
-//	 * @param minimumTier The minimum Blood Altar tier required for this recipe.
-//	 * @param syphon      The amount of Life Essence to syphon from the Blood Altar
-//	 *                    over the course of the craft.
-//	 * @param consumeRate How quickly the Life Essence is syphoned.
-//	 * @param drainRate   How quickly progress is lost if the Blood Altar runs out
-//	 *                    of Life Essence during the craft.
-//	 */
-//	void addBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier,
-//			@Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate);
-//
-//	/**
-//	 * Removes a Blood Altar recipe based on an input {@link ItemStack}.
-//	 *
-//	 * @param input The input item to remove the recipe of.
-//	 * @return Whether or not a recipe was removed.
-//	 */
-//	boolean removeBloodAltar(@Nonnull ItemStack input);
-//
-//	/**
-//	 * Adds a new recipe to the Alchemy Table.
-//	 *
-//	 * @param output      An output {@link ItemStack}.
-//	 * @param syphon      The amount of Life Essence to syphon from the Blood Orb's
-//	 *                    bound network over the course of the craft.
-//	 * @param ticks       The amount of ticks it takes to complete the craft.
-//	 * @param minimumTier The minimum Blood Orb tier required for this recipe.
-//	 * @param input       An array of {@link Ingredient}s to accept as inputs.
-//	 */
-//	void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks,
-//			@Nonnegative int minimumTier, @Nonnull Ingredient... input);
-//
-//	/**
-//	 * Removes an Alchemy Table recipe based on an input {@link ItemStack} array.
-//	 *
-//	 * @param input The input items to remove the recipe of.
-//	 * @return Whether or not a recipe was removed.
-//	 */
-//	boolean removeAlchemyTable(@Nonnull ItemStack... input);
-//
-//	/**
-//	 * Adds a new recipe to the Soul/Tartaric Forge.
-//	 * 
-//	 * @param output       An output {@link ItemStack}.
-//	 * @param minimumSouls The minimum number of souls that must be contained in the
-//	 *                     Soul Gem.
-//	 * @param soulDrain    The number of souls to drain from the Soul Gem.
-//	 * @param input        An array of {@link Ingredient}s to accept as inputs.
-//	 */
-//	void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain,
-//			@Nonnull Ingredient... input);
-//
-//	/**
-//	 * Removes a Soul/Tartaric Forge recipe based on an input {@link ItemStack}
-//	 * array.
-//	 *
-//	 * @param input The input items to remove the recipe of.
-//	 * @return Whether or not a recipe was removed.
-//	 */
-//	boolean removeTartaricForge(@Nonnull ItemStack... input);
-//
-//	/**
-//	 * Adds a new recipe to the Alchemy Array.
-//	 *
-//	 * @param input         An input {@link Ingredient}. First item put into the
-//	 *                      Alchemy Array.
-//	 * @param catalyst      A catalyst {@link Ingredient}. Second item put into the
-//	 *                      Alchemy Array.
-//	 * @param output        An output {@link ItemStack}.
-//	 * @param circleTexture The texture to render for the Alchemy Array circle.
-//	 */
-//	void addAlchemyArray(@Nonnull Ingredient input, @Nonnull Ingredient catalyst, @Nonnull ItemStack output,
-//			@Nullable ResourceLocation circleTexture);
-//
-//	/**
-//	 * Removes an Alchemy Array recipe based on an input {@link ItemStack} and it's
-//	 * catalyst {@link ItemStack}.
-//	 *
-//	 * @param input    The input item to remove the recipe of.
-//	 * @param catalyst The catalyst item to remove the recipe of.
-//	 * @return Whether or not a recipe was removed.
-//	 */
-//	boolean removeAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst);
-//
-//	void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired, @Nonnull Ingredient... input);
-//
-//	boolean removeSacrificeCraft(@Nonnull ItemStack... input);
-}
diff --git a/src/main/java/wayoftime/bloodmagic/api/IBloodMagicValueManager.java b/src/main/java/wayoftime/bloodmagic/api/IBloodMagicValueManager.java
index 0658e253..da1676d6 100644
--- a/src/main/java/wayoftime/bloodmagic/api/IBloodMagicValueManager.java
+++ b/src/main/java/wayoftime/bloodmagic/api/IBloodMagicValueManager.java
@@ -21,10 +21,10 @@ public interface IBloodMagicValueManager
 	 * @param entityId The registry name of the entity.
 	 * @param value    The amount of LP per health point to receive upon sacrifice.
 	 */
-	void setSacrificialValue(@Nonnull ResourceLocation entityId, @Nonnegative int value);
+	default void setSacrificialValue(@Nonnull ResourceLocation entityId, @Nonnegative int value) {}
 
 	/**
-	 * Sets the Tranquility value of a given {@link IBlockState}.
+	 * Sets the Tranquility value of a given {@link BlockState}.
 	 * <p>
 	 * Valid tranquility types:
 	 * <ul>
@@ -37,9 +37,9 @@ public interface IBloodMagicValueManager
 	 * <li>LAVA</li>
 	 * </ul>
 	 *
-	 * @param state           The {@link IBlockState} to set the value of.
+	 * @param state           The {@link BlockState} to set the value of.
 	 * @param tranquilityType The type of Tranquility this block should provide.
 	 * @param value           The amount of tranquility this block should provide.
 	 */
-	void setTranquility(@Nonnull BlockState state, @Nonnull String tranquilityType, double value);
+	default void setTranquility(@Nonnull BlockState state, @Nonnull String tranquilityType, double value) {}
 }
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/api/compat/EnumDemonWillType.java b/src/main/java/wayoftime/bloodmagic/api/compat/EnumDemonWillType.java
new file mode 100644
index 00000000..87829daf
--- /dev/null
+++ b/src/main/java/wayoftime/bloodmagic/api/compat/EnumDemonWillType.java
@@ -0,0 +1,46 @@
+package wayoftime.bloodmagic.api.compat;
+
+import net.minecraft.util.IStringSerializable;
+
+import java.util.Locale;
+
+public enum EnumDemonWillType implements IStringSerializable
+{
+	DEFAULT("default"),
+	CORROSIVE("corrosive"),
+	DESTRUCTIVE("destructive"),
+	VENGEFUL("vengeful"),
+	STEADFAST("steadfast");
+
+	public final String name;
+
+	EnumDemonWillType(String name)
+	{
+		this.name = name;
+	}
+
+	@Override
+	public String toString()
+	{
+		return name().toLowerCase(Locale.ENGLISH);
+	}
+
+	@Override
+	public String getString()
+	{
+		return this.toString();
+	}
+
+	public static EnumDemonWillType getType(String type)
+	{
+		for (EnumDemonWillType t : values())
+		{
+			if (t.name().equalsIgnoreCase(type))
+			{
+				return t;
+			}
+		}
+
+		return null;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/api/item/IAltarReader.java b/src/main/java/wayoftime/bloodmagic/api/compat/IAltarReader.java
similarity index 77%
rename from src/main/java/wayoftime/bloodmagic/api/item/IAltarReader.java
rename to src/main/java/wayoftime/bloodmagic/api/compat/IAltarReader.java
index 8e69a282..7eb672fd 100644
--- a/src/main/java/wayoftime/bloodmagic/api/item/IAltarReader.java
+++ b/src/main/java/wayoftime/bloodmagic/api/compat/IAltarReader.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.item;
+package wayoftime.bloodmagic.api.compat;
 
 /**
  * Any item that implements this interface will not be pulled into the Altar on
diff --git a/src/main/java/wayoftime/bloodmagic/api/item/ICustomAlchemyConsumable.java b/src/main/java/wayoftime/bloodmagic/api/compat/ICustomAlchemyConsumable.java
similarity index 85%
rename from src/main/java/wayoftime/bloodmagic/api/item/ICustomAlchemyConsumable.java
rename to src/main/java/wayoftime/bloodmagic/api/compat/ICustomAlchemyConsumable.java
index 58f57972..10822cee 100644
--- a/src/main/java/wayoftime/bloodmagic/api/item/ICustomAlchemyConsumable.java
+++ b/src/main/java/wayoftime/bloodmagic/api/compat/ICustomAlchemyConsumable.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.item;
+package wayoftime.bloodmagic.api.compat;
 
 import net.minecraft.item.ItemStack;
 
diff --git a/src/main/java/wayoftime/bloodmagic/will/IDemonWill.java b/src/main/java/wayoftime/bloodmagic/api/compat/IDemonWill.java
similarity index 93%
rename from src/main/java/wayoftime/bloodmagic/will/IDemonWill.java
rename to src/main/java/wayoftime/bloodmagic/api/compat/IDemonWill.java
index 3234d1fd..0957789f 100644
--- a/src/main/java/wayoftime/bloodmagic/will/IDemonWill.java
+++ b/src/main/java/wayoftime/bloodmagic/api/compat/IDemonWill.java
@@ -1,7 +1,10 @@
-package wayoftime.bloodmagic.will;
+package wayoftime.bloodmagic.api.compat;
 
 import net.minecraft.item.ItemStack;
 
+/**
+ * Interface for Items that contain Will
+ */
 public interface IDemonWill
 {
 	/**
@@ -35,7 +38,6 @@ public interface IDemonWill
 	 * Creates a new ItemStack with the specified number of will. Implementation
 	 * should respect the number requested.
 	 *
-	 * @param meta   - The meta of the ItemStack to create
 	 * @param number - The amount of Will to create the Stack with.
 	 * @return - An ItemStack with the set amount of Will
 	 */
diff --git a/src/main/java/wayoftime/bloodmagic/will/IDemonWillConduit.java b/src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillConduit.java
similarity index 78%
rename from src/main/java/wayoftime/bloodmagic/will/IDemonWillConduit.java
rename to src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillConduit.java
index 61fa7138..b069377b 100644
--- a/src/main/java/wayoftime/bloodmagic/will/IDemonWillConduit.java
+++ b/src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillConduit.java
@@ -1,7 +1,7 @@
-package wayoftime.bloodmagic.will;
+package wayoftime.bloodmagic.api.compat;
 
 /**
- * Implement this interface on a block that can accept and store Demonic Will.
+ * Implement this interface on a Block that can accept and store Demonic Will.
  */
 public interface IDemonWillConduit
 {
diff --git a/src/main/java/wayoftime/bloodmagic/will/IDemonWillGem.java b/src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillGem.java
similarity index 92%
rename from src/main/java/wayoftime/bloodmagic/will/IDemonWillGem.java
rename to src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillGem.java
index e1f9a799..2e0ef4e9 100644
--- a/src/main/java/wayoftime/bloodmagic/will/IDemonWillGem.java
+++ b/src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillGem.java
@@ -1,7 +1,10 @@
-package wayoftime.bloodmagic.will;
+package wayoftime.bloodmagic.api.compat;
 
 import net.minecraft.item.ItemStack;
 
+/**
+ * Interface for Items that store Will
+ */
 public interface IDemonWillGem
 {
 	/**
diff --git a/src/main/java/wayoftime/bloodmagic/api/item/IDemonWillViewer.java b/src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillViewer.java
similarity index 73%
rename from src/main/java/wayoftime/bloodmagic/api/item/IDemonWillViewer.java
rename to src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillViewer.java
index 9ee2ef1a..7f646c72 100644
--- a/src/main/java/wayoftime/bloodmagic/api/item/IDemonWillViewer.java
+++ b/src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillViewer.java
@@ -1,9 +1,12 @@
-package wayoftime.bloodmagic.api.item;
+package wayoftime.bloodmagic.api.compat;
 
 import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.item.ItemStack;
 import net.minecraft.world.World;
 
+/**
+ * Interface for Items that allow players to see Will inside of chunks
+ */
 public interface IDemonWillViewer
 {
 	boolean canSeeDemonWillAura(World world, ItemStack stack, PlayerEntity player);
diff --git a/src/main/java/wayoftime/bloodmagic/will/IDemonWillWeapon.java b/src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillWeapon.java
similarity index 69%
rename from src/main/java/wayoftime/bloodmagic/will/IDemonWillWeapon.java
rename to src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillWeapon.java
index e74f7ac5..95a894c7 100644
--- a/src/main/java/wayoftime/bloodmagic/will/IDemonWillWeapon.java
+++ b/src/main/java/wayoftime/bloodmagic/api/compat/IDemonWillWeapon.java
@@ -1,10 +1,13 @@
-package wayoftime.bloodmagic.will;
+package wayoftime.bloodmagic.api.compat;
 
 import java.util.List;
 
 import net.minecraft.entity.LivingEntity;
 import net.minecraft.item.ItemStack;
 
+/**
+ * Interface for weapons that drop will when a LivingEntity is killed
+ */
 public interface IDemonWillWeapon
 {
 	List<ItemStack> getRandomDemonWillDrop(LivingEntity killedEntity, LivingEntity attackingEntity, ItemStack stack, int looting);
diff --git a/src/main/java/wayoftime/bloodmagic/will/IDiscreteDemonWill.java b/src/main/java/wayoftime/bloodmagic/api/compat/IDiscreteDemonWill.java
similarity index 90%
rename from src/main/java/wayoftime/bloodmagic/will/IDiscreteDemonWill.java
rename to src/main/java/wayoftime/bloodmagic/api/compat/IDiscreteDemonWill.java
index 9388ce13..2b79fbb4 100644
--- a/src/main/java/wayoftime/bloodmagic/will/IDiscreteDemonWill.java
+++ b/src/main/java/wayoftime/bloodmagic/api/compat/IDiscreteDemonWill.java
@@ -1,7 +1,10 @@
-package wayoftime.bloodmagic.will;
+package wayoftime.bloodmagic.api.compat;
 
 import net.minecraft.item.ItemStack;
 
+/**
+ * Interface for Items that contain a discrete amount of Will
+ */
 public interface IDiscreteDemonWill
 {
 	/**
diff --git a/src/main/java/wayoftime/bloodmagic/incense/IIncensePath.java b/src/main/java/wayoftime/bloodmagic/api/compat/IIncensePath.java
similarity index 73%
rename from src/main/java/wayoftime/bloodmagic/incense/IIncensePath.java
rename to src/main/java/wayoftime/bloodmagic/api/compat/IIncensePath.java
index ae5ef122..2ba87a7d 100644
--- a/src/main/java/wayoftime/bloodmagic/incense/IIncensePath.java
+++ b/src/main/java/wayoftime/bloodmagic/api/compat/IIncensePath.java
@@ -1,9 +1,12 @@
-package wayoftime.bloodmagic.incense;
+package wayoftime.bloodmagic.api.compat;
 
 import net.minecraft.block.BlockState;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 
+/**
+ * Any Block that implements this will be considered to be a valid path block for the Incense Altar
+ */
 public interface IIncensePath
 {
 	/**
diff --git a/src/main/java/wayoftime/bloodmagic/api/item/IMultiWillTool.java b/src/main/java/wayoftime/bloodmagic/api/compat/IMultiWillTool.java
similarity index 53%
rename from src/main/java/wayoftime/bloodmagic/api/item/IMultiWillTool.java
rename to src/main/java/wayoftime/bloodmagic/api/compat/IMultiWillTool.java
index 02b84710..790dbf62 100644
--- a/src/main/java/wayoftime/bloodmagic/api/item/IMultiWillTool.java
+++ b/src/main/java/wayoftime/bloodmagic/api/compat/IMultiWillTool.java
@@ -1,8 +1,10 @@
-package wayoftime.bloodmagic.api.item;
+package wayoftime.bloodmagic.api.compat;
 
 import net.minecraft.item.ItemStack;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
 
+/**
+ * Interface for Items that can contain multiple Will types
+ */
 public interface IMultiWillTool
 {
 	EnumDemonWillType getCurrentType(ItemStack stack);
diff --git a/src/main/java/wayoftime/bloodmagic/api/tile/IAltarComponent.java b/src/main/java/wayoftime/bloodmagic/api/tile/IAltarComponent.java
deleted file mode 100644
index 730351d3..00000000
--- a/src/main/java/wayoftime/bloodmagic/api/tile/IAltarComponent.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package wayoftime.bloodmagic.api.tile;
-
-import javax.annotation.Nullable;
-
-import net.minecraft.block.BlockState;
-import net.minecraft.util.math.BlockPos;
-import net.minecraft.world.World;
-import wayoftime.bloodmagic.altar.ComponentType;
-
-public interface IAltarComponent
-{
-	@Nullable
-	ComponentType getType(World world, BlockState state, BlockPos pos);
-}
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/block/enums/BloodRuneType.java b/src/main/java/wayoftime/bloodmagic/block/enums/BloodRuneType.java
index 2c7f6d8d..cce55391 100644
--- a/src/main/java/wayoftime/bloodmagic/block/enums/BloodRuneType.java
+++ b/src/main/java/wayoftime/bloodmagic/block/enums/BloodRuneType.java
@@ -6,7 +6,16 @@ import net.minecraft.util.IStringSerializable;
 
 public enum BloodRuneType implements IStringSerializable
 {
-	BLANK, SPEED, EFFICIENCY, SACRIFICE, SELF_SACRIFICE, DISPLACEMENT, CAPACITY, AUGMENTED_CAPACITY, ORB, ACCELERATION,
+	BLANK,
+	SPEED,
+	EFFICIENCY,
+	SACRIFICE,
+	SELF_SACRIFICE,
+	DISPLACEMENT,
+	CAPACITY,
+	AUGMENTED_CAPACITY,
+	ORB,
+	ACCELERATION,
 	CHARGING;
 
 	@Override
diff --git a/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java b/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java
index 6795ceed..1ad86927 100644
--- a/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java
+++ b/src/main/java/wayoftime/bloodmagic/client/ClientEvents.java
@@ -19,7 +19,6 @@ import net.minecraftforge.fml.client.registry.RenderingRegistry;
 import net.minecraftforge.fml.common.Mod;
 import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.item.IMultiWillTool;
 import wayoftime.bloodmagic.client.model.MimicColor;
 import wayoftime.bloodmagic.client.render.block.RenderAlchemyArray;
 import wayoftime.bloodmagic.client.render.block.RenderAltar;
@@ -35,6 +34,7 @@ import wayoftime.bloodmagic.common.item.ItemSacrificialDagger;
 import wayoftime.bloodmagic.common.item.sigil.ItemSigilToggleable;
 import wayoftime.bloodmagic.common.item.soul.ItemSentientSword;
 import wayoftime.bloodmagic.common.registries.BloodMagicEntityTypes;
+import wayoftime.bloodmagic.api.compat.IMultiWillTool;
 import wayoftime.bloodmagic.tile.TileAlchemyArray;
 import wayoftime.bloodmagic.tile.TileAltar;
 import wayoftime.bloodmagic.tile.TileDemonCrucible;
diff --git a/src/main/java/wayoftime/bloodmagic/client/hud/Elements.java b/src/main/java/wayoftime/bloodmagic/client/hud/Elements.java
index 7a4697fd..18515e0f 100644
--- a/src/main/java/wayoftime/bloodmagic/client/hud/Elements.java
+++ b/src/main/java/wayoftime/bloodmagic/client/hud/Elements.java
@@ -31,7 +31,7 @@ public class Elements
 				// Current tier
 				information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), altar -> altar == null
 						? "IV"
-						: NumeralHelper.toRoman(altar.getTier().toInt())));
+						: NumeralHelper.toRoman(altar.getTier())));
 				// Stored/Capacity
 				information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), altar -> String.format("%d/%d", altar == null
 						? 0
@@ -47,7 +47,7 @@ public class Elements
 				// Current tier
 				information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), altar -> altar == null
 						? "IV"
-						: NumeralHelper.toRoman(altar.getTier().toInt())));
+						: NumeralHelper.toRoman(altar.getTier())));
 				// Stored/Capacity
 				information.accept(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), altar -> String.format("%d/%d", altar == null
 						? 0
diff --git a/src/main/java/wayoftime/bloodmagic/client/hud/element/ElementDemonAura.java b/src/main/java/wayoftime/bloodmagic/client/hud/element/ElementDemonAura.java
index 5555edf9..6f29cf8a 100644
--- a/src/main/java/wayoftime/bloodmagic/client/hud/element/ElementDemonAura.java
+++ b/src/main/java/wayoftime/bloodmagic/client/hud/element/ElementDemonAura.java
@@ -12,7 +12,7 @@ import net.minecraft.util.ResourceLocation;
 import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.util.Utils;
 import wayoftime.bloodmagic.util.handler.event.ClientHandler;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 public class ElementDemonAura extends HUDElement
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockAltar.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockAltar.java
index b421ff46..af1908e3 100644
--- a/src/main/java/wayoftime/bloodmagic/common/block/BlockAltar.java
+++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockAltar.java
@@ -16,7 +16,7 @@ import net.minecraft.world.IBlockReader;
 import net.minecraft.world.IWorld;
 import net.minecraft.world.World;
 import net.minecraftforge.common.ToolType;
-import wayoftime.bloodmagic.api.item.IAltarReader;
+import wayoftime.bloodmagic.api.compat.IAltarReader;
 import wayoftime.bloodmagic.tile.TileAltar;
 import wayoftime.bloodmagic.util.Utils;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockBloodRune.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockBloodRune.java
index 41bad0eb..470ba08a 100644
--- a/src/main/java/wayoftime/bloodmagic/common/block/BlockBloodRune.java
+++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockBloodRune.java
@@ -16,7 +16,7 @@ import net.minecraft.world.IBlockReader;
 import net.minecraft.world.World;
 import net.minecraftforge.common.ToolType;
 import wayoftime.bloodmagic.block.enums.BloodRuneType;
-import wayoftime.bloodmagic.api.tile.IBloodRune;
+import wayoftime.bloodmagic.altar.IBloodRune;
 
 public class BlockBloodRune extends Block implements IBloodRune
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockDemonCrucible.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockDemonCrucible.java
index b369f27e..41a302a7 100644
--- a/src/main/java/wayoftime/bloodmagic/common/block/BlockDemonCrucible.java
+++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockDemonCrucible.java
@@ -18,8 +18,8 @@ import net.minecraft.world.World;
 import net.minecraftforge.common.ToolType;
 import wayoftime.bloodmagic.tile.TileDemonCrucible;
 import wayoftime.bloodmagic.util.Utils;
-import wayoftime.bloodmagic.will.IDemonWillGem;
-import wayoftime.bloodmagic.will.IDiscreteDemonWill;
+import wayoftime.bloodmagic.api.compat.IDemonWillGem;
+import wayoftime.bloodmagic.api.compat.IDiscreteDemonWill;
 
 public class BlockDemonCrucible extends Block
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockDemonCrystal.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockDemonCrystal.java
index ca889a01..291b6e69 100644
--- a/src/main/java/wayoftime/bloodmagic/common/block/BlockDemonCrystal.java
+++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockDemonCrystal.java
@@ -29,9 +29,10 @@ import net.minecraft.world.IWorld;
 import net.minecraft.world.IWorldReader;
 import net.minecraft.world.World;
 import net.minecraftforge.common.ToolType;
+import wayoftime.bloodmagic.common.item.BloodMagicItems;
 import wayoftime.bloodmagic.common.item.ItemDemonCrystal;
 import wayoftime.bloodmagic.tile.TileDemonCrystal;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 import wayoftime.bloodmagic.will.PlayerDemonWillHandler;
 
 public class BlockDemonCrystal extends Block
@@ -95,21 +96,21 @@ public class BlockDemonCrystal extends Block
 		ItemStack stack = ItemStack.EMPTY;
 		switch (type)
 		{
-		case CORROSIVE:
-			stack = EnumDemonWillType.CORROSIVE.getStack();
-			break;
-		case DEFAULT:
-			stack = EnumDemonWillType.DEFAULT.getStack();
-			break;
-		case DESTRUCTIVE:
-			stack = EnumDemonWillType.DESTRUCTIVE.getStack();
-			break;
-		case STEADFAST:
-			stack = EnumDemonWillType.STEADFAST.getStack();
-			break;
-		case VENGEFUL:
-			stack = EnumDemonWillType.VENGEFUL.getStack();
-			break;
+			case CORROSIVE:
+				stack =  new ItemStack(BloodMagicItems.CORROSIVE_CRYSTAL.get());
+				break;
+			case DEFAULT:
+				stack =  new ItemStack(BloodMagicItems.RAW_CRYSTAL.get());
+				break;
+			case DESTRUCTIVE:
+				stack = new ItemStack(BloodMagicItems.DESTRUCTIVE_CRYSTAL.get());
+				break;
+			case STEADFAST:
+				stack =  new ItemStack(BloodMagicItems.STEADFAST_CRYSTAL.get());
+				break;
+			case VENGEFUL:
+				stack =  new ItemStack(BloodMagicItems.VENGEFUL_CRYSTAL.get());
+				break;
 		}
 
 		stack.setCount(crystalNumber);
diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java
index 1bb6c062..360118bb 100644
--- a/src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java
+++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockMasterRitualStone.java
@@ -20,7 +20,7 @@ import net.minecraft.world.World;
 import net.minecraftforge.common.ToolType;
 import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.common.item.ItemActivationCrystal;
-import wayoftime.bloodmagic.api.item.IBindable;
+import wayoftime.bloodmagic.common.item.IBindable;
 import wayoftime.bloodmagic.ritual.Ritual;
 import wayoftime.bloodmagic.tile.TileMasterRitualStone;
 import wayoftime.bloodmagic.util.helper.RitualHelper;
diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BlockPath.java b/src/main/java/wayoftime/bloodmagic/common/block/BlockPath.java
index bc854616..d0888152 100644
--- a/src/main/java/wayoftime/bloodmagic/common/block/BlockPath.java
+++ b/src/main/java/wayoftime/bloodmagic/common/block/BlockPath.java
@@ -4,7 +4,7 @@ import net.minecraft.block.Block;
 import net.minecraft.block.BlockState;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
-import wayoftime.bloodmagic.incense.IIncensePath;
+import wayoftime.bloodmagic.api.compat.IIncensePath;
 
 public class BlockPath extends Block implements IIncensePath
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java b/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java
index 97f75b94..5b32fd7a 100644
--- a/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java
+++ b/src/main/java/wayoftime/bloodmagic/common/block/BloodMagicBlocks.java
@@ -36,7 +36,7 @@ import wayoftime.bloodmagic.ritual.EnumRuneType;
 import wayoftime.bloodmagic.tile.container.ContainerAlchemicalReactionChamber;
 import wayoftime.bloodmagic.tile.container.ContainerAlchemyTable;
 import wayoftime.bloodmagic.tile.container.ContainerSoulForge;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 public class BloodMagicBlocks
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java
index a7ca5890..70e010b6 100644
--- a/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java
+++ b/src/main/java/wayoftime/bloodmagic/common/data/GeneratorItemModels.java
@@ -11,7 +11,7 @@ import net.minecraftforge.fml.RegistryObject;
 import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
 import wayoftime.bloodmagic.common.item.BloodMagicItems;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 public class GeneratorItemModels extends ItemModelProvider
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java
index 9bb51c4a..cda7631a 100644
--- a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java
+++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/ARCRecipeBuilder.java
@@ -14,9 +14,9 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.fluids.FluidStack;
-import wayoftime.bloodmagic.api.SerializerHelper;
-import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient;
-import wayoftime.bloodmagic.api.recipe.RecipeARC;
+import wayoftime.bloodmagic.recipe.helper.SerializerHelper;
+import wayoftime.bloodmagic.recipe.helper.FluidStackIngredient;
+import wayoftime.bloodmagic.recipe.RecipeARC;
 import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeBuilder;
 import wayoftime.bloodmagic.util.Constants;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyArrayRecipeBuilder.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyArrayRecipeBuilder.java
index dd6fcdcf..429c8f58 100644
--- a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyArrayRecipeBuilder.java
+++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyArrayRecipeBuilder.java
@@ -7,7 +7,7 @@ import com.google.gson.JsonObject;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.util.ResourceLocation;
-import wayoftime.bloodmagic.api.SerializerHelper;
+import wayoftime.bloodmagic.recipe.helper.SerializerHelper;
 import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeBuilder;
 import wayoftime.bloodmagic.util.Constants;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyTableRecipeBuilder.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyTableRecipeBuilder.java
index d2a49e56..19384024 100644
--- a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyTableRecipeBuilder.java
+++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/AlchemyTableRecipeBuilder.java
@@ -12,8 +12,8 @@ import com.google.gson.JsonObject;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.util.ResourceLocation;
-import wayoftime.bloodmagic.api.SerializerHelper;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyTable;
+import wayoftime.bloodmagic.recipe.helper.SerializerHelper;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyTable;
 import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeBuilder;
 import wayoftime.bloodmagic.util.Constants;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/BloodAltarRecipeBuilder.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/BloodAltarRecipeBuilder.java
index 1b6ef6eb..9abb52ea 100644
--- a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/BloodAltarRecipeBuilder.java
+++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/BloodAltarRecipeBuilder.java
@@ -7,7 +7,7 @@ import com.google.gson.JsonObject;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.util.ResourceLocation;
-import wayoftime.bloodmagic.api.SerializerHelper;
+import wayoftime.bloodmagic.recipe.helper.SerializerHelper;
 import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeBuilder;
 import wayoftime.bloodmagic.util.Constants;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/TartaricForgeRecipeBuilder.java b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/TartaricForgeRecipeBuilder.java
index 25c88c51..2813fbeb 100644
--- a/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/TartaricForgeRecipeBuilder.java
+++ b/src/main/java/wayoftime/bloodmagic/common/data/recipe/builder/TartaricForgeRecipeBuilder.java
@@ -10,7 +10,7 @@ import com.google.gson.JsonObject;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.util.ResourceLocation;
-import wayoftime.bloodmagic.api.SerializerHelper;
+import wayoftime.bloodmagic.recipe.helper.SerializerHelper;
 import wayoftime.bloodmagic.common.data.recipe.BloodMagicRecipeBuilder;
 import wayoftime.bloodmagic.util.Constants;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java
index e21d8959..869fdb16 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/BloodMagicItems.java
@@ -30,10 +30,9 @@ import wayoftime.bloodmagic.common.item.soul.ItemSoulGem;
 import wayoftime.bloodmagic.common.item.soul.ItemSoulSnare;
 import wayoftime.bloodmagic.common.registration.impl.BloodOrbDeferredRegister;
 import wayoftime.bloodmagic.common.registration.impl.BloodOrbRegistryObject;
-import wayoftime.bloodmagic.orb.BloodOrb;
 import wayoftime.bloodmagic.ritual.EnumRuneType;
 import wayoftime.bloodmagic.structures.ItemDungeonTester;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 public class BloodMagicItems
 {
diff --git a/src/main/java/wayoftime/bloodmagic/orb/BloodOrb.java b/src/main/java/wayoftime/bloodmagic/common/item/BloodOrb.java
similarity index 84%
rename from src/main/java/wayoftime/bloodmagic/orb/BloodOrb.java
rename to src/main/java/wayoftime/bloodmagic/common/item/BloodOrb.java
index 753bd1f6..a0a88332 100644
--- a/src/main/java/wayoftime/bloodmagic/orb/BloodOrb.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/BloodOrb.java
@@ -1,12 +1,12 @@
-package wayoftime.bloodmagic.orb;
+package wayoftime.bloodmagic.common.item;
 
 import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.registries.ForgeRegistryEntry;
 
 /**
- * Refactoring of the original BloodOrb. BloodOrbs are no longer registered due
- * to The Flattening.
+ * Base Blood Orb class object for blood orbs
  */
-public class BloodOrb extends net.minecraftforge.registries.ForgeRegistryEntry<BloodOrb>
+public final class BloodOrb extends ForgeRegistryEntry<BloodOrb>
 {
 	private final ResourceLocation name;
 	private final int tier;
diff --git a/src/main/java/wayoftime/bloodmagic/api/item/IActivatable.java b/src/main/java/wayoftime/bloodmagic/common/item/IActivatable.java
similarity index 88%
rename from src/main/java/wayoftime/bloodmagic/api/item/IActivatable.java
rename to src/main/java/wayoftime/bloodmagic/common/item/IActivatable.java
index fa63a190..096e30b6 100644
--- a/src/main/java/wayoftime/bloodmagic/api/item/IActivatable.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/IActivatable.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.item;
+package wayoftime.bloodmagic.common.item;
 
 import javax.annotation.Nonnull;
 
@@ -7,7 +7,7 @@ import net.minecraft.nbt.CompoundNBT;
 import wayoftime.bloodmagic.util.Constants;
 
 /**
- * Interface for activatable items
+ * Interface for activatable Items
  */
 public interface IActivatable
 {
diff --git a/src/main/java/wayoftime/bloodmagic/api/item/IBindable.java b/src/main/java/wayoftime/bloodmagic/common/item/IBindable.java
similarity index 95%
rename from src/main/java/wayoftime/bloodmagic/api/item/IBindable.java
rename to src/main/java/wayoftime/bloodmagic/common/item/IBindable.java
index a9c1c3e9..95017ea7 100644
--- a/src/main/java/wayoftime/bloodmagic/api/item/IBindable.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/IBindable.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.item;
+package wayoftime.bloodmagic.common.item;
 
 import javax.annotation.Nullable;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/IBloodOrb.java b/src/main/java/wayoftime/bloodmagic/common/item/IBloodOrb.java
new file mode 100644
index 00000000..903467a1
--- /dev/null
+++ b/src/main/java/wayoftime/bloodmagic/common/item/IBloodOrb.java
@@ -0,0 +1,15 @@
+package wayoftime.bloodmagic.common.item;
+
+import javax.annotation.Nullable;
+
+import net.minecraft.item.ItemStack;
+
+/**
+ * Interface for any items that are Blood Orbs
+ * TODO: Should either merge this implementation with BloodOrb or clean it up idk
+ */
+public interface IBloodOrb
+{
+	@Nullable
+	BloodOrb getOrb(ItemStack stack);
+}
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java
index a6380e0a..430f5823 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemActivationCrystal.java
@@ -14,7 +14,6 @@ import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
 import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.core.data.Binding;
-import wayoftime.bloodmagic.api.item.IBindable;
 
 public class ItemActivationCrystal extends Item implements IBindable
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemBindableBase.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemBindableBase.java
index d6793ad9..9dd810c5 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/ItemBindableBase.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemBindableBase.java
@@ -12,7 +12,6 @@ import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
 import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.core.data.Binding;
-import wayoftime.bloodmagic.api.item.IBindable;
 
 public class ItemBindableBase extends Item implements IBindable
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemBloodOrb.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemBloodOrb.java
index 080417c2..08189f4a 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/ItemBloodOrb.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemBloodOrb.java
@@ -21,8 +21,6 @@ import net.minecraftforge.common.extensions.IForgeItem;
 import wayoftime.bloodmagic.core.data.Binding;
 import wayoftime.bloodmagic.core.data.SoulNetwork;
 import wayoftime.bloodmagic.core.data.SoulTicket;
-import wayoftime.bloodmagic.orb.BloodOrb;
-import wayoftime.bloodmagic.orb.IBloodOrb;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
 import wayoftime.bloodmagic.util.helper.PlayerHelper;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemDemonCrystal.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemDemonCrystal.java
index 3c9a72f3..8e36fe65 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/ItemDemonCrystal.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemDemonCrystal.java
@@ -3,8 +3,8 @@ package wayoftime.bloodmagic.common.item;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDiscreteDemonWill;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDiscreteDemonWill;
 
 public class ItemDemonCrystal extends Item implements IDiscreteDemonWill
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemDemonWillGauge.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemDemonWillGauge.java
index fcc54745..704c8ada 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/ItemDemonWillGauge.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemDemonWillGauge.java
@@ -13,7 +13,7 @@ import net.minecraft.world.World;
 import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.item.IDemonWillViewer;
+import wayoftime.bloodmagic.api.compat.IDemonWillViewer;
 import wayoftime.bloodmagic.util.handler.event.GenericHandler;
 
 public class ItemDemonWillGauge extends Item implements IDemonWillViewer
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java
index 3e20849f..13f2c0a9 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualDiviner.java
@@ -45,7 +45,7 @@ import wayoftime.bloodmagic.util.Utils;
 import wayoftime.bloodmagic.util.handler.event.ClientHandler;
 import wayoftime.bloodmagic.util.helper.RitualHelper;
 import wayoftime.bloodmagic.util.helper.TextHelper;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 public class ItemRitualDiviner extends Item
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualReader.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualReader.java
index 923b4ba8..bae5f453 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualReader.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemRitualReader.java
@@ -38,8 +38,8 @@ import wayoftime.bloodmagic.util.handler.event.ClientHandler;
 import wayoftime.bloodmagic.util.helper.NBTHelper;
 import wayoftime.bloodmagic.util.helper.TextHelper;
 import wayoftime.bloodmagic.will.DemonWillHolder;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDiscreteDemonWill;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDiscreteDemonWill;
 
 public class ItemRitualReader extends Item
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/ItemSigil.java b/src/main/java/wayoftime/bloodmagic/common/item/ItemSigil.java
index 1b0d5d35..f609305f 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/ItemSigil.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/ItemSigil.java
@@ -11,8 +11,7 @@ import net.minecraft.world.World;
 import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
 import wayoftime.bloodmagic.core.data.Binding;
-import wayoftime.bloodmagic.api.item.IBindable;
-import wayoftime.bloodmagic.api.item.ISigil;
+import wayoftime.bloodmagic.common.item.sigil.ISigil;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.NBTHelper;
 
diff --git a/src/main/java/wayoftime/bloodmagic/api/item/IARCTool.java b/src/main/java/wayoftime/bloodmagic/common/item/arc/IARCTool.java
similarity index 69%
rename from src/main/java/wayoftime/bloodmagic/api/item/IARCTool.java
rename to src/main/java/wayoftime/bloodmagic/common/item/arc/IARCTool.java
index 681d07ec..f4c094ba 100644
--- a/src/main/java/wayoftime/bloodmagic/api/item/IARCTool.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/arc/IARCTool.java
@@ -1,7 +1,10 @@
-package wayoftime.bloodmagic.api.item;
+package wayoftime.bloodmagic.common.item.arc;
 
 import net.minecraft.item.ItemStack;
 
+/**
+ * Interface for items that affect ARC operation
+ */
 public interface IARCTool
 {
 	default double getCraftingSpeedMultiplier(ItemStack stack)
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/arc/ItemARCToolBase.java b/src/main/java/wayoftime/bloodmagic/common/item/arc/ItemARCToolBase.java
index defbb762..96aeec6a 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/arc/ItemARCToolBase.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/arc/ItemARCToolBase.java
@@ -11,7 +11,6 @@ import net.minecraft.world.World;
 import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.item.IARCTool;
 import wayoftime.bloodmagic.util.ChatUtil;
 
 public class ItemARCToolBase extends Item implements IARCTool
diff --git a/src/main/java/wayoftime/bloodmagic/api/item/ISigil.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ISigil.java
similarity index 75%
rename from src/main/java/wayoftime/bloodmagic/api/item/ISigil.java
rename to src/main/java/wayoftime/bloodmagic/common/item/sigil/ISigil.java
index 8225fe06..b438154b 100644
--- a/src/main/java/wayoftime/bloodmagic/api/item/ISigil.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ISigil.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.item;
+package wayoftime.bloodmagic.common.item.sigil;
 
 import javax.annotation.Nonnull;
 
@@ -6,14 +6,12 @@ import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
-import wayoftime.bloodmagic.common.item.ItemSigil;
 
 /**
- * Used for all {@link ItemSigil} <b>EXCEPT</b> Sigils of Holdings.
+ * Used for all ItemSigils <b>EXCEPT</b> for Sigils of Holding.
  */
 public interface ISigil
 {
-
 	default boolean performArrayEffect(World world, BlockPos pos)
 	{
 		return false;
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilAir.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilAir.java
index 0105d0ba..3fca97f4 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilAir.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilAir.java
@@ -9,7 +9,6 @@ import net.minecraft.util.SoundEvents;
 import net.minecraft.util.math.vector.Vector3d;
 import net.minecraft.world.World;
 import wayoftime.bloodmagic.core.data.SoulTicket;
-import wayoftime.bloodmagic.api.item.ISigil;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
 import wayoftime.bloodmagic.util.helper.PlayerHelper;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBloodLight.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBloodLight.java
index 76730f9a..e7245bae 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBloodLight.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilBloodLight.java
@@ -14,7 +14,6 @@ import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
 import wayoftime.bloodmagic.core.data.SoulNetwork;
 import wayoftime.bloodmagic.core.data.SoulTicket;
 import wayoftime.bloodmagic.entity.projectile.EntityBloodLight;
-import wayoftime.bloodmagic.api.item.ISigil;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.NBTHelper;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java
index 2a32b311..98591287 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java
@@ -16,10 +16,9 @@ import net.minecraft.util.math.RayTraceResult;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.TranslationTextComponent;
 import net.minecraft.world.World;
-import wayoftime.bloodmagic.api.tile.IBloodAltar;
+import wayoftime.bloodmagic.altar.IBloodAltar;
 import wayoftime.bloodmagic.core.data.Binding;
-import wayoftime.bloodmagic.api.item.IAltarReader;
-import wayoftime.bloodmagic.api.item.ISigil;
+import wayoftime.bloodmagic.api.compat.IAltarReader;
 import wayoftime.bloodmagic.tile.TileIncenseAltar;
 import wayoftime.bloodmagic.util.ChatUtil;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
@@ -72,7 +71,7 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader
 					if (tile != null && tile instanceof IBloodAltar)
 					{
 						IBloodAltar altar = (IBloodAltar) tile;
-						int tier = altar.getTier().ordinal() + 1;
+						int tier = altar.getTier();
 						int currentEssence = altar.getCurrentBlood();
 						int capacity = altar.getCapacity();
 						altar.checkTier();
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilLava.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilLava.java
index 7f5b3bf2..7affee21 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilLava.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilLava.java
@@ -14,7 +14,6 @@ import net.minecraft.world.World;
 import net.minecraftforge.fluids.FluidStack;
 import net.minecraftforge.fluids.capability.IFluidHandler;
 import wayoftime.bloodmagic.core.data.SoulTicket;
-import wayoftime.bloodmagic.api.item.ISigil;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
 import wayoftime.bloodmagic.util.helper.PlayerHelper;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleable.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleable.java
index 501b461e..7d583316 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleable.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilToggleable.java
@@ -14,8 +14,7 @@ import net.minecraft.world.World;
 import wayoftime.bloodmagic.common.item.ItemSigil;
 import wayoftime.bloodmagic.core.data.Binding;
 import wayoftime.bloodmagic.core.data.SoulTicket;
-import wayoftime.bloodmagic.api.item.IActivatable;
-import wayoftime.bloodmagic.api.item.ISigil;
+import wayoftime.bloodmagic.common.item.IActivatable;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.NBTHelper;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilVoid.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilVoid.java
index 771f3315..ef7dace9 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilVoid.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilVoid.java
@@ -15,7 +15,6 @@ import net.minecraft.util.math.RayTraceResult;
 import net.minecraft.world.World;
 import net.minecraftforge.fluids.FluidStack;
 import wayoftime.bloodmagic.core.data.SoulTicket;
-import wayoftime.bloodmagic.api.item.ISigil;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
 import wayoftime.bloodmagic.util.helper.PlayerHelper;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilWater.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilWater.java
index 78dc4395..a3a9356a 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilWater.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilWater.java
@@ -16,7 +16,6 @@ import net.minecraft.world.World;
 import net.minecraftforge.fluids.FluidStack;
 import net.minecraftforge.fluids.capability.IFluidHandler;
 import wayoftime.bloodmagic.core.data.SoulTicket;
-import wayoftime.bloodmagic.api.item.ISigil;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
 import wayoftime.bloodmagic.util.helper.PlayerHelper;
 
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemMonsterSoul.java b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemMonsterSoul.java
index 8558b314..f49a47fe 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemMonsterSoul.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemMonsterSoul.java
@@ -17,8 +17,8 @@ import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.util.ChatUtil;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.NBTHelper;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDemonWill;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDemonWill;
 
 public class ItemMonsterSoul extends Item implements IDemonWill
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientAxe.java b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientAxe.java
index b371bbe8..6bf3c0c0 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientAxe.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientAxe.java
@@ -36,12 +36,12 @@ import net.minecraftforge.api.distmarker.OnlyIn;
 import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.common.item.BMItemTier;
 import wayoftime.bloodmagic.common.item.BloodMagicItems;
-import wayoftime.bloodmagic.api.item.IMultiWillTool;
+import wayoftime.bloodmagic.api.compat.IMultiWillTool;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.NBTHelper;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDemonWill;
-import wayoftime.bloodmagic.will.IDemonWillWeapon;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDemonWill;
+import wayoftime.bloodmagic.api.compat.IDemonWillWeapon;
 import wayoftime.bloodmagic.will.PlayerDemonWillHandler;
 
 public class ItemSentientAxe extends AxeItem implements IDemonWillWeapon, IMultiWillTool
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientPickaxe.java b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientPickaxe.java
index 125fb0ff..e7c96f3b 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientPickaxe.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientPickaxe.java
@@ -36,12 +36,12 @@ import net.minecraftforge.api.distmarker.OnlyIn;
 import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.common.item.BMItemTier;
 import wayoftime.bloodmagic.common.item.BloodMagicItems;
-import wayoftime.bloodmagic.api.item.IMultiWillTool;
+import wayoftime.bloodmagic.api.compat.IMultiWillTool;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.NBTHelper;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDemonWill;
-import wayoftime.bloodmagic.will.IDemonWillWeapon;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDemonWill;
+import wayoftime.bloodmagic.api.compat.IDemonWillWeapon;
 import wayoftime.bloodmagic.will.PlayerDemonWillHandler;
 
 public class ItemSentientPickaxe extends PickaxeItem implements IDemonWillWeapon, IMultiWillTool
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientShovel.java b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientShovel.java
index b7f00f64..d17ce52e 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientShovel.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientShovel.java
@@ -36,12 +36,12 @@ import net.minecraftforge.api.distmarker.OnlyIn;
 import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.common.item.BMItemTier;
 import wayoftime.bloodmagic.common.item.BloodMagicItems;
-import wayoftime.bloodmagic.api.item.IMultiWillTool;
+import wayoftime.bloodmagic.api.compat.IMultiWillTool;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.NBTHelper;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDemonWill;
-import wayoftime.bloodmagic.will.IDemonWillWeapon;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDemonWill;
+import wayoftime.bloodmagic.api.compat.IDemonWillWeapon;
 import wayoftime.bloodmagic.will.PlayerDemonWillHandler;
 
 public class ItemSentientShovel extends ShovelItem implements IDemonWillWeapon, IMultiWillTool
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java
index 41b27cf4..8e194b7f 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSentientSword.java
@@ -35,12 +35,12 @@ import net.minecraftforge.api.distmarker.OnlyIn;
 import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.common.item.BMItemTier;
 import wayoftime.bloodmagic.common.item.BloodMagicItems;
-import wayoftime.bloodmagic.api.item.IMultiWillTool;
+import wayoftime.bloodmagic.api.compat.IMultiWillTool;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.NBTHelper;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDemonWill;
-import wayoftime.bloodmagic.will.IDemonWillWeapon;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDemonWill;
+import wayoftime.bloodmagic.api.compat.IDemonWillWeapon;
 import wayoftime.bloodmagic.will.PlayerDemonWillHandler;
 
 public class ItemSentientSword extends SwordItem implements IDemonWillWeapon, IMultiWillTool
diff --git a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulGem.java b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulGem.java
index 56e78285..fc799373 100644
--- a/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulGem.java
+++ b/src/main/java/wayoftime/bloodmagic/common/item/soul/ItemSoulGem.java
@@ -20,13 +20,13 @@ import net.minecraft.world.World;
 import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.item.IMultiWillTool;
+import wayoftime.bloodmagic.api.compat.IMultiWillTool;
 import wayoftime.bloodmagic.util.ChatUtil;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.NBTHelper;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDemonWill;
-import wayoftime.bloodmagic.will.IDemonWillGem;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDemonWill;
+import wayoftime.bloodmagic.api.compat.IDemonWillGem;
 import wayoftime.bloodmagic.will.PlayerDemonWillHandler;
 
 public class ItemSoulGem extends Item implements IDemonWillGem, IMultiWillTool
diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java b/src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java
index 9cbe1048..1a7bbd1e 100644
--- a/src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java
+++ b/src/main/java/wayoftime/bloodmagic/common/recipe/ARCRecipeProvider.java
@@ -16,7 +16,7 @@ import net.minecraftforge.common.crafting.conditions.NotCondition;
 import net.minecraftforge.common.crafting.conditions.TagEmptyCondition;
 import net.minecraftforge.fluids.FluidStack;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient;
+import wayoftime.bloodmagic.recipe.helper.FluidStackIngredient;
 import wayoftime.bloodmagic.common.data.recipe.builder.ARCRecipeBuilder;
 import wayoftime.bloodmagic.common.item.BloodMagicItems;
 import wayoftime.bloodmagic.common.tags.BloodMagicTags;
diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java
index f176e79a..7c70c83f 100644
--- a/src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java
+++ b/src/main/java/wayoftime/bloodmagic/common/recipe/BloodMagicRecipeType.java
@@ -1,11 +1,11 @@
 package wayoftime.bloodmagic.common.recipe;
 
 import net.minecraft.item.crafting.IRecipeType;
-import wayoftime.bloodmagic.api.recipe.RecipeARC;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyArray;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyTable;
-import wayoftime.bloodmagic.api.recipe.RecipeBloodAltar;
-import wayoftime.bloodmagic.api.recipe.RecipeTartaricForge;
+import wayoftime.bloodmagic.recipe.RecipeARC;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyArray;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyTable;
+import wayoftime.bloodmagic.recipe.RecipeBloodAltar;
+import wayoftime.bloodmagic.recipe.RecipeTartaricForge;
 
 public class BloodMagicRecipeType
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java
index 9ce6ea5a..57869822 100644
--- a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java
+++ b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/ARCRecipeSerializer.java
@@ -21,9 +21,9 @@ import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.fluids.FluidStack;
 import net.minecraftforge.registries.ForgeRegistryEntry;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.SerializerHelper;
-import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient;
-import wayoftime.bloodmagic.api.recipe.RecipeARC;
+import wayoftime.bloodmagic.recipe.helper.SerializerHelper;
+import wayoftime.bloodmagic.recipe.helper.FluidStackIngredient;
+import wayoftime.bloodmagic.recipe.RecipeARC;
 import wayoftime.bloodmagic.util.Constants;
 
 public class ARCRecipeSerializer<RECIPE extends RecipeARC> extends ForgeRegistryEntry<IRecipeSerializer<?>>
diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyArrayRecipeSerializer.java b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyArrayRecipeSerializer.java
index 08e8ae0c..6ebf7753 100644
--- a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyArrayRecipeSerializer.java
+++ b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyArrayRecipeSerializer.java
@@ -12,8 +12,8 @@ import net.minecraft.network.PacketBuffer;
 import net.minecraft.util.JSONUtils;
 import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.registries.ForgeRegistryEntry;
-import wayoftime.bloodmagic.api.SerializerHelper;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyArray;
+import wayoftime.bloodmagic.recipe.helper.SerializerHelper;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyArray;
 import wayoftime.bloodmagic.util.Constants;
 
 public class AlchemyArrayRecipeSerializer<RECIPE extends RecipeAlchemyArray>
diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyTableRecipeSerializer.java b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyTableRecipeSerializer.java
index 34a42e0f..032c1837 100644
--- a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyTableRecipeSerializer.java
+++ b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/AlchemyTableRecipeSerializer.java
@@ -16,8 +16,8 @@ import net.minecraft.network.PacketBuffer;
 import net.minecraft.util.JSONUtils;
 import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.registries.ForgeRegistryEntry;
-import wayoftime.bloodmagic.api.SerializerHelper;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyTable;
+import wayoftime.bloodmagic.recipe.helper.SerializerHelper;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyTable;
 import wayoftime.bloodmagic.util.Constants;
 
 public class AlchemyTableRecipeSerializer<RECIPE extends RecipeAlchemyTable>
diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/BloodAltarRecipeSerializer.java b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/BloodAltarRecipeSerializer.java
index fd6e19fa..a50c1fbd 100644
--- a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/BloodAltarRecipeSerializer.java
+++ b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/BloodAltarRecipeSerializer.java
@@ -12,8 +12,8 @@ import net.minecraft.network.PacketBuffer;
 import net.minecraft.util.JSONUtils;
 import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.registries.ForgeRegistryEntry;
-import wayoftime.bloodmagic.api.SerializerHelper;
-import wayoftime.bloodmagic.api.recipe.RecipeBloodAltar;
+import wayoftime.bloodmagic.recipe.helper.SerializerHelper;
+import wayoftime.bloodmagic.recipe.RecipeBloodAltar;
 import wayoftime.bloodmagic.util.Constants;
 
 public class BloodAltarRecipeSerializer<RECIPE extends RecipeBloodAltar>
diff --git a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/TartaricForgeRecipeSerializer.java b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/TartaricForgeRecipeSerializer.java
index e6b460ce..18fadfb4 100644
--- a/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/TartaricForgeRecipeSerializer.java
+++ b/src/main/java/wayoftime/bloodmagic/common/recipe/serializer/TartaricForgeRecipeSerializer.java
@@ -15,8 +15,8 @@ import net.minecraft.network.PacketBuffer;
 import net.minecraft.util.JSONUtils;
 import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.registries.ForgeRegistryEntry;
-import wayoftime.bloodmagic.api.SerializerHelper;
-import wayoftime.bloodmagic.api.recipe.RecipeTartaricForge;
+import wayoftime.bloodmagic.recipe.helper.SerializerHelper;
+import wayoftime.bloodmagic.recipe.RecipeTartaricForge;
 import wayoftime.bloodmagic.util.Constants;
 
 public class TartaricForgeRecipeSerializer<RECIPE extends RecipeTartaricForge>
diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbDeferredRegister.java b/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbDeferredRegister.java
index cc54ca3b..0663347b 100644
--- a/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbDeferredRegister.java
+++ b/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbDeferredRegister.java
@@ -4,7 +4,7 @@ import java.util.function.Supplier;
 
 import net.minecraft.util.ResourceLocation;
 import wayoftime.bloodmagic.common.registration.WrappedDeferredRegister;
-import wayoftime.bloodmagic.orb.BloodOrb;
+import wayoftime.bloodmagic.common.item.BloodOrb;
 
 public class BloodOrbDeferredRegister extends WrappedDeferredRegister<BloodOrb>
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbRegistryObject.java b/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbRegistryObject.java
index f97d2347..e9818ea3 100644
--- a/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbRegistryObject.java
+++ b/src/main/java/wayoftime/bloodmagic/common/registration/impl/BloodOrbRegistryObject.java
@@ -2,7 +2,7 @@ package wayoftime.bloodmagic.common.registration.impl;
 
 import net.minecraftforge.fml.RegistryObject;
 import wayoftime.bloodmagic.common.registration.WrappedRegistryObject;
-import wayoftime.bloodmagic.orb.BloodOrb;
+import wayoftime.bloodmagic.common.item.BloodOrb;
 
 public class BloodOrbRegistryObject<ORB extends BloodOrb> extends WrappedRegistryObject<ORB>
 {
diff --git a/src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeRegistryObject.java b/src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeRegistryObject.java
index 13b1aa1c..e6e51ee2 100644
--- a/src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeRegistryObject.java
+++ b/src/main/java/wayoftime/bloodmagic/common/registration/impl/EntityTypeRegistryObject.java
@@ -5,7 +5,7 @@ import javax.annotation.Nonnull;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.EntityType;
 import net.minecraftforge.fml.RegistryObject;
-import wayoftime.bloodmagic.api.providers.IEntityTypeProvider;
+import wayoftime.bloodmagic.util.providers.IEntityTypeProvider;
 import wayoftime.bloodmagic.common.registration.WrappedRegistryObject;
 
 public class EntityTypeRegistryObject<ENTITY extends Entity> extends WrappedRegistryObject<EntityType<ENTITY>>
diff --git a/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java b/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java
index f191aef7..38a6012b 100644
--- a/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java
+++ b/src/main/java/wayoftime/bloodmagic/common/registries/BloodMagicRecipeSerializers.java
@@ -1,11 +1,11 @@
 package wayoftime.bloodmagic.common.registries;
 
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.recipe.RecipeARC;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyArray;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyTable;
-import wayoftime.bloodmagic.api.recipe.RecipeBloodAltar;
-import wayoftime.bloodmagic.api.recipe.RecipeTartaricForge;
+import wayoftime.bloodmagic.recipe.RecipeARC;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyArray;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyTable;
+import wayoftime.bloodmagic.recipe.RecipeBloodAltar;
+import wayoftime.bloodmagic.recipe.RecipeTartaricForge;
 import wayoftime.bloodmagic.common.recipe.serializer.ARCRecipeSerializer;
 import wayoftime.bloodmagic.common.recipe.serializer.AlchemyArrayRecipeSerializer;
 import wayoftime.bloodmagic.common.recipe.serializer.AlchemyTableRecipeSerializer;
@@ -13,11 +13,6 @@ import wayoftime.bloodmagic.common.recipe.serializer.BloodAltarRecipeSerializer;
 import wayoftime.bloodmagic.common.recipe.serializer.TartaricForgeRecipeSerializer;
 import wayoftime.bloodmagic.common.registration.impl.IRecipeSerializerDeferredRegister;
 import wayoftime.bloodmagic.common.registration.impl.IRecipeSerializerRegistryObject;
-import wayoftime.bloodmagic.recipe.IRecipeARC;
-import wayoftime.bloodmagic.recipe.IRecipeAlchemyArray;
-import wayoftime.bloodmagic.recipe.IRecipeAlchemyTable;
-import wayoftime.bloodmagic.recipe.IRecipeBloodAltar;
-import wayoftime.bloodmagic.recipe.IRecipeTartaricForge;
 
 public class BloodMagicRecipeSerializers
 {
@@ -28,11 +23,11 @@ public class BloodMagicRecipeSerializers
 
 	public static final IRecipeSerializerDeferredRegister RECIPE_SERIALIZERS = new IRecipeSerializerDeferredRegister(BloodMagic.MODID);
 
-	public static final IRecipeSerializerRegistryObject<RecipeBloodAltar> ALTAR = RECIPE_SERIALIZERS.register("altar", () -> new BloodAltarRecipeSerializer<>(IRecipeBloodAltar::new));
-	public static final IRecipeSerializerRegistryObject<RecipeAlchemyArray> ARRAY = RECIPE_SERIALIZERS.register("array", () -> new AlchemyArrayRecipeSerializer<>(IRecipeAlchemyArray::new));
-	public static final IRecipeSerializerRegistryObject<RecipeTartaricForge> TARTARIC = RECIPE_SERIALIZERS.register("soulforge", () -> new TartaricForgeRecipeSerializer<>(IRecipeTartaricForge::new));
-	public static final IRecipeSerializerRegistryObject<RecipeARC> ARC = RECIPE_SERIALIZERS.register("arc", () -> new ARCRecipeSerializer<>(IRecipeARC::new));
-	public static final IRecipeSerializerRegistryObject<RecipeAlchemyTable> ALCHEMYTABLE = RECIPE_SERIALIZERS.register("alchemytable", () -> new AlchemyTableRecipeSerializer<>(IRecipeAlchemyTable::new));
+	public static final IRecipeSerializerRegistryObject<RecipeBloodAltar> ALTAR = RECIPE_SERIALIZERS.register("altar", () -> new BloodAltarRecipeSerializer<>(RecipeBloodAltar::new));
+	public static final IRecipeSerializerRegistryObject<RecipeAlchemyArray> ARRAY = RECIPE_SERIALIZERS.register("array", () -> new AlchemyArrayRecipeSerializer<>(RecipeAlchemyArray::new));
+	public static final IRecipeSerializerRegistryObject<RecipeTartaricForge> TARTARIC = RECIPE_SERIALIZERS.register("soulforge", () -> new TartaricForgeRecipeSerializer<>(RecipeTartaricForge::new));
+	public static final IRecipeSerializerRegistryObject<RecipeARC> ARC = RECIPE_SERIALIZERS.register("arc", () -> new ARCRecipeSerializer<>(RecipeARC::new));
+	public static final IRecipeSerializerRegistryObject<RecipeAlchemyTable> ALCHEMYTABLE = RECIPE_SERIALIZERS.register("alchemytable", () -> new AlchemyTableRecipeSerializer<>(RecipeAlchemyTable::new));
 
 //	public static final DeferredRegister<IRecipeSerializer<?>> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, BloodMagic.MODID);
 
diff --git a/src/main/java/wayoftime/bloodmagic/compat/jei/alchemytable/AlchemyTableRecipeCategory.java b/src/main/java/wayoftime/bloodmagic/compat/jei/alchemytable/AlchemyTableRecipeCategory.java
index b11a400d..69454311 100644
--- a/src/main/java/wayoftime/bloodmagic/compat/jei/alchemytable/AlchemyTableRecipeCategory.java
+++ b/src/main/java/wayoftime/bloodmagic/compat/jei/alchemytable/AlchemyTableRecipeCategory.java
@@ -18,7 +18,7 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.util.ResourceLocation;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyTable;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyTable;
 import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
 import wayoftime.bloodmagic.core.registry.OrbRegistry;
 import wayoftime.bloodmagic.util.Constants;
diff --git a/src/main/java/wayoftime/bloodmagic/compat/jei/altar/BloodAltarRecipeCategory.java b/src/main/java/wayoftime/bloodmagic/compat/jei/altar/BloodAltarRecipeCategory.java
index c48573e7..72c72c3f 100644
--- a/src/main/java/wayoftime/bloodmagic/compat/jei/altar/BloodAltarRecipeCategory.java
+++ b/src/main/java/wayoftime/bloodmagic/compat/jei/altar/BloodAltarRecipeCategory.java
@@ -22,7 +22,7 @@ import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.TranslationTextComponent;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.recipe.RecipeBloodAltar;
+import wayoftime.bloodmagic.recipe.RecipeBloodAltar;
 import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
 import wayoftime.bloodmagic.util.ChatUtil;
 import wayoftime.bloodmagic.util.Constants;
@@ -119,7 +119,7 @@ public class BloodAltarRecipeCategory implements IRecipeCategory<RecipeBloodAlta
 	{
 		Minecraft mc = Minecraft.getInstance();
 		String[] infoString = new String[]
-		{ TextHelper.localize("jei.bloodmagic.recipe.requiredtier", NumeralHelper.toRoman(recipe.getMinimumTier().toInt())),
+		{ TextHelper.localize("jei.bloodmagic.recipe.requiredtier", NumeralHelper.toRoman(recipe.getMinimumTier() + 1)),
 				TextHelper.localize("jei.bloodmagic.recipe.requiredlp", recipe.getSyphon()) };
 		mc.fontRenderer.drawString(matrixStack, infoString[0], 90
 				- mc.fontRenderer.getStringWidth(infoString[0]) / 2, 0, Color.gray.getRGB());
diff --git a/src/main/java/wayoftime/bloodmagic/compat/jei/arc/ARCRecipeCategory.java b/src/main/java/wayoftime/bloodmagic/compat/jei/arc/ARCRecipeCategory.java
index 434155b0..668ebcb0 100644
--- a/src/main/java/wayoftime/bloodmagic/compat/jei/arc/ARCRecipeCategory.java
+++ b/src/main/java/wayoftime/bloodmagic/compat/jei/arc/ARCRecipeCategory.java
@@ -22,7 +22,7 @@ import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraftforge.fluids.FluidStack;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.recipe.RecipeARC;
+import wayoftime.bloodmagic.recipe.RecipeARC;
 import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.handler.event.ClientHandler;
diff --git a/src/main/java/wayoftime/bloodmagic/compat/jei/array/AlchemyArrayCraftingCategory.java b/src/main/java/wayoftime/bloodmagic/compat/jei/array/AlchemyArrayCraftingCategory.java
index 823eaef9..101b7e3b 100644
--- a/src/main/java/wayoftime/bloodmagic/compat/jei/array/AlchemyArrayCraftingCategory.java
+++ b/src/main/java/wayoftime/bloodmagic/compat/jei/array/AlchemyArrayCraftingCategory.java
@@ -13,7 +13,7 @@ import mezz.jei.api.recipe.category.IRecipeCategory;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.ResourceLocation;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyArray;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyArray;
 import wayoftime.bloodmagic.common.item.BloodMagicItems;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.TextHelper;
diff --git a/src/main/java/wayoftime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java b/src/main/java/wayoftime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java
index 1b1a4637..27061b92 100644
--- a/src/main/java/wayoftime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java
+++ b/src/main/java/wayoftime/bloodmagic/compat/jei/forge/TartaricForgeRecipeCategory.java
@@ -20,7 +20,7 @@ import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.TranslationTextComponent;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.recipe.RecipeTartaricForge;
+import wayoftime.bloodmagic.recipe.RecipeTartaricForge;
 import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
 import wayoftime.bloodmagic.common.item.BloodMagicItems;
 import wayoftime.bloodmagic.util.ChatUtil;
diff --git a/src/main/java/wayoftime/bloodmagic/core/data/SoulTicket.java b/src/main/java/wayoftime/bloodmagic/core/data/SoulTicket.java
index e3cc6325..fd20d500 100644
--- a/src/main/java/wayoftime/bloodmagic/core/data/SoulTicket.java
+++ b/src/main/java/wayoftime/bloodmagic/core/data/SoulTicket.java
@@ -8,9 +8,12 @@ import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.StringTextComponent;
 import net.minecraft.world.World;
 
+/**
+ * Wrapper for any interactions with the SoulNetwork
+ * Contains a description on what the interaction is and any extra data
+ */
 public class SoulTicket
 {
-
 	private static final ITextComponent EMPTY = new StringTextComponent("");
 
 	private final ITextComponent description;
diff --git a/src/main/java/wayoftime/bloodmagic/core/recipe/IngredientBloodOrb.java b/src/main/java/wayoftime/bloodmagic/core/recipe/IngredientBloodOrb.java
index ab607824..9e69b0f2 100644
--- a/src/main/java/wayoftime/bloodmagic/core/recipe/IngredientBloodOrb.java
+++ b/src/main/java/wayoftime/bloodmagic/core/recipe/IngredientBloodOrb.java
@@ -14,7 +14,7 @@ import net.minecraftforge.common.crafting.IIngredientSerializer;
 import net.minecraftforge.common.crafting.VanillaIngredientSerializer;
 import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.core.registry.OrbRegistry;
-import wayoftime.bloodmagic.orb.BloodOrb;
+import wayoftime.bloodmagic.common.item.BloodOrb;
 
 public class IngredientBloodOrb extends Ingredient
 {
diff --git a/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRegistry.java b/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRegistry.java
index 94f1fe27..3eb9c539 100644
--- a/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRegistry.java
+++ b/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRegistry.java
@@ -9,7 +9,7 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.util.ResourceLocation;
 import net.minecraft.world.World;
 import wayoftime.bloodmagic.impl.BloodMagicAPI;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyArray;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyArray;
 import wayoftime.bloodmagic.common.alchemyarray.AlchemyArrayEffect;
 import wayoftime.bloodmagic.common.alchemyarray.AlchemyArrayEffectCrafting;
 
diff --git a/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRendererRegistry.java b/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRendererRegistry.java
index bbebf4c9..e499be7d 100644
--- a/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRendererRegistry.java
+++ b/src/main/java/wayoftime/bloodmagic/core/registry/AlchemyArrayRendererRegistry.java
@@ -11,7 +11,7 @@ import net.minecraft.world.World;
 import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
 import wayoftime.bloodmagic.impl.BloodMagicAPI;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyArray;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyArray;
 import wayoftime.bloodmagic.client.render.alchemyarray.AlchemyArrayRenderer;
 
 public class AlchemyArrayRendererRegistry
diff --git a/src/main/java/wayoftime/bloodmagic/core/registry/OrbRegistry.java b/src/main/java/wayoftime/bloodmagic/core/registry/OrbRegistry.java
index ee76030b..9db6a683 100644
--- a/src/main/java/wayoftime/bloodmagic/core/registry/OrbRegistry.java
+++ b/src/main/java/wayoftime/bloodmagic/core/registry/OrbRegistry.java
@@ -10,7 +10,7 @@ import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraftforge.registries.ForgeRegistries;
 import wayoftime.bloodmagic.altar.AltarTier;
-import wayoftime.bloodmagic.orb.BloodOrb;
+import wayoftime.bloodmagic.common.item.BloodOrb;
 
 /**
  * This is only for those who wish to add a basic {@link BloodOrb}. If you need
diff --git a/src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java b/src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java
index dc17585b..eccb6748 100644
--- a/src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java
+++ b/src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java
@@ -12,7 +12,7 @@ import net.minecraft.world.chunk.Chunk;
 import net.minecraft.world.chunk.IChunk;
 import wayoftime.bloodmagic.util.BMLog;
 import wayoftime.bloodmagic.will.DemonWillHolder;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 public class WorldDemonWillHandler
 {
diff --git a/src/main/java/wayoftime/bloodmagic/event/ItemBindEvent.java b/src/main/java/wayoftime/bloodmagic/event/ItemBindEvent.java
index 03857aea..80e11c1c 100644
--- a/src/main/java/wayoftime/bloodmagic/event/ItemBindEvent.java
+++ b/src/main/java/wayoftime/bloodmagic/event/ItemBindEvent.java
@@ -4,7 +4,7 @@ import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.item.ItemStack;
 import net.minecraftforge.eventbus.api.Cancelable;
 import net.minecraftforge.eventbus.api.Event;
-import wayoftime.bloodmagic.api.item.IBindable;
+import wayoftime.bloodmagic.common.item.IBindable;
 
 @Cancelable
 public class ItemBindEvent extends Event
diff --git a/src/main/java/wayoftime/bloodmagic/gson/Serializers.java b/src/main/java/wayoftime/bloodmagic/gson/Serializers.java
index 41f6d28d..f5546799 100644
--- a/src/main/java/wayoftime/bloodmagic/gson/Serializers.java
+++ b/src/main/java/wayoftime/bloodmagic/gson/Serializers.java
@@ -18,7 +18,7 @@ import net.minecraft.network.datasync.IDataSerializer;
 import net.minecraft.util.Direction;
 import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.registries.ForgeRegistries;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 public class Serializers
 {
diff --git a/src/main/java/wayoftime/bloodmagic/impl/BloodMagicAPI.java b/src/main/java/wayoftime/bloodmagic/impl/BloodMagicAPI.java
index 2f0853ec..fe0d975a 100644
--- a/src/main/java/wayoftime/bloodmagic/impl/BloodMagicAPI.java
+++ b/src/main/java/wayoftime/bloodmagic/impl/BloodMagicAPI.java
@@ -1,6 +1,7 @@
 package wayoftime.bloodmagic.impl;
 
 import java.util.List;
+import java.util.function.Predicate;
 
 import javax.annotation.Nonnull;
 
@@ -8,9 +9,15 @@ import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Multimap;
 
 import net.minecraft.block.BlockState;
+import net.minecraft.entity.player.PlayerEntity;
 import wayoftime.bloodmagic.altar.ComponentType;
 import wayoftime.bloodmagic.api.IBloodMagicAPI;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.incense.EnumTranquilityType;
+import wayoftime.bloodmagic.incense.IncenseTranquilityRegistry;
+import wayoftime.bloodmagic.incense.TranquilityStack;
 import wayoftime.bloodmagic.util.BMLog;
+import wayoftime.bloodmagic.will.PlayerDemonWillHandler;
 
 public class BloodMagicAPI implements IBloodMagicAPI
 {
@@ -36,9 +43,8 @@ public class BloodMagicAPI implements IBloodMagicAPI
 //	{
 //		return blacklist;
 //	}
-//
+
 	@Nonnull
-	@Override
 	public BloodMagicRecipeRegistrar getRecipeRegistrar()
 	{
 		return recipeRegistrar;
@@ -55,15 +61,7 @@ public class BloodMagicAPI implements IBloodMagicAPI
 	@Override
 	public void registerAltarComponent(@Nonnull BlockState state, @Nonnull String componentType)
 	{
-		ComponentType component = null;
-		for (ComponentType type : ComponentType.VALUES)
-		{
-			if (type.name().equalsIgnoreCase(componentType))
-			{
-				component = type;
-				break;
-			}
-		}
+		ComponentType component = ComponentType.getType(componentType);
 
 		if (component != null)
 		{
@@ -76,15 +74,7 @@ public class BloodMagicAPI implements IBloodMagicAPI
 	@Override
 	public void unregisterAltarComponent(@Nonnull BlockState state, @Nonnull String componentType)
 	{
-		ComponentType component = null;
-		for (ComponentType type : ComponentType.VALUES)
-		{
-			if (type.name().equalsIgnoreCase(componentType))
-			{
-				component = type;
-				break;
-			}
-		}
+		ComponentType component = ComponentType.getType(componentType);
 
 		if (component != null)
 		{
@@ -94,6 +84,27 @@ public class BloodMagicAPI implements IBloodMagicAPI
 			BMLog.API.warn("Invalid Altar component type: {}.", componentType);
 	}
 
+	@Override
+	public void registerTranquilityHandler(@Nonnull Predicate<BlockState> blockState, @Nonnull String tranquilityType, double value)
+	{
+		EnumTranquilityType type = EnumTranquilityType.getType(tranquilityType);
+
+		if (type != null)
+		{
+			IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> blockState.test(state) ? new TranquilityStack(type, value) : null);
+		}
+		else
+		{
+			BMLog.API.warn("Invalid Tranquility type: {}.", tranquilityType);
+		}
+	}
+
+	@Override
+	public double getTotalDemonWill(String willType, PlayerEntity player)
+	{
+		return PlayerDemonWillHandler.getTotalDemonWill(EnumDemonWillType.getType(willType), player);
+	}
+
 	@Nonnull
 	public List<BlockState> getComponentStates(ComponentType component)
 	{
diff --git a/src/main/java/wayoftime/bloodmagic/impl/BloodMagicCorePlugin.java b/src/main/java/wayoftime/bloodmagic/impl/BloodMagicCorePlugin.java
index 84c796dd..040e82c3 100644
--- a/src/main/java/wayoftime/bloodmagic/impl/BloodMagicCorePlugin.java
+++ b/src/main/java/wayoftime/bloodmagic/impl/BloodMagicCorePlugin.java
@@ -1,11 +1,16 @@
 package wayoftime.bloodmagic.impl;
 
 import net.minecraft.block.Blocks;
+import net.minecraft.block.FireBlock;
+import net.minecraft.block.GrassBlock;
+import net.minecraft.block.LeavesBlock;
+import net.minecraft.tags.BlockTags;
 import wayoftime.bloodmagic.altar.ComponentType;
 import wayoftime.bloodmagic.api.IBloodMagicAPI;
 import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
 import wayoftime.bloodmagic.incense.EnumTranquilityType;
 import wayoftime.bloodmagic.incense.TranquilityStack;
+import wayoftime.bloodmagic.incense.IncenseTranquilityRegistry;
 
 public class BloodMagicCorePlugin
 {
@@ -28,6 +33,13 @@ public class BloodMagicCorePlugin
 		api.getValueManager().setTranquility(Blocks.NETHER_WART, new TranquilityStack(EnumTranquilityType.CROP, 1.0D));
 		api.getValueManager().setTranquility(Blocks.BEETROOTS, new TranquilityStack(EnumTranquilityType.CROP, 1.0D));
 
+		apiInterface.registerTranquilityHandler(state -> state.getBlock() instanceof LeavesBlock, EnumTranquilityType.PLANT.name(), 1.0D);
+		apiInterface.registerTranquilityHandler(state -> state.getBlock() instanceof FireBlock, EnumTranquilityType.FIRE.name(), 1.0D);
+		apiInterface.registerTranquilityHandler(state -> state.getBlock() instanceof GrassBlock, EnumTranquilityType.EARTHEN.name(), 0.5D);
+		apiInterface.registerTranquilityHandler(state -> BlockTags.LOGS.contains(state.getBlock()), EnumTranquilityType.TREE.name(), 1.0D);
+
+		IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> BloodMagicAPI.INSTANCE.getValueManager().getTranquility().get(state));
+
 		apiInterface.registerAltarComponent(Blocks.GLOWSTONE.getDefaultState(), ComponentType.GLOWSTONE.name());
 		apiInterface.registerAltarComponent(Blocks.SEA_LANTERN.getDefaultState(), ComponentType.GLOWSTONE.name());
 		apiInterface.registerAltarComponent(BloodMagicBlocks.BLOODSTONE.get().getDefaultState(), ComponentType.BLOODSTONE.name());
diff --git a/src/main/java/wayoftime/bloodmagic/impl/BloodMagicRecipeRegistrar.java b/src/main/java/wayoftime/bloodmagic/impl/BloodMagicRecipeRegistrar.java
index 28bc9b0a..3fc055e1 100644
--- a/src/main/java/wayoftime/bloodmagic/impl/BloodMagicRecipeRegistrar.java
+++ b/src/main/java/wayoftime/bloodmagic/impl/BloodMagicRecipeRegistrar.java
@@ -16,228 +16,15 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.world.World;
 import net.minecraftforge.fluids.FluidStack;
-import wayoftime.bloodmagic.api.IBloodMagicRecipeRegistrar;
-import wayoftime.bloodmagic.api.recipe.RecipeARC;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyArray;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyTable;
-import wayoftime.bloodmagic.api.recipe.RecipeBloodAltar;
-import wayoftime.bloodmagic.api.recipe.RecipeTartaricForge;
+import wayoftime.bloodmagic.recipe.RecipeARC;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyArray;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyTable;
+import wayoftime.bloodmagic.recipe.RecipeBloodAltar;
+import wayoftime.bloodmagic.recipe.RecipeTartaricForge;
 import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType;
 
-public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar
+public class BloodMagicRecipeRegistrar
 {
-
-//	private final Set<RecipeBloodAltar> altarRecipes;
-//	private final Set<RecipeAlchemyTable> alchemyRecipes;
-//	private final Set<RecipeTartaricForge> tartaricForgeRecipes;
-//	private final Set<RecipeAlchemyArray> alchemyArrayRecipes;
-//	private final Set<RecipeSacrificeCraft> sacrificeCraftRecipes;
-
-	public BloodMagicRecipeRegistrar()
-	{
-//		this.altarRecipes = Sets.newHashSet();
-//		this.alchemyRecipes = Sets.newHashSet();
-//		this.tartaricForgeRecipes = Sets.newHashSet();
-//		this.alchemyArrayRecipes = Sets.newHashSet();
-//		this.sacrificeCraftRecipes = Sets.newHashSet();
-	}
-
-//	@Override
-//	public void addBloodAltar(@Nonnull Ingredient input, @Nonnull ItemStack output, @Nonnegative int minimumTier,
-//			@Nonnegative int syphon, @Nonnegative int consumeRate, @Nonnegative int drainRate)
-//	{
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//		Preconditions.checkNotNull(output, "output cannot be null.");
-//		Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative.");
-//		Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative.");
-//		Preconditions.checkArgument(consumeRate >= 0, "consumeRate cannot be negative.");
-//		Preconditions.checkArgument(drainRate >= 0, "drainRate cannot be negative.");
-//
-//		// TODO: Got to adda ResourceLocation argument.
-//		altarRecipes.add(new IRecipeBloodAltar(null, input, output, minimumTier, syphon, consumeRate, drainRate));
-//	}
-//
-//	@Override
-//	public boolean removeBloodAltar(@Nonnull ItemStack input)
-//	{
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//
-//		return altarRecipes.remove(getBloodAltar(input));
-//	}
-
-//	@Override
-//	public void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks,
-//			@Nonnegative int minimumTier, @Nonnull Ingredient... input)
-//	{
-//		Preconditions.checkNotNull(output, "output cannot be null.");
-//		Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative.");
-//		Preconditions.checkArgument(ticks >= 0, "ticks cannot be negative.");
-//		Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative.");
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//
-//		NonNullList<Ingredient> inputs = NonNullList.from(Ingredient.EMPTY, input);
-//		alchemyRecipes.add(new RecipeAlchemyTable(inputs, output, syphon, ticks, minimumTier));
-//	}
-//
-//	public void addAlchemyTable(@Nonnull ItemStack output, @Nonnegative int syphon, @Nonnegative int ticks,
-//			@Nonnegative int minimumTier, @Nonnull Object... input)
-//	{
-//		Preconditions.checkNotNull(output, "output cannot be null.");
-//		Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative.");
-//		Preconditions.checkArgument(ticks >= 0, "ticks cannot be negative.");
-//		Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative.");
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//
-//		List<Ingredient> ingredients = Lists.newArrayList();
-//		for (Object object : input)
-//		{
-//			if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb)
-//			{
-//				ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object)));
-//				continue;
-//			}
-//
-//			ingredients.add(CraftingHelper.getIngredient(object));
-//		}
-//
-//		addAlchemyTable(output, syphon, ticks, minimumTier, ingredients.toArray(new Ingredient[0]));
-//	}
-//
-//	public void addAlchemyTable(RecipeAlchemyTable recipe)
-//	{
-//		alchemyRecipes.add(recipe);
-//	}
-//
-//	@Override
-//	public boolean removeAlchemyTable(@Nonnull ItemStack... input)
-//	{
-//		Preconditions.checkNotNull(input, "inputs cannot be null.");
-//
-//		for (ItemStack stack : input) Preconditions.checkNotNull(stack, "input cannot be null.");
-//
-//		return alchemyRecipes.remove(getAlchemyTable(Lists.newArrayList(input)));
-//	}
-//
-//	@Override
-//	public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls,
-//			@Nonnegative double soulDrain, @Nonnull Ingredient... input)
-//	{
-//		Preconditions.checkNotNull(output, "output cannot be null.");
-//		Preconditions.checkArgument(minimumSouls >= 0, "minimumSouls cannot be negative.");
-//		Preconditions.checkArgument(soulDrain >= 0, "soulDrain cannot be negative.");
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//
-//		NonNullList<Ingredient> inputs = NonNullList.from(Ingredient.EMPTY, input);
-//		tartaricForgeRecipes.add(new RecipeTartaricForge(inputs, output, minimumSouls, soulDrain));
-//	}
-//
-//	@Override
-//	public boolean removeTartaricForge(@Nonnull ItemStack... input)
-//	{
-//		Preconditions.checkNotNull(input, "inputs cannot be null.");
-//
-//		for (ItemStack stack : input) Preconditions.checkNotNull(stack, "input cannot be null.");
-//
-//		return tartaricForgeRecipes.remove(getTartaricForge(Lists.newArrayList(input)));
-//	}
-//
-//	public void addTartaricForge(@Nonnull ItemStack output, @Nonnegative double minimumSouls,
-//			@Nonnegative double soulDrain, @Nonnull Object... input)
-//	{
-//		Preconditions.checkNotNull(output, "output cannot be null.");
-//		Preconditions.checkArgument(minimumSouls >= 0, "minimumSouls cannot be negative.");
-//		Preconditions.checkArgument(soulDrain >= 0, "soulDrain cannot be negative.");
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//
-//		List<Ingredient> ingredients = Lists.newArrayList();
-//		for (Object object : input)
-//		{
-//			if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb)
-//			{
-//				ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object)));
-//				continue;
-//			}
-//
-//			ingredients.add(CraftingHelper.getIngredient(object));
-//		}
-//
-//		addTartaricForge(output, minimumSouls, soulDrain, ingredients.toArray(new Ingredient[0]));
-//	}
-//
-//	@Override
-//	public void addAlchemyArray(@Nonnull Ingredient input, @Nonnull Ingredient catalyst, @Nonnull ItemStack output,
-//			@Nullable ResourceLocation circleTexture)
-//	{
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//		Preconditions.checkNotNull(catalyst, "catalyst cannot be null.");
-//		Preconditions.checkNotNull(output, "output cannot be null.");
-//
-//		alchemyArrayRecipes.add(new RecipeAlchemyArray(input, catalyst, output, circleTexture));
-//	}
-//
-//	@Override
-//	public boolean removeAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst)
-//	{
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//		Preconditions.checkNotNull(catalyst, "catalyst cannot be null.");
-//
-//		return alchemyArrayRecipes.remove(getAlchemyArray(input, catalyst));
-//	}
-//
-//	public void addAlchemyArray(@Nonnull ItemStack input, @Nonnull ItemStack catalyst, @Nonnull ItemStack output,
-//			@Nullable ResourceLocation circleTexture)
-//	{
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//		Preconditions.checkNotNull(catalyst, "catalyst cannot be null.");
-//		Preconditions.checkNotNull(output, "output cannot be null.");
-//
-//		addAlchemyArray(Ingredient.fromStacks(input), Ingredient.fromStacks(catalyst), output, circleTexture);
-//	}
-//
-//	public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired,
-//			@Nonnull Object... input)
-//	{
-//		Preconditions.checkNotNull(output, "output cannot be null.");
-//		Preconditions.checkArgument(healthRequired >= 0, "healthRequired cannot be negative.");
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//
-//		List<Ingredient> ingredients = Lists.newArrayList();
-//		for (Object object : input)
-//		{
-//			if (object instanceof ItemStack && ((ItemStack) object).getItem() instanceof IBloodOrb)
-//			{
-//				ingredients.add(new IngredientBloodOrb(((IBloodOrb) ((ItemStack) object).getItem()).getOrb((ItemStack) object)));
-//				continue;
-//			}
-//
-//			ingredients.add(CraftingHelper.getIngredient(object));
-//		}
-//
-//		addSacrificeCraft(output, healthRequired, ingredients.toArray(new Ingredient[0]));
-//	}
-//
-//	@Override
-//	public boolean removeSacrificeCraft(@Nonnull ItemStack... input)
-//	{
-//		Preconditions.checkNotNull(input, "inputs cannot be null.");
-//
-//		for (ItemStack stack : input) Preconditions.checkNotNull(stack, "input cannot be null.");
-//
-//		return sacrificeCraftRecipes.remove(getSacrificeCraft(Lists.newArrayList(input)));
-//	}
-//
-//	@Override
-//	public void addSacrificeCraft(@Nonnull ItemStack output, @Nonnegative double healthRequired,
-//			@Nonnull Ingredient... input)
-//	{
-//		Preconditions.checkNotNull(output, "output cannot be null.");
-//		Preconditions.checkArgument(healthRequired >= 0, "healthRequired cannot be negative.");
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//
-//		NonNullList<Ingredient> inputs = NonNullList.from(Ingredient.EMPTY, input);
-//		sacrificeCraftRecipes.add(new RecipeSacrificeCraft(inputs, output, healthRequired));
-//	}
-
 	@Nullable
 	public RecipeBloodAltar getBloodAltar(World world, @Nonnull ItemStack input)
 	{
@@ -287,44 +74,6 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar
 		return null;
 	}
 
-//	@Nullable
-//	public RecipeAlchemyTable getAlchemyTable(@Nonnull List<ItemStack> input)
-//	{
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//		if (input.isEmpty())
-//			return null;
-//
-//		mainLoop: for (RecipeAlchemyTable recipe : alchemyRecipes)
-//		{
-//			if (recipe.getInput().size() != input.size())
-//				continue;
-//
-//			List<Ingredient> recipeInput = new ArrayList<>(recipe.getInput());
-//
-//			for (int i = 0; i < input.size(); i++)
-//			{
-//				boolean matched = false;
-//				for (int j = 0; j < recipeInput.size(); j++)
-//				{
-//					Ingredient ingredient = recipeInput.get(j);
-//					if (ingredient.apply(input.get(i)))
-//					{
-//						matched = true;
-//						recipeInput.remove(j);
-//						break;
-//					}
-//				}
-//
-//				if (!matched)
-//					continue mainLoop;
-//			}
-//
-//			return recipe;
-//		}
-//
-//		return null;
-//	}
-//
 	@Nullable
 	public RecipeAlchemyTable getAlchemyTable(World world, @Nonnull List<ItemStack> input)
 	{
@@ -403,45 +152,6 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar
 		return null;
 	}
 
-//
-//	@Nullable
-//	public RecipeSacrificeCraft getSacrificeCraft(@Nonnull List<ItemStack> input)
-//	{
-//		Preconditions.checkNotNull(input, "input cannot be null.");
-//		if (input.isEmpty())
-//			return null;
-//
-//		mainLoop: for (RecipeSacrificeCraft recipe : sacrificeCraftRecipes)
-//		{
-//			if (recipe.getInput().size() != input.size())
-//				continue;
-//
-//			List<Ingredient> recipeInput = new ArrayList<>(recipe.getInput());
-//
-//			for (int i = 0; i < input.size(); i++)
-//			{
-//				boolean matched = false;
-//				for (int j = 0; j < recipeInput.size(); j++)
-//				{
-//					Ingredient ingredient = recipeInput.get(j);
-//					if (ingredient.apply(input.get(i)))
-//					{
-//						matched = true;
-//						recipeInput.remove(j);
-//						break;
-//					}
-//				}
-//
-//				if (!matched)
-//					continue mainLoop;
-//			}
-//
-//			return recipe;
-//		}
-//
-//		return null;
-//	}
-//
 	/**
 	 * 
 	 * @param world
@@ -516,19 +226,4 @@ public class BloodMagicRecipeRegistrar implements IBloodMagicRecipeRegistrar
 
 		return copyRecipes;
 	}
-
-//	public Set<RecipeAlchemyTable> getAlchemyRecipes()
-//	{
-//		return ImmutableSet.copyOf(alchemyRecipes);
-//	}
-//
-//	public Set<RecipeTartaricForge> getTartaricForgeRecipes()
-//	{
-//		return ImmutableSet.copyOf(tartaricForgeRecipes);
-//	}
-//
-//	public Set<RecipeAlchemyArray> getAlchemyArrayRecipes()
-//	{
-//		return ImmutableSet.copyOf(alchemyArrayRecipes);
-//	}
 }
diff --git a/src/main/java/wayoftime/bloodmagic/incense/EnumTranquilityType.java b/src/main/java/wayoftime/bloodmagic/incense/EnumTranquilityType.java
index 0bdbe0ad..4c1dc495 100644
--- a/src/main/java/wayoftime/bloodmagic/incense/EnumTranquilityType.java
+++ b/src/main/java/wayoftime/bloodmagic/incense/EnumTranquilityType.java
@@ -9,4 +9,17 @@ public enum EnumTranquilityType
 	WATER(),
 	FIRE(),
 	LAVA(),;
+
+	public static EnumTranquilityType getType(String type)
+	{
+		for (EnumTranquilityType t : values())
+		{
+			if (t.name().equalsIgnoreCase(type))
+			{
+				return t;
+			}
+		}
+
+		return null;
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/incense/ITranquilityHandler.java b/src/main/java/wayoftime/bloodmagic/incense/ITranquilityHandler.java
index 557870e4..e0b8d7c0 100644
--- a/src/main/java/wayoftime/bloodmagic/incense/ITranquilityHandler.java
+++ b/src/main/java/wayoftime/bloodmagic/incense/ITranquilityHandler.java
@@ -5,6 +5,9 @@ import net.minecraft.block.BlockState;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 
+/**
+ * This is a functional interface to return the TranquilityStack of a certain Block type
+ */
 public interface ITranquilityHandler
 {
 	TranquilityStack getTranquilityOfBlock(World world, BlockPos pos, Block block, BlockState state);
diff --git a/src/main/java/wayoftime/bloodmagic/incense/TranquilityStack.java b/src/main/java/wayoftime/bloodmagic/incense/TranquilityStack.java
index 2d066476..470f7b81 100644
--- a/src/main/java/wayoftime/bloodmagic/incense/TranquilityStack.java
+++ b/src/main/java/wayoftime/bloodmagic/incense/TranquilityStack.java
@@ -1,5 +1,8 @@
 package wayoftime.bloodmagic.incense;
 
+/**
+ * Holds the tranquility type and value for valid tranquility modifiers
+ */
 public class TranquilityStack
 {
 	public final EnumTranquilityType type;
diff --git a/src/main/java/wayoftime/bloodmagic/network/DemonAuraClientPacket.java b/src/main/java/wayoftime/bloodmagic/network/DemonAuraClientPacket.java
index 829c80b7..a3d29b9e 100644
--- a/src/main/java/wayoftime/bloodmagic/network/DemonAuraClientPacket.java
+++ b/src/main/java/wayoftime/bloodmagic/network/DemonAuraClientPacket.java
@@ -8,7 +8,7 @@ import net.minecraftforge.api.distmarker.OnlyIn;
 import net.minecraftforge.fml.network.NetworkEvent.Context;
 import wayoftime.bloodmagic.util.handler.event.ClientHandler;
 import wayoftime.bloodmagic.will.DemonWillHolder;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 public class DemonAuraClientPacket
 {
diff --git a/src/main/java/wayoftime/bloodmagic/orb/IBloodOrb.java b/src/main/java/wayoftime/bloodmagic/orb/IBloodOrb.java
deleted file mode 100644
index ae3a637b..00000000
--- a/src/main/java/wayoftime/bloodmagic/orb/IBloodOrb.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package wayoftime.bloodmagic.orb;
-
-import javax.annotation.Nullable;
-
-import net.minecraft.item.ItemStack;
-
-public interface IBloodOrb
-{
-	@Nullable
-	BloodOrb getOrb(ItemStack stack);
-}
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/api/recipe/BloodMagicRecipe.java b/src/main/java/wayoftime/bloodmagic/recipe/BloodMagicRecipe.java
similarity index 92%
rename from src/main/java/wayoftime/bloodmagic/api/recipe/BloodMagicRecipe.java
rename to src/main/java/wayoftime/bloodmagic/recipe/BloodMagicRecipe.java
index 6ff4eaf9..06555bcd 100644
--- a/src/main/java/wayoftime/bloodmagic/api/recipe/BloodMagicRecipe.java
+++ b/src/main/java/wayoftime/bloodmagic/recipe/BloodMagicRecipe.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.recipe;
+package wayoftime.bloodmagic.recipe;
 
 import javax.annotation.Nonnull;
 
@@ -7,7 +7,7 @@ import net.minecraft.item.crafting.IRecipe;
 import net.minecraft.network.PacketBuffer;
 import net.minecraft.util.ResourceLocation;
 import net.minecraft.world.World;
-import wayoftime.bloodmagic.api.inventory.IgnoredIInventory;
+import wayoftime.bloodmagic.recipe.helper.IgnoredIInventory;
 
 public abstract class BloodMagicRecipe implements IRecipe<IgnoredIInventory>
 {
diff --git a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java
deleted file mode 100644
index fe41fe5e..00000000
--- a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeARC.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package wayoftime.bloodmagic.recipe;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.lang3.tuple.Pair;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.IRecipeSerializer;
-import net.minecraft.item.crafting.IRecipeType;
-import net.minecraft.item.crafting.Ingredient;
-import net.minecraft.util.ResourceLocation;
-import net.minecraftforge.fluids.FluidStack;
-import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient;
-import wayoftime.bloodmagic.api.recipe.RecipeARC;
-import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType;
-import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers;
-
-public class IRecipeARC extends RecipeARC
-{
-	public IRecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, FluidStack outputFluid, boolean consumeIngredient)
-	{
-		super(id, input, arc_tool, inputFluid, output, new ArrayList<Pair<ItemStack, Double>>(), outputFluid, consumeIngredient);
-	}
-
-	public IRecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, List<Pair<ItemStack, Double>> addedItems, FluidStack outputFluid, boolean consumeIngredient)
-	{
-		super(id, input, arc_tool, inputFluid, output, addedItems, outputFluid, consumeIngredient);
-	}
-
-	@Override
-	public IRecipeSerializer<RecipeARC> getSerializer()
-	{
-		return BloodMagicRecipeSerializers.ARC.getRecipeSerializer();
-	}
-
-	@Override
-	public IRecipeType<RecipeARC> getType()
-	{
-		return BloodMagicRecipeType.ARC;
-	}
-}
diff --git a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyArray.java b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyArray.java
deleted file mode 100644
index 8ad20f61..00000000
--- a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyArray.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package wayoftime.bloodmagic.recipe;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.IRecipeSerializer;
-import net.minecraft.item.crafting.IRecipeType;
-import net.minecraft.item.crafting.Ingredient;
-import net.minecraft.util.ResourceLocation;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyArray;
-import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType;
-import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers;
-
-public class IRecipeAlchemyArray extends RecipeAlchemyArray
-{
-	public IRecipeAlchemyArray(ResourceLocation id, ResourceLocation texture, Ingredient baseIngredient, Ingredient addedIngredient, ItemStack result)
-	{
-		super(id, texture, baseIngredient, addedIngredient, result);
-	}
-
-	@Override
-	public IRecipeSerializer<RecipeAlchemyArray> getSerializer()
-	{
-		return BloodMagicRecipeSerializers.ARRAY.getRecipeSerializer();
-	}
-
-	@Override
-	public IRecipeType<RecipeAlchemyArray> getType()
-	{
-		return BloodMagicRecipeType.ARRAY;
-	}
-}
diff --git a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyTable.java b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyTable.java
deleted file mode 100644
index 2f3c8561..00000000
--- a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeAlchemyTable.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package wayoftime.bloodmagic.recipe;
-
-import java.util.List;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.IRecipeSerializer;
-import net.minecraft.item.crafting.IRecipeType;
-import net.minecraft.item.crafting.Ingredient;
-import net.minecraft.util.ResourceLocation;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyTable;
-import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType;
-import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers;
-
-public class IRecipeAlchemyTable extends RecipeAlchemyTable
-{
-	public IRecipeAlchemyTable(ResourceLocation id, List<Ingredient> input, ItemStack output, int syphon, int ticks, int minimumTier)
-	{
-		super(id, input, output, syphon, ticks, minimumTier);
-	}
-
-	@Override
-	public IRecipeSerializer<RecipeAlchemyTable> getSerializer()
-	{
-		return BloodMagicRecipeSerializers.ALCHEMYTABLE.getRecipeSerializer();
-	}
-
-	@Override
-	public IRecipeType<RecipeAlchemyTable> getType()
-	{
-		return BloodMagicRecipeType.ALCHEMYTABLE;
-	}
-}
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeBloodAltar.java b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeBloodAltar.java
deleted file mode 100644
index 5516492b..00000000
--- a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeBloodAltar.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package wayoftime.bloodmagic.recipe;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.IRecipeSerializer;
-import net.minecraft.item.crafting.IRecipeType;
-import net.minecraft.item.crafting.Ingredient;
-import net.minecraft.util.ResourceLocation;
-import wayoftime.bloodmagic.api.recipe.RecipeBloodAltar;
-import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType;
-import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers;
-
-public class IRecipeBloodAltar extends RecipeBloodAltar
-{
-	public IRecipeBloodAltar(ResourceLocation id, Ingredient input, ItemStack output, int minimumTier, int syphon, int consumeRate, int drainRate)
-	{
-		super(id, input, output, minimumTier, syphon, consumeRate, drainRate);
-	}
-
-	@Override
-	public IRecipeSerializer<RecipeBloodAltar> getSerializer()
-	{
-		return BloodMagicRecipeSerializers.ALTAR.getRecipeSerializer();
-	}
-
-	@Override
-	public IRecipeType<RecipeBloodAltar> getType()
-	{
-		return BloodMagicRecipeType.ALTAR;
-	}
-}
diff --git a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeTartaricForge.java b/src/main/java/wayoftime/bloodmagic/recipe/IRecipeTartaricForge.java
deleted file mode 100644
index 9a27d688..00000000
--- a/src/main/java/wayoftime/bloodmagic/recipe/IRecipeTartaricForge.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package wayoftime.bloodmagic.recipe;
-
-import java.util.List;
-
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.crafting.IRecipeSerializer;
-import net.minecraft.item.crafting.IRecipeType;
-import net.minecraft.item.crafting.Ingredient;
-import net.minecraft.util.ResourceLocation;
-import wayoftime.bloodmagic.api.recipe.RecipeTartaricForge;
-import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType;
-import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers;
-
-public class IRecipeTartaricForge extends RecipeTartaricForge
-{
-	public IRecipeTartaricForge(ResourceLocation id, @Nonnull List<Ingredient> input, @Nonnull ItemStack output, @Nonnegative double minimumSouls, @Nonnegative double soulDrain)
-	{
-		super(id, input, output, minimumSouls, soulDrain);
-	}
-
-	@Override
-	public IRecipeSerializer<RecipeTartaricForge> getSerializer()
-	{
-		return BloodMagicRecipeSerializers.TARTARIC.getRecipeSerializer();
-	}
-
-	@Override
-	public IRecipeType<RecipeTartaricForge> getType()
-	{
-		return BloodMagicRecipeType.TARTARICFORGE;
-	}
-}
diff --git a/src/main/java/wayoftime/bloodmagic/api/recipe/RecipeARC.java b/src/main/java/wayoftime/bloodmagic/recipe/RecipeARC.java
similarity index 76%
rename from src/main/java/wayoftime/bloodmagic/api/recipe/RecipeARC.java
rename to src/main/java/wayoftime/bloodmagic/recipe/RecipeARC.java
index 80d9f289..702794eb 100644
--- a/src/main/java/wayoftime/bloodmagic/api/recipe/RecipeARC.java
+++ b/src/main/java/wayoftime/bloodmagic/recipe/RecipeARC.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.recipe;
+package wayoftime.bloodmagic.recipe;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -6,6 +6,8 @@ import java.util.Random;
 
 import javax.annotation.Nonnull;
 
+import net.minecraft.item.crafting.IRecipeSerializer;
+import net.minecraft.item.crafting.IRecipeType;
 import org.apache.commons.lang3.tuple.Pair;
 
 import net.minecraft.item.ItemStack;
@@ -14,9 +16,11 @@ import net.minecraft.network.PacketBuffer;
 import net.minecraft.util.NonNullList;
 import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.fluids.FluidStack;
-import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient;
+import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType;
+import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers;
+import wayoftime.bloodmagic.recipe.helper.FluidStackIngredient;
 
-public abstract class RecipeARC extends BloodMagicRecipe
+public class RecipeARC extends BloodMagicRecipe
 {
 	public static final int MAX_RANDOM_OUTPUTS = 3;
 
@@ -32,12 +36,12 @@ public abstract class RecipeARC extends BloodMagicRecipe
 
 	private final List<Pair<ItemStack, Double>> addedItems;
 
-	protected RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, FluidStack outputFluid, boolean consumeIngredient)
+	public RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, FluidStack outputFluid, boolean consumeIngredient)
 	{
 		this(id, input, arc_tool, inputFluid, output, new ArrayList<Pair<ItemStack, Double>>(), outputFluid, consumeIngredient);
 	}
 
-	protected RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, List<Pair<ItemStack, Double>> addedItems, FluidStack outputFluid, boolean consumeIngredient)
+	public RecipeARC(ResourceLocation id, Ingredient input, Ingredient arc_tool, FluidStackIngredient inputFluid, ItemStack output, List<Pair<ItemStack, Double>> addedItems, FluidStack outputFluid, boolean consumeIngredient)
 	{
 		super(id);
 		this.input = input;
@@ -163,4 +167,16 @@ public abstract class RecipeARC extends BloodMagicRecipe
 		}
 		buffer.writeBoolean(consumeIngredient);
 	}
+
+	@Override
+	public IRecipeSerializer<RecipeARC> getSerializer()
+	{
+		return BloodMagicRecipeSerializers.ARC.getRecipeSerializer();
+	}
+
+	@Override
+	public IRecipeType<RecipeARC> getType()
+	{
+		return BloodMagicRecipeType.ARC;
+	}
 }
diff --git a/src/main/java/wayoftime/bloodmagic/api/recipe/RecipeAlchemyArray.java b/src/main/java/wayoftime/bloodmagic/recipe/RecipeAlchemyArray.java
similarity index 66%
rename from src/main/java/wayoftime/bloodmagic/api/recipe/RecipeAlchemyArray.java
rename to src/main/java/wayoftime/bloodmagic/recipe/RecipeAlchemyArray.java
index 06dfab42..0c0a92a4 100644
--- a/src/main/java/wayoftime/bloodmagic/api/recipe/RecipeAlchemyArray.java
+++ b/src/main/java/wayoftime/bloodmagic/recipe/RecipeAlchemyArray.java
@@ -1,14 +1,18 @@
-package wayoftime.bloodmagic.api.recipe;
+package wayoftime.bloodmagic.recipe;
 
 import javax.annotation.Nonnull;
 
 import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.IRecipeSerializer;
+import net.minecraft.item.crafting.IRecipeType;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.network.PacketBuffer;
 import net.minecraft.util.NonNullList;
 import net.minecraft.util.ResourceLocation;
+import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType;
+import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers;
 
-public abstract class RecipeAlchemyArray extends BloodMagicRecipe
+public class RecipeAlchemyArray extends BloodMagicRecipe
 {
 	private final ResourceLocation id;
 	private final ResourceLocation texture;
@@ -19,7 +23,7 @@ public abstract class RecipeAlchemyArray extends BloodMagicRecipe
 	@Nonnull
 	private final ItemStack output;
 
-	protected RecipeAlchemyArray(ResourceLocation id, ResourceLocation texture, @Nonnull Ingredient baseIngredient, @Nonnull Ingredient addedIngredient, @Nonnull ItemStack result)
+	public RecipeAlchemyArray(ResourceLocation id, ResourceLocation texture, @Nonnull Ingredient baseIngredient, @Nonnull Ingredient addedIngredient, @Nonnull ItemStack result)
 	{
 		super(id);
 		this.id = id;
@@ -84,4 +88,16 @@ public abstract class RecipeAlchemyArray extends BloodMagicRecipe
 		addedInput.write(buffer);
 		buffer.writeItemStack(output);
 	}
+
+	@Override
+	public IRecipeSerializer<RecipeAlchemyArray> getSerializer()
+	{
+		return BloodMagicRecipeSerializers.ARRAY.getRecipeSerializer();
+	}
+
+	@Override
+	public IRecipeType<RecipeAlchemyArray> getType()
+	{
+		return BloodMagicRecipeType.ARRAY;
+	}
 }
diff --git a/src/main/java/wayoftime/bloodmagic/api/recipe/RecipeAlchemyTable.java b/src/main/java/wayoftime/bloodmagic/recipe/RecipeAlchemyTable.java
similarity index 75%
rename from src/main/java/wayoftime/bloodmagic/api/recipe/RecipeAlchemyTable.java
rename to src/main/java/wayoftime/bloodmagic/recipe/RecipeAlchemyTable.java
index 25346944..96306e2f 100644
--- a/src/main/java/wayoftime/bloodmagic/api/recipe/RecipeAlchemyTable.java
+++ b/src/main/java/wayoftime/bloodmagic/recipe/RecipeAlchemyTable.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.recipe;
+package wayoftime.bloodmagic.recipe;
 
 import java.util.List;
 
@@ -8,11 +8,15 @@ import javax.annotation.Nonnull;
 import com.google.common.base.Preconditions;
 
 import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.IRecipeSerializer;
+import net.minecraft.item.crafting.IRecipeType;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.network.PacketBuffer;
 import net.minecraft.util.ResourceLocation;
+import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType;
+import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers;
 
-public abstract class RecipeAlchemyTable extends BloodMagicRecipe
+public class RecipeAlchemyTable extends BloodMagicRecipe
 {
 	@Nonnull
 	private final List<Ingredient> input;
@@ -83,4 +87,16 @@ public abstract class RecipeAlchemyTable extends BloodMagicRecipe
 		buffer.writeInt(ticks);
 		buffer.writeInt(minimumTier);
 	}
+
+	@Override
+	public IRecipeSerializer<RecipeAlchemyTable> getSerializer()
+	{
+		return BloodMagicRecipeSerializers.ALCHEMYTABLE.getRecipeSerializer();
+	}
+
+	@Override
+	public IRecipeType<RecipeAlchemyTable> getType()
+	{
+		return BloodMagicRecipeType.ALCHEMYTABLE;
+	}
 }
diff --git a/src/main/java/wayoftime/bloodmagic/api/recipe/RecipeBloodAltar.java b/src/main/java/wayoftime/bloodmagic/recipe/RecipeBloodAltar.java
similarity index 72%
rename from src/main/java/wayoftime/bloodmagic/api/recipe/RecipeBloodAltar.java
rename to src/main/java/wayoftime/bloodmagic/recipe/RecipeBloodAltar.java
index c959c176..1633e130 100644
--- a/src/main/java/wayoftime/bloodmagic/api/recipe/RecipeBloodAltar.java
+++ b/src/main/java/wayoftime/bloodmagic/recipe/RecipeBloodAltar.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.recipe;
+package wayoftime.bloodmagic.recipe;
 
 import javax.annotation.Nonnegative;
 import javax.annotation.Nonnull;
@@ -6,20 +6,23 @@ import javax.annotation.Nonnull;
 import com.google.common.base.Preconditions;
 
 import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.IRecipeSerializer;
+import net.minecraft.item.crafting.IRecipeType;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.network.PacketBuffer;
 import net.minecraft.util.NonNullList;
 import net.minecraft.util.ResourceLocation;
-import wayoftime.bloodmagic.altar.AltarTier;
+import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType;
+import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers;
 
-public abstract class RecipeBloodAltar extends BloodMagicRecipe
+public class RecipeBloodAltar extends BloodMagicRecipe
 {
 	@Nonnull
 	private final Ingredient input;
 	@Nonnull
 	private final ItemStack output;
 	@Nonnull
-	private final AltarTier minimumTier;
+	private final int minimumTier;
 	@Nonnegative
 	private final int syphon;
 	@Nonnegative
@@ -33,14 +36,14 @@ public abstract class RecipeBloodAltar extends BloodMagicRecipe
 		Preconditions.checkNotNull(input, "input cannot be null.");
 		Preconditions.checkNotNull(output, "output cannot be null.");
 		Preconditions.checkArgument(minimumTier >= 0, "minimumTier cannot be negative.");
-		Preconditions.checkArgument(minimumTier <= AltarTier.MAXTIERS, "minimumTier cannot be higher than max tier");
+		Preconditions.checkArgument(minimumTier <= 6, "minimumTier cannot be higher than max tier");
 		Preconditions.checkArgument(syphon >= 0, "syphon cannot be negative.");
 		Preconditions.checkArgument(consumeRate >= 0, "consumeRate cannot be negative.");
 		Preconditions.checkArgument(drainRate >= 0, "drain cannot be negative.");
 
 		this.input = input;
 		this.output = output;
-		this.minimumTier = AltarTier.values()[minimumTier];
+		this.minimumTier = minimumTier;
 		this.syphon = syphon;
 		this.consumeRate = consumeRate;
 		this.drainRate = drainRate;
@@ -66,8 +69,7 @@ public abstract class RecipeBloodAltar extends BloodMagicRecipe
 		return output;
 	}
 
-	@Nonnull
-	public AltarTier getMinimumTier()
+	public int getMinimumTier()
 	{
 		return minimumTier;
 	}
@@ -95,9 +97,21 @@ public abstract class RecipeBloodAltar extends BloodMagicRecipe
 	{
 		input.write(buffer);
 		buffer.writeItemStack(output);
-		buffer.writeInt(minimumTier.ordinal());
+		buffer.writeInt(minimumTier);
 		buffer.writeInt(syphon);
 		buffer.writeInt(consumeRate);
 		buffer.writeInt(drainRate);
 	}
+
+	@Override
+	public IRecipeSerializer<RecipeBloodAltar> getSerializer()
+	{
+		return BloodMagicRecipeSerializers.ALTAR.getRecipeSerializer();
+	}
+
+	@Override
+	public IRecipeType<RecipeBloodAltar> getType()
+	{
+		return BloodMagicRecipeType.ALTAR;
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/api/recipe/RecipeTartaricForge.java b/src/main/java/wayoftime/bloodmagic/recipe/RecipeTartaricForge.java
similarity index 73%
rename from src/main/java/wayoftime/bloodmagic/api/recipe/RecipeTartaricForge.java
rename to src/main/java/wayoftime/bloodmagic/recipe/RecipeTartaricForge.java
index 8a1f53fb..6fb61f2b 100644
--- a/src/main/java/wayoftime/bloodmagic/api/recipe/RecipeTartaricForge.java
+++ b/src/main/java/wayoftime/bloodmagic/recipe/RecipeTartaricForge.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.recipe;
+package wayoftime.bloodmagic.recipe;
 
 import java.util.List;
 
@@ -8,11 +8,15 @@ import javax.annotation.Nonnull;
 import com.google.common.base.Preconditions;
 
 import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.IRecipeSerializer;
+import net.minecraft.item.crafting.IRecipeType;
 import net.minecraft.item.crafting.Ingredient;
 import net.minecraft.network.PacketBuffer;
 import net.minecraft.util.ResourceLocation;
+import wayoftime.bloodmagic.common.recipe.BloodMagicRecipeType;
+import wayoftime.bloodmagic.common.registries.BloodMagicRecipeSerializers;
 
-public abstract class RecipeTartaricForge extends BloodMagicRecipe
+public class RecipeTartaricForge extends BloodMagicRecipe
 {
 	@Nonnull
 	private final List<Ingredient> input;
@@ -72,6 +76,17 @@ public abstract class RecipeTartaricForge extends BloodMagicRecipe
 		buffer.writeItemStack(output);
 		buffer.writeDouble(minimumSouls);
 		buffer.writeDouble(soulDrain);
+	}
 
+	@Override
+	public IRecipeSerializer<RecipeTartaricForge> getSerializer()
+	{
+		return BloodMagicRecipeSerializers.TARTARIC.getRecipeSerializer();
+	}
+
+	@Override
+	public IRecipeType<RecipeTartaricForge> getType()
+	{
+		return BloodMagicRecipeType.TARTARICFORGE;
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/api/event/recipes/FluidStackIngredient.java b/src/main/java/wayoftime/bloodmagic/recipe/helper/FluidStackIngredient.java
similarity index 99%
rename from src/main/java/wayoftime/bloodmagic/api/event/recipes/FluidStackIngredient.java
rename to src/main/java/wayoftime/bloodmagic/recipe/helper/FluidStackIngredient.java
index cdcecea2..16bf4a28 100644
--- a/src/main/java/wayoftime/bloodmagic/api/event/recipes/FluidStackIngredient.java
+++ b/src/main/java/wayoftime/bloodmagic/recipe/helper/FluidStackIngredient.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.event.recipes;
+package wayoftime.bloodmagic.recipe.helper;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -23,7 +23,6 @@ import net.minecraft.tags.TagCollectionManager;
 import net.minecraft.util.JSONUtils;
 import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.fluids.FluidStack;
-import wayoftime.bloodmagic.api.SerializerHelper;
 import wayoftime.bloodmagic.util.Constants;
 
 /**
diff --git a/src/main/java/wayoftime/bloodmagic/api/inventory/IgnoredIInventory.java b/src/main/java/wayoftime/bloodmagic/recipe/helper/IgnoredIInventory.java
similarity index 95%
rename from src/main/java/wayoftime/bloodmagic/api/inventory/IgnoredIInventory.java
rename to src/main/java/wayoftime/bloodmagic/recipe/helper/IgnoredIInventory.java
index 757fa7a5..be062c29 100644
--- a/src/main/java/wayoftime/bloodmagic/api/inventory/IgnoredIInventory.java
+++ b/src/main/java/wayoftime/bloodmagic/recipe/helper/IgnoredIInventory.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.inventory;
+package wayoftime.bloodmagic.recipe.helper;
 
 import javax.annotation.Nonnull;
 
diff --git a/src/main/java/wayoftime/bloodmagic/api/event/recipes/InputIngredient.java b/src/main/java/wayoftime/bloodmagic/recipe/helper/InputIngredient.java
similarity index 96%
rename from src/main/java/wayoftime/bloodmagic/api/event/recipes/InputIngredient.java
rename to src/main/java/wayoftime/bloodmagic/recipe/helper/InputIngredient.java
index 9e7f8e52..366e712d 100644
--- a/src/main/java/wayoftime/bloodmagic/api/event/recipes/InputIngredient.java
+++ b/src/main/java/wayoftime/bloodmagic/recipe/helper/InputIngredient.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.event.recipes;
+package wayoftime.bloodmagic.recipe.helper;
 
 import java.util.List;
 import java.util.function.Predicate;
diff --git a/src/main/java/wayoftime/bloodmagic/api/SerializerHelper.java b/src/main/java/wayoftime/bloodmagic/recipe/helper/SerializerHelper.java
similarity index 98%
rename from src/main/java/wayoftime/bloodmagic/api/SerializerHelper.java
rename to src/main/java/wayoftime/bloodmagic/recipe/helper/SerializerHelper.java
index b61fec48..da325df7 100644
--- a/src/main/java/wayoftime/bloodmagic/api/SerializerHelper.java
+++ b/src/main/java/wayoftime/bloodmagic/recipe/helper/SerializerHelper.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api;
+package wayoftime.bloodmagic.recipe.helper;
 
 import javax.annotation.Nonnull;
 
diff --git a/src/main/java/wayoftime/bloodmagic/api/event/recipes/TagResolverHelper.java b/src/main/java/wayoftime/bloodmagic/recipe/helper/TagResolverHelper.java
similarity index 94%
rename from src/main/java/wayoftime/bloodmagic/api/event/recipes/TagResolverHelper.java
rename to src/main/java/wayoftime/bloodmagic/recipe/helper/TagResolverHelper.java
index e66237e5..02a5eaac 100644
--- a/src/main/java/wayoftime/bloodmagic/api/event/recipes/TagResolverHelper.java
+++ b/src/main/java/wayoftime/bloodmagic/recipe/helper/TagResolverHelper.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.event.recipes;
+package wayoftime.bloodmagic.recipe.helper;
 
 import java.util.Collections;
 import java.util.List;
diff --git a/src/main/java/wayoftime/bloodmagic/registry/ModTranquilityHandlers.java b/src/main/java/wayoftime/bloodmagic/registry/ModTranquilityHandlers.java
deleted file mode 100644
index e9083d33..00000000
--- a/src/main/java/wayoftime/bloodmagic/registry/ModTranquilityHandlers.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package wayoftime.bloodmagic.registry;
-
-import net.minecraft.block.FireBlock;
-import net.minecraft.block.GrassBlock;
-import net.minecraft.block.LeavesBlock;
-import net.minecraft.tags.BlockTags;
-import wayoftime.bloodmagic.impl.BloodMagicAPI;
-import wayoftime.bloodmagic.incense.EnumTranquilityType;
-import wayoftime.bloodmagic.incense.IncenseTranquilityRegistry;
-import wayoftime.bloodmagic.incense.TranquilityStack;
-
-public class ModTranquilityHandlers
-{
-
-	public static void init()
-	{
-		IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof LeavesBlock
-				? new TranquilityStack(EnumTranquilityType.PLANT, 1.0D)
-				: null);
-		IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof FireBlock
-				? new TranquilityStack(EnumTranquilityType.FIRE, 1.0D)
-				: null);
-		IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> block instanceof GrassBlock
-				? new TranquilityStack(EnumTranquilityType.EARTHEN, 0.5D)
-				: null);
-		IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> BlockTags.LOGS.contains(block)
-				? new TranquilityStack(EnumTranquilityType.TREE, 1.0D)
-				: null);
-		IncenseTranquilityRegistry.registerTranquilityHandler((world, pos, block, state) -> BloodMagicAPI.INSTANCE.getValueManager().getTranquility().get(state));
-	}
-}
diff --git a/src/main/java/wayoftime/bloodmagic/ritual/IMasterRitualStone.java b/src/main/java/wayoftime/bloodmagic/ritual/IMasterRitualStone.java
index e82e2deb..775e5642 100644
--- a/src/main/java/wayoftime/bloodmagic/ritual/IMasterRitualStone.java
+++ b/src/main/java/wayoftime/bloodmagic/ritual/IMasterRitualStone.java
@@ -11,7 +11,7 @@ import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 import wayoftime.bloodmagic.core.data.SoulNetwork;
 import wayoftime.bloodmagic.core.data.SoulTicket;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 /**
  * This interface is for internal implementation only.
diff --git a/src/main/java/wayoftime/bloodmagic/ritual/Ritual.java b/src/main/java/wayoftime/bloodmagic/ritual/Ritual.java
index 0ecd8c43..648e18e6 100644
--- a/src/main/java/wayoftime/bloodmagic/ritual/Ritual.java
+++ b/src/main/java/wayoftime/bloodmagic/ritual/Ritual.java
@@ -20,7 +20,7 @@ import net.minecraft.util.text.TranslationTextComponent;
 import net.minecraft.world.World;
 import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler;
 import wayoftime.bloodmagic.will.DemonWillHolder;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 /**
  * Abstract class for creating new rituals. Register your ritual by annotating
diff --git a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrushing.java b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrushing.java
index 87c264bf..92af0383 100644
--- a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrushing.java
+++ b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualCrushing.java
@@ -37,7 +37,7 @@ import wayoftime.bloodmagic.ritual.Ritual;
 import wayoftime.bloodmagic.ritual.RitualComponent;
 import wayoftime.bloodmagic.ritual.RitualRegister;
 import wayoftime.bloodmagic.util.Utils;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 @RitualRegister("crushing")
 public class RitualCrushing extends Ritual
diff --git a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualFeatheredKnife.java b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualFeatheredKnife.java
index db41851b..b2fd9885 100644
--- a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualFeatheredKnife.java
+++ b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualFeatheredKnife.java
@@ -13,7 +13,7 @@ import net.minecraft.util.text.TranslationTextComponent;
 import net.minecraft.world.World;
 import wayoftime.bloodmagic.BloodMagic;
 import wayoftime.bloodmagic.ConfigHandler;
-import wayoftime.bloodmagic.api.tile.IBloodAltar;
+import wayoftime.bloodmagic.altar.IBloodAltar;
 import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler;
 import wayoftime.bloodmagic.potion.BloodMagicPotions;
 import wayoftime.bloodmagic.ritual.AreaDescriptor;
@@ -23,7 +23,7 @@ import wayoftime.bloodmagic.ritual.Ritual;
 import wayoftime.bloodmagic.ritual.RitualComponent;
 import wayoftime.bloodmagic.ritual.RitualRegister;
 import wayoftime.bloodmagic.util.helper.PlayerSacrificeHelper;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 @RitualRegister("feathered_knife")
 public class RitualFeatheredKnife extends Ritual
diff --git a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualLava.java b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualLava.java
index 14e9acdb..2cbfba90 100644
--- a/src/main/java/wayoftime/bloodmagic/ritual/types/RitualLava.java
+++ b/src/main/java/wayoftime/bloodmagic/ritual/types/RitualLava.java
@@ -33,7 +33,7 @@ import wayoftime.bloodmagic.ritual.RitualRegister;
 import wayoftime.bloodmagic.util.DamageSourceBloodMagic;
 import wayoftime.bloodmagic.util.Utils;
 import wayoftime.bloodmagic.will.DemonWillHolder;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 @RitualRegister("lava")
 public class RitualLava extends Ritual
diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java
index bf38f795..2196d608 100644
--- a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java
+++ b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemicalReactionChamber.java
@@ -33,10 +33,10 @@ import net.minecraftforge.fluids.capability.templates.FluidTank;
 import net.minecraftforge.items.ItemHandlerHelper;
 import net.minecraftforge.registries.ObjectHolder;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.event.recipes.FluidStackIngredient;
+import wayoftime.bloodmagic.recipe.helper.FluidStackIngredient;
 import wayoftime.bloodmagic.impl.BloodMagicAPI;
-import wayoftime.bloodmagic.api.recipe.RecipeARC;
-import wayoftime.bloodmagic.api.item.IARCTool;
+import wayoftime.bloodmagic.recipe.RecipeARC;
+import wayoftime.bloodmagic.common.item.arc.IARCTool;
 import wayoftime.bloodmagic.common.item.inventory.InventoryWrapper;
 import wayoftime.bloodmagic.common.tags.BloodMagicTags;
 import wayoftime.bloodmagic.network.ARCTanksPacket;
diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemyTable.java b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemyTable.java
index 1c0d85dc..af52463b 100644
--- a/src/main/java/wayoftime/bloodmagic/tile/TileAlchemyTable.java
+++ b/src/main/java/wayoftime/bloodmagic/tile/TileAlchemyTable.java
@@ -27,13 +27,13 @@ import net.minecraftforge.items.ItemHandlerHelper;
 import net.minecraftforge.registries.ObjectHolder;
 import wayoftime.bloodmagic.api.event.BloodMagicCraftedEvent;
 import wayoftime.bloodmagic.impl.BloodMagicAPI;
-import wayoftime.bloodmagic.api.recipe.RecipeAlchemyTable;
+import wayoftime.bloodmagic.recipe.RecipeAlchemyTable;
 import wayoftime.bloodmagic.core.data.Binding;
 import wayoftime.bloodmagic.core.data.SoulNetwork;
 import wayoftime.bloodmagic.core.data.SoulTicket;
-import wayoftime.bloodmagic.api.item.IBindable;
-import wayoftime.bloodmagic.orb.BloodOrb;
-import wayoftime.bloodmagic.orb.IBloodOrb;
+import wayoftime.bloodmagic.common.item.IBindable;
+import wayoftime.bloodmagic.common.item.BloodOrb;
+import wayoftime.bloodmagic.common.item.IBloodOrb;
 import wayoftime.bloodmagic.tile.container.ContainerAlchemyTable;
 import wayoftime.bloodmagic.util.Constants;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileAltar.java b/src/main/java/wayoftime/bloodmagic/tile/TileAltar.java
index c35979b6..6f3c579d 100644
--- a/src/main/java/wayoftime/bloodmagic/tile/TileAltar.java
+++ b/src/main/java/wayoftime/bloodmagic/tile/TileAltar.java
@@ -14,7 +14,7 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
 import net.minecraftforge.registries.ObjectHolder;
 import wayoftime.bloodmagic.altar.AltarTier;
 import wayoftime.bloodmagic.altar.BloodAltar;
-import wayoftime.bloodmagic.api.tile.IBloodAltar;
+import wayoftime.bloodmagic.altar.IBloodAltar;
 
 public class TileAltar extends TileInventory implements IBloodAltar, ITickableTileEntity
 {
@@ -86,9 +86,9 @@ public class TileAltar extends TileInventory implements IBloodAltar, ITickableTi
 	}
 
 	@Override
-	public AltarTier getTier()
+	public int getTier()
 	{
-		return bloodAltar.getTier();
+		return bloodAltar.getTier().toInt();
 	}
 
 	@Override
diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrucible.java b/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrucible.java
index 1e55cc31..8e1cd973 100644
--- a/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrucible.java
+++ b/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrucible.java
@@ -11,10 +11,10 @@ import net.minecraft.tileentity.TileEntityType;
 import net.minecraft.util.Direction;
 import net.minecraftforge.registries.ObjectHolder;
 import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDemonWillConduit;
-import wayoftime.bloodmagic.will.IDemonWillGem;
-import wayoftime.bloodmagic.will.IDiscreteDemonWill;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDemonWillConduit;
+import wayoftime.bloodmagic.api.compat.IDemonWillGem;
+import wayoftime.bloodmagic.api.compat.IDiscreteDemonWill;
 
 public class TileDemonCrucible extends TileInventory implements ITickableTileEntity, IDemonWillConduit, ISidedInventory
 {
diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrystal.java b/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrystal.java
index d62fe823..241eed3e 100644
--- a/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrystal.java
+++ b/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrystal.java
@@ -11,7 +11,7 @@ import wayoftime.bloodmagic.common.block.BlockDemonCrystal;
 import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler;
 import wayoftime.bloodmagic.tile.base.TileTicking;
 import wayoftime.bloodmagic.will.DemonWillHolder;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 public class TileDemonCrystal extends TileTicking
 {
diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrystallizer.java b/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrystallizer.java
index b8cefb0d..96f91f52 100644
--- a/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrystallizer.java
+++ b/src/main/java/wayoftime/bloodmagic/tile/TileDemonCrystallizer.java
@@ -11,8 +11,8 @@ import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
 import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler;
 import wayoftime.bloodmagic.tile.base.TileTicking;
 import wayoftime.bloodmagic.will.DemonWillHolder;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDemonWillConduit;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDemonWillConduit;
 
 public class TileDemonCrystallizer extends TileTicking implements IDemonWillConduit
 {
diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileIncenseAltar.java b/src/main/java/wayoftime/bloodmagic/tile/TileIncenseAltar.java
index 6e8ed14e..e68eb31c 100644
--- a/src/main/java/wayoftime/bloodmagic/tile/TileIncenseAltar.java
+++ b/src/main/java/wayoftime/bloodmagic/tile/TileIncenseAltar.java
@@ -18,7 +18,7 @@ import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.server.ServerWorld;
 import net.minecraftforge.registries.ObjectHolder;
 import wayoftime.bloodmagic.incense.EnumTranquilityType;
-import wayoftime.bloodmagic.incense.IIncensePath;
+import wayoftime.bloodmagic.api.compat.IIncensePath;
 import wayoftime.bloodmagic.incense.IncenseAltarHandler;
 import wayoftime.bloodmagic.incense.IncenseTranquilityRegistry;
 import wayoftime.bloodmagic.incense.TranquilityStack;
diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileMasterRitualStone.java b/src/main/java/wayoftime/bloodmagic/tile/TileMasterRitualStone.java
index e4991dc0..dee9573e 100644
--- a/src/main/java/wayoftime/bloodmagic/tile/TileMasterRitualStone.java
+++ b/src/main/java/wayoftime/bloodmagic/tile/TileMasterRitualStone.java
@@ -27,7 +27,7 @@ import wayoftime.bloodmagic.core.data.Binding;
 import wayoftime.bloodmagic.core.data.SoulNetwork;
 import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler;
 import wayoftime.bloodmagic.event.RitualEvent;
-import wayoftime.bloodmagic.api.item.IBindable;
+import wayoftime.bloodmagic.common.item.IBindable;
 import wayoftime.bloodmagic.ritual.AreaDescriptor;
 import wayoftime.bloodmagic.ritual.EnumReaderBoundaries;
 import wayoftime.bloodmagic.ritual.IMasterRitualStone;
@@ -41,7 +41,7 @@ import wayoftime.bloodmagic.util.helper.NetworkHelper;
 import wayoftime.bloodmagic.util.helper.PlayerHelper;
 import wayoftime.bloodmagic.util.helper.RitualHelper;
 import wayoftime.bloodmagic.will.DemonWillHolder;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 public class TileMasterRitualStone extends TileTicking implements IMasterRitualStone
 {
diff --git a/src/main/java/wayoftime/bloodmagic/tile/TileSoulForge.java b/src/main/java/wayoftime/bloodmagic/tile/TileSoulForge.java
index 31ab172b..b812ad48 100644
--- a/src/main/java/wayoftime/bloodmagic/tile/TileSoulForge.java
+++ b/src/main/java/wayoftime/bloodmagic/tile/TileSoulForge.java
@@ -19,13 +19,13 @@ import net.minecraftforge.items.ItemHandlerHelper;
 import net.minecraftforge.registries.ObjectHolder;
 import wayoftime.bloodmagic.api.event.BloodMagicCraftedEvent;
 import wayoftime.bloodmagic.impl.BloodMagicAPI;
-import wayoftime.bloodmagic.api.recipe.RecipeTartaricForge;
+import wayoftime.bloodmagic.recipe.RecipeTartaricForge;
 import wayoftime.bloodmagic.tile.container.ContainerSoulForge;
 import wayoftime.bloodmagic.util.Constants;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDemonWill;
-import wayoftime.bloodmagic.will.IDemonWillConduit;
-import wayoftime.bloodmagic.will.IDemonWillGem;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDemonWill;
+import wayoftime.bloodmagic.api.compat.IDemonWillConduit;
+import wayoftime.bloodmagic.api.compat.IDemonWillGem;
 
 public class TileSoulForge extends TileInventory
 		implements ITickableTileEntity, INamedContainerProvider, IDemonWillConduit
diff --git a/src/main/java/wayoftime/bloodmagic/tile/container/ContainerAlchemyTable.java b/src/main/java/wayoftime/bloodmagic/tile/container/ContainerAlchemyTable.java
index 10afc977..c8fe9fa3 100644
--- a/src/main/java/wayoftime/bloodmagic/tile/container/ContainerAlchemyTable.java
+++ b/src/main/java/wayoftime/bloodmagic/tile/container/ContainerAlchemyTable.java
@@ -11,7 +11,7 @@ import net.minecraft.inventory.container.Slot;
 import net.minecraft.item.ItemStack;
 import net.minecraft.network.PacketBuffer;
 import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
-import wayoftime.bloodmagic.orb.IBloodOrb;
+import wayoftime.bloodmagic.common.item.IBloodOrb;
 import wayoftime.bloodmagic.tile.TileAlchemyTable;
 
 public class ContainerAlchemyTable extends Container
diff --git a/src/main/java/wayoftime/bloodmagic/tile/container/ContainerSoulForge.java b/src/main/java/wayoftime/bloodmagic/tile/container/ContainerSoulForge.java
index 0deaed05..9dd10330 100644
--- a/src/main/java/wayoftime/bloodmagic/tile/container/ContainerSoulForge.java
+++ b/src/main/java/wayoftime/bloodmagic/tile/container/ContainerSoulForge.java
@@ -13,8 +13,8 @@ import net.minecraft.util.IIntArray;
 import net.minecraft.util.IntArray;
 import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
 import wayoftime.bloodmagic.tile.TileSoulForge;
-import wayoftime.bloodmagic.will.IDemonWill;
-import wayoftime.bloodmagic.will.IDemonWillGem;
+import wayoftime.bloodmagic.api.compat.IDemonWill;
+import wayoftime.bloodmagic.api.compat.IDemonWillGem;
 
 public class ContainerSoulForge extends Container
 {
diff --git a/src/main/java/wayoftime/bloodmagic/util/Utils.java b/src/main/java/wayoftime/bloodmagic/util/Utils.java
index 753c7a29..799470f4 100644
--- a/src/main/java/wayoftime/bloodmagic/util/Utils.java
+++ b/src/main/java/wayoftime/bloodmagic/util/Utils.java
@@ -29,7 +29,7 @@ import net.minecraftforge.items.CapabilityItemHandler;
 import net.minecraftforge.items.IItemHandler;
 import net.minecraftforge.items.ItemHandlerHelper;
 import net.minecraftforge.items.wrapper.PlayerMainInvWrapper;
-import wayoftime.bloodmagic.api.item.IDemonWillViewer;
+import wayoftime.bloodmagic.api.compat.IDemonWillViewer;
 import wayoftime.bloodmagic.tile.TileInventory;
 
 public class Utils
diff --git a/src/main/java/wayoftime/bloodmagic/util/handler/event/GenericHandler.java b/src/main/java/wayoftime/bloodmagic/util/handler/event/GenericHandler.java
index f07871bd..2d4ed58e 100644
--- a/src/main/java/wayoftime/bloodmagic/util/handler/event/GenericHandler.java
+++ b/src/main/java/wayoftime/bloodmagic/util/handler/event/GenericHandler.java
@@ -19,16 +19,16 @@ import net.minecraftforge.eventbus.api.EventPriority;
 import net.minecraftforge.eventbus.api.SubscribeEvent;
 import net.minecraftforge.fml.common.Mod;
 import wayoftime.bloodmagic.BloodMagic;
-import wayoftime.bloodmagic.api.item.IBindable;
 import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
 import wayoftime.bloodmagic.common.item.ItemExperienceBook;
 import wayoftime.bloodmagic.core.data.Binding;
 import wayoftime.bloodmagic.core.data.SoulNetwork;
 import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler;
 import wayoftime.bloodmagic.event.ItemBindEvent;
+import wayoftime.bloodmagic.common.item.IBindable;
 import wayoftime.bloodmagic.network.DemonAuraClientPacket;
-import wayoftime.bloodmagic.orb.BloodOrb;
-import wayoftime.bloodmagic.orb.IBloodOrb;
+import wayoftime.bloodmagic.common.item.BloodOrb;
+import wayoftime.bloodmagic.common.item.IBloodOrb;
 import wayoftime.bloodmagic.util.helper.BindableHelper;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
 import wayoftime.bloodmagic.util.helper.PlayerHelper;
diff --git a/src/main/java/wayoftime/bloodmagic/util/handler/event/WillHandler.java b/src/main/java/wayoftime/bloodmagic/util/handler/event/WillHandler.java
index 60e26970..1474aa41 100644
--- a/src/main/java/wayoftime/bloodmagic/util/handler/event/WillHandler.java
+++ b/src/main/java/wayoftime/bloodmagic/util/handler/event/WillHandler.java
@@ -36,9 +36,9 @@ import wayoftime.bloodmagic.demonaura.WillChunk;
 import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler;
 import wayoftime.bloodmagic.potion.BloodMagicPotions;
 import wayoftime.bloodmagic.will.DemonWillHolder;
-import wayoftime.bloodmagic.will.EnumDemonWillType;
-import wayoftime.bloodmagic.will.IDemonWill;
-import wayoftime.bloodmagic.will.IDemonWillWeapon;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDemonWill;
+import wayoftime.bloodmagic.api.compat.IDemonWillWeapon;
 import wayoftime.bloodmagic.will.PlayerDemonWillHandler;
 
 @Mod.EventBusSubscriber(modid = BloodMagic.MODID, bus = Mod.EventBusSubscriber.Bus.MOD)
diff --git a/src/main/java/wayoftime/bloodmagic/util/helper/NetworkHelper.java b/src/main/java/wayoftime/bloodmagic/util/helper/NetworkHelper.java
index debf1d4f..0dc98add 100644
--- a/src/main/java/wayoftime/bloodmagic/util/helper/NetworkHelper.java
+++ b/src/main/java/wayoftime/bloodmagic/util/helper/NetworkHelper.java
@@ -9,15 +9,15 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.world.storage.DimensionSavedDataManager;
 import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.fml.server.ServerLifecycleHooks;
-import wayoftime.bloodmagic.api.item.IBindable;
 import wayoftime.bloodmagic.core.data.BMWorldSavedData;
 import wayoftime.bloodmagic.core.data.Binding;
 import wayoftime.bloodmagic.core.data.SoulNetwork;
 import wayoftime.bloodmagic.core.data.SoulTicket;
 import wayoftime.bloodmagic.core.registry.OrbRegistry;
 import wayoftime.bloodmagic.event.SoulNetworkEvent;
-import wayoftime.bloodmagic.orb.BloodOrb;
-import wayoftime.bloodmagic.orb.IBloodOrb;
+import wayoftime.bloodmagic.common.item.IBindable;
+import wayoftime.bloodmagic.common.item.BloodOrb;
+import wayoftime.bloodmagic.common.item.IBloodOrb;
 
 public class NetworkHelper
 {
diff --git a/src/main/java/wayoftime/bloodmagic/util/helper/PlayerSacrificeHelper.java b/src/main/java/wayoftime/bloodmagic/util/helper/PlayerSacrificeHelper.java
index aea347e2..0f247bbc 100644
--- a/src/main/java/wayoftime/bloodmagic/util/helper/PlayerSacrificeHelper.java
+++ b/src/main/java/wayoftime/bloodmagic/util/helper/PlayerSacrificeHelper.java
@@ -8,7 +8,7 @@ import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 import net.minecraftforge.common.MinecraftForge;
 import wayoftime.bloodmagic.ConfigHandler;
-import wayoftime.bloodmagic.api.tile.IBloodAltar;
+import wayoftime.bloodmagic.altar.IBloodAltar;
 import wayoftime.bloodmagic.event.SacrificeKnifeUsedEvent;
 
 public class PlayerSacrificeHelper
diff --git a/src/main/java/wayoftime/bloodmagic/api/providers/IBaseProvider.java b/src/main/java/wayoftime/bloodmagic/util/providers/IBaseProvider.java
similarity index 74%
rename from src/main/java/wayoftime/bloodmagic/api/providers/IBaseProvider.java
rename to src/main/java/wayoftime/bloodmagic/util/providers/IBaseProvider.java
index e59271db..af0a7f94 100644
--- a/src/main/java/wayoftime/bloodmagic/api/providers/IBaseProvider.java
+++ b/src/main/java/wayoftime/bloodmagic/util/providers/IBaseProvider.java
@@ -1,10 +1,10 @@
-package wayoftime.bloodmagic.api.providers;
+package wayoftime.bloodmagic.util.providers;
 
 import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.TranslationTextComponent;
-import wayoftime.bloodmagic.api.text.IHasTextComponent;
-import wayoftime.bloodmagic.api.text.IHasTranslationKey;
+import wayoftime.bloodmagic.util.text.IHasTextComponent;
+import wayoftime.bloodmagic.util.text.IHasTranslationKey;
 
 public interface IBaseProvider extends IHasTextComponent, IHasTranslationKey
 {
diff --git a/src/main/java/wayoftime/bloodmagic/api/providers/IEntityTypeProvider.java b/src/main/java/wayoftime/bloodmagic/util/providers/IEntityTypeProvider.java
similarity index 92%
rename from src/main/java/wayoftime/bloodmagic/api/providers/IEntityTypeProvider.java
rename to src/main/java/wayoftime/bloodmagic/util/providers/IEntityTypeProvider.java
index db92683c..07785354 100644
--- a/src/main/java/wayoftime/bloodmagic/api/providers/IEntityTypeProvider.java
+++ b/src/main/java/wayoftime/bloodmagic/util/providers/IEntityTypeProvider.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.providers;
+package wayoftime.bloodmagic.util.providers;
 
 import javax.annotation.Nonnull;
 
diff --git a/src/main/java/wayoftime/bloodmagic/api/text/IHasTextComponent.java b/src/main/java/wayoftime/bloodmagic/util/text/IHasTextComponent.java
similarity index 75%
rename from src/main/java/wayoftime/bloodmagic/api/text/IHasTextComponent.java
rename to src/main/java/wayoftime/bloodmagic/util/text/IHasTextComponent.java
index d0b25951..9f77ad56 100644
--- a/src/main/java/wayoftime/bloodmagic/api/text/IHasTextComponent.java
+++ b/src/main/java/wayoftime/bloodmagic/util/text/IHasTextComponent.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.text;
+package wayoftime.bloodmagic.util.text;
 
 import net.minecraft.util.text.ITextComponent;
 
diff --git a/src/main/java/wayoftime/bloodmagic/api/text/IHasTranslationKey.java b/src/main/java/wayoftime/bloodmagic/util/text/IHasTranslationKey.java
similarity index 63%
rename from src/main/java/wayoftime/bloodmagic/api/text/IHasTranslationKey.java
rename to src/main/java/wayoftime/bloodmagic/util/text/IHasTranslationKey.java
index 63be3d74..b23d79b6 100644
--- a/src/main/java/wayoftime/bloodmagic/api/text/IHasTranslationKey.java
+++ b/src/main/java/wayoftime/bloodmagic/util/text/IHasTranslationKey.java
@@ -1,4 +1,4 @@
-package wayoftime.bloodmagic.api.text;
+package wayoftime.bloodmagic.util.text;
 
 public interface IHasTranslationKey
 {
diff --git a/src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java b/src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java
index 21997641..aa122e23 100644
--- a/src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java
+++ b/src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java
@@ -4,6 +4,7 @@ import java.util.HashMap;
 import java.util.Map.Entry;
 
 import net.minecraft.nbt.CompoundNBT;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
 
 public class DemonWillHolder
 {
diff --git a/src/main/java/wayoftime/bloodmagic/will/EnumDemonWillType.java b/src/main/java/wayoftime/bloodmagic/will/EnumDemonWillType.java
deleted file mode 100644
index ed237683..00000000
--- a/src/main/java/wayoftime/bloodmagic/will/EnumDemonWillType.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package wayoftime.bloodmagic.will;
-
-import java.util.Locale;
-
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.IStringSerializable;
-import wayoftime.bloodmagic.common.item.BloodMagicItems;
-
-public enum EnumDemonWillType implements IStringSerializable
-{
-	DEFAULT("default"),
-	CORROSIVE("corrosive"),
-	DESTRUCTIVE("destructive"),
-	VENGEFUL("vengeful"),
-	STEADFAST("steadfast");
-
-	public final String name;
-
-	EnumDemonWillType(String name)
-	{
-		this.name = name;
-	}
-
-	@Override
-	public String toString()
-	{
-		return name().toLowerCase(Locale.ENGLISH);
-	}
-
-	@Override
-	public String getString()
-	{
-		return this.toString();
-	}
-
-	public ItemStack getStack()
-	{
-		switch (this)
-		{
-		case CORROSIVE:
-			return new ItemStack(BloodMagicItems.CORROSIVE_CRYSTAL.get());
-		case DEFAULT:
-			return new ItemStack(BloodMagicItems.RAW_CRYSTAL.get());
-		case DESTRUCTIVE:
-			return new ItemStack(BloodMagicItems.DESTRUCTIVE_CRYSTAL.get());
-		case STEADFAST:
-			return new ItemStack(BloodMagicItems.STEADFAST_CRYSTAL.get());
-		case VENGEFUL:
-			return new ItemStack(BloodMagicItems.VENGEFUL_CRYSTAL.get());
-		default:
-			return ItemStack.EMPTY;
-		}
-	}
-}
\ No newline at end of file
diff --git a/src/main/java/wayoftime/bloodmagic/will/PlayerDemonWillHandler.java b/src/main/java/wayoftime/bloodmagic/will/PlayerDemonWillHandler.java
index 1576c5e2..3a9de35a 100644
--- a/src/main/java/wayoftime/bloodmagic/will/PlayerDemonWillHandler.java
+++ b/src/main/java/wayoftime/bloodmagic/will/PlayerDemonWillHandler.java
@@ -3,6 +3,9 @@ package wayoftime.bloodmagic.will;
 import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.NonNullList;
+import wayoftime.bloodmagic.api.compat.EnumDemonWillType;
+import wayoftime.bloodmagic.api.compat.IDemonWill;
+import wayoftime.bloodmagic.api.compat.IDemonWillGem;
 import wayoftime.bloodmagic.util.helper.NetworkHelper;
 
 /**