diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java
index 886bbe25..aeb13014 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java
@@ -16,6 +16,7 @@ import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.tile.TileAltar;
 import WayofTime.bloodmagic.util.Utils;
 import com.google.common.base.Strings;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.Block;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -163,10 +164,8 @@ public class BlockAltar extends Block implements IVariantProvider, IDocumentedBl
     // IVariantProvider
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "normal");
     }
 
     // IDocumentedBlock
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java
index 6637e06d..b8354f7e 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java
@@ -6,6 +6,7 @@ import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.item.block.ItemBlockBloodTank;
 import WayofTime.bloodmagic.tile.TileBloodTank;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -195,11 +196,8 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider, IB
     // IVariantProvider
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = Lists.newArrayList();
+    public void populateVariants(Int2ObjectMap<String> variants) {
         for (int i = 0; i < TileBloodTank.CAPACITIES.length; i++)
-            ret.add(Pair.of(i, "inventory"));
-
-        return ret;
+            variants.put(i, "inventory");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java
index b0bfcfb1..ba562cab 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrucible.java
@@ -6,6 +6,7 @@ import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.tile.TileDemonCrucible;
 import WayofTime.bloodmagic.util.Utils;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.Block;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -100,10 +101,8 @@ public class BlockDemonCrucible extends Block implements IVariantProvider, IBMBl
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "normal");
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java
index 0b255c05..9377a5c5 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonCrystallizer.java
@@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.tile.TileDemonCrystallizer;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.BlockContainer;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -68,10 +69,8 @@ public class BlockDemonCrystallizer extends BlockContainer implements IVariantPr
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+       variants.put(0, "normal");
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java
index 44c7f95f..5ff97e5b 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarBase.java
@@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.block.base.BlockEnumPillar;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 import net.minecraft.util.EnumFacing;
@@ -24,16 +25,12 @@ public class BlockDemonPillarBase<E extends Enum<E> & IStringSerializable> exten
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = Lists.newArrayList();
-
+    public void populateVariants(Int2ObjectMap<String> variants) {
         //This is done to make the ItemBlocks have the proper model
         EnumFacing.Axis[] axis = new EnumFacing.Axis[]{EnumFacing.Axis.Y, EnumFacing.Axis.X, EnumFacing.Axis.Z};
 
         for (int i = 0; i < 3; i++)
             for (int j = 0; j < this.getTypes().length; j++)
-                ret.add(Pair.of(i * 5 + j, "axis=" + axis[i] + ",type=" + this.getTypes()[j]));
-
-        return ret;
+                variants.put(i * 5 + j, "axis=" + axis[i] + ",type=" + this.getTypes()[j]);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java
index 51ef6dbb..e18397e1 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPillarCapBase.java
@@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.block.base.BlockEnumPillarCap;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 import net.minecraft.util.EnumFacing;
@@ -24,15 +25,10 @@ public class BlockDemonPillarCapBase<E extends Enum<E> & IStringSerializable> ex
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = Lists.newArrayList();
-
+    public void populateVariants(Int2ObjectMap<String> variants) {
         //This is done to make the ItemBlocks have the proper model
-
         for (int i = 0; i < EnumFacing.values().length; i++)
             for (int j = 0; j < this.getTypes().length; j++)
-                ret.add(Pair.of(i * 2 + j, "facing=" + EnumFacing.values()[i] + ",type=" + this.getTypes()[j]));
-
-        return ret;
+                variants.put(i * 2 + j, "facing=" + EnumFacing.values()[i] + ",type=" + this.getTypes()[j]);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java
index 28abe0f5..f25a0e35 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonPylon.java
@@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.tile.TileDemonPylon;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.BlockContainer;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -61,9 +62,7 @@ public class BlockDemonPylon extends BlockContainer implements IVariantProvider
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "normal");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java
index 30166d16..457a7111 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonStairsBase.java
@@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.block.base.BlockEnumStairs;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 import net.minecraft.util.IStringSerializable;
@@ -23,12 +24,8 @@ public class BlockDemonStairsBase<E extends Enum<E> & IStringSerializable> exten
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = Lists.newArrayList();
-
+    public void populateVariants(Int2ObjectMap<String> variants) {
         for (int i = 0; i < this.getTypes().length; i++)
-            ret.add(Pair.of(i, "facing=south,half=bottom,shape=straight,type=" + this.getTypes()[i]));
-
-        return ret;
+            variants.put(i, "facing=south,half=bottom,shape=straight,type=" + this.getTypes()[i]);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java b/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java
index 2ad6bfe1..93fab1f7 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockDemonWallBase.java
@@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.block.base.BlockEnumWall;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 import net.minecraft.util.IStringSerializable;
@@ -23,12 +24,8 @@ public class BlockDemonWallBase<E extends Enum<E> & IStringSerializable> extends
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = Lists.newArrayList();
-
+    public void populateVariants(Int2ObjectMap<String> variants) {
         for (int i = 0; i < this.getTypes().length; i++)
-            ret.add(Pair.of(i, "east=true,north=false,south=false,type=" + this.getTypes()[i] + ",up=true,west=true"));
-
-        return ret;
+            variants.put(i, "east=true,north=false,south=false,type=" + this.getTypes()[i] + ",up=true,west=true");
     }
 }
\ No newline at end of file
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java
index af051063..c6aa9870 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockIncenseAltar.java
@@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.tile.TileIncenseAltar;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.Block;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -84,10 +85,8 @@ public class BlockIncenseAltar extends Block implements IVariantProvider, IBMBlo
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "normal");
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java
index 03040157..0b49e8db 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillar.java
@@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.block.base.BlockEnum;
 import WayofTime.bloodmagic.block.enums.EnumSubWillType;
 import WayofTime.bloodmagic.tile.TileInversionPillar;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.BlockStateContainer;
@@ -73,11 +74,9 @@ public class BlockInversionPillar extends BlockEnum<EnumSubWillType> {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
+    public void populateVariants(Int2ObjectMap<String> variants) {
         for (int i = 0; i < this.getTypes().length; i++)
-            ret.add(Pair.of(i, "static=false,type=" + this.getTypes()[i]));
-        return ret;
+            variants.put(i, "static=false,type=" + this.getTypes()[i]);
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java
index 9b0e3067..d5669c54 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockInversionPillarEnd.java
@@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.block.base.BlockEnum;
 import WayofTime.bloodmagic.block.enums.EnumInversionCap;
 import WayofTime.bloodmagic.client.IVariantProvider;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -54,10 +55,8 @@ public class BlockInversionPillarEnd extends BlockEnum<EnumInversionCap> impleme
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
+    public void populateVariants(Int2ObjectMap<String> variants) {
         for (int i = 0; i < this.getTypes().length; i++)
-            ret.add(new ImmutablePair<Integer, String>(i, "type=" + this.getTypes()[i]));
-        return ret;
+            variants.put(i, "type=" + this.getTypes()[i]);
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java
index b488e046..12a201a1 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockPhantom.java
@@ -3,6 +3,7 @@ package WayofTime.bloodmagic.block;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.tile.TilePhantomBlock;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.Block;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -85,9 +86,7 @@ public class BlockPhantom extends Block implements IVariantProvider {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "normal");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java
index 773d98b9..f9b4fdaf 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockRoutingNode.java
@@ -5,6 +5,7 @@ import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.tile.routing.TileMasterRoutingNode;
 import WayofTime.bloodmagic.tile.routing.TileRoutingNode;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.Block;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.properties.PropertyBool;
@@ -132,7 +133,7 @@ public class BlockRoutingNode extends Block implements IBMBlock, IVariantProvide
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        return Lists.newArrayList(Pair.of(0, "inventory"));
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "inventory");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java
index 2c200c2c..6fa1b227 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java
@@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.api.Constants;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.tile.TileSoulForge;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.Block;
 import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
@@ -98,10 +99,8 @@ public class BlockSoulForge extends Block implements IVariantProvider, IBMBlock
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "normal");
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java
index 6aa45663..61f54108 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockSpectral.java
@@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.ConfigHandler;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.tile.TileSpectralBlock;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.Block;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -108,9 +109,7 @@ public class BlockSpectral extends Block implements IVariantProvider {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "normal");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java
index 6ac92d99..e47581e9 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockTeleposer.java
@@ -5,6 +5,7 @@ import WayofTime.bloodmagic.api.Constants;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.item.ItemTelepositionFocus;
 import WayofTime.bloodmagic.tile.TileTeleposer;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.BlockContainer;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -65,10 +66,8 @@ public class BlockTeleposer extends BlockContainer implements IVariantProvider,
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "normal");
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java b/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java
index 7dd5b818..479cbcdb 100644
--- a/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java
+++ b/src/main/java/WayofTime/bloodmagic/block/IBMBlock.java
@@ -2,7 +2,10 @@ package WayofTime.bloodmagic.block;
 
 import net.minecraft.item.ItemBlock;
 
+import javax.annotation.Nullable;
+
 public interface IBMBlock {
 
+    @Nullable
     ItemBlock getItem();
 }
diff --git a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java
index 2691f724..496bbf38 100644
--- a/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java
+++ b/src/main/java/WayofTime/bloodmagic/block/base/BlockEnum.java
@@ -4,6 +4,7 @@ import WayofTime.bloodmagic.block.IBMBlock;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.item.block.base.ItemBlockEnum;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.Block;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.properties.PropertyEnum;
@@ -77,15 +78,12 @@ public class BlockEnum<E extends Enum<E> & IStringSerializable> extends Block im
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> variants = Lists.newArrayList();
+    public void populateVariants(Int2ObjectMap<String> variants) {
         if (getItem() == null)
-            return variants;
+            return;
 
         for (int i = 0; i < types.length; i++)
-            variants.add(Pair.of(i, getProperty().getName() + "=" + types[i].name()));
-
-        return variants;
+            variants.put(i, getProperty().getName() + "=" + types[i].name());
     }
 
     public E[] getTypes() {
diff --git a/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java b/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java
index d697da6f..a848bc65 100644
--- a/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java
+++ b/src/main/java/WayofTime/bloodmagic/client/IMeshProvider.java
@@ -22,11 +22,9 @@ public interface IMeshProvider {
     ItemMeshDefinition getMeshDefinition();
 
     /**
-     * Gets all possible variants for this item
-     *
-     * @return - All possible variants for this item
+     * Populates a list of all possible variants for this item
      */
-    List<String> getVariants();
+    void populateVariants(List<String> variants);
 
     /**
      * If a custom ResourceLocation is required, return it here.
@@ -36,5 +34,7 @@ public interface IMeshProvider {
      * @return - The custom ResourceLocation
      */
     @Nullable
-    ResourceLocation getCustomLocation();
+    default ResourceLocation getCustomLocation() {
+        return null;
+    }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java b/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java
index c37d9958..1d6c71e5 100644
--- a/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java
+++ b/src/main/java/WayofTime/bloodmagic/client/IVariantProvider.java
@@ -1,9 +1,16 @@
 package WayofTime.bloodmagic.client;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import org.apache.commons.lang3.tuple.Pair;
 
 import java.util.List;
 
 public interface IVariantProvider {
-    List<Pair<Integer, String>> getVariants();
+
+    /**
+     * A mapping of meta -> state variant
+     *
+     * @param variants A map to populate with all variants
+     */
+    void populateVariants(Int2ObjectMap<String> variants);
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java
index c0560ec7..a045bcbf 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemActivationCrystal.java
@@ -3,6 +3,7 @@ package WayofTime.bloodmagic.item;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.item.ItemStack;
@@ -50,12 +51,10 @@ public class ItemActivationCrystal extends ItemBindableBase implements IVariantP
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=weak"));
-        ret.add(new ImmutablePair<Integer, String>(1, "type=demonic"));
-        ret.add(new ImmutablePair<Integer, String>(2, "type=creative"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=weak");
+        variants.put(1, "type=demonic");
+        variants.put(2, "type=creative");
     }
 
     public int getCrystalLevel(ItemStack stack) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java
index 442ecd96..7501b5fc 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemAltarMaker.java
@@ -12,6 +12,7 @@ import WayofTime.bloodmagic.util.ChatUtil;
 
 import WayofTime.bloodmagic.util.helper.NumeralHelper;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.player.EntityPlayer;
@@ -90,10 +91,8 @@ public class ItemAltarMaker extends Item implements IAltarManipulator, IVariantP
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=altarmaker"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=altarmaker");
     }
 
     public void setTierToBuild(EnumAltarTier tierToBuild) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java
index 4734f6f9..11d010ca 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemArcaneAshes.java
@@ -5,6 +5,7 @@ import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.core.RegistrarBloodMagicBlocks;
 import WayofTime.bloodmagic.tile.TileAlchemyArray;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
@@ -61,9 +62,7 @@ public class ItemArcaneAshes extends Item implements IVariantProvider {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=arcaneashes"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=arcaneashes");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java b/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java
index acbf2214..cdcda8d3 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemBloodShard.java
@@ -2,6 +2,7 @@ package WayofTime.bloodmagic.item;
 
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.client.IVariantProvider;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
@@ -41,10 +42,8 @@ public class ItemBloodShard extends Item implements IVariantProvider {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=weak"));
-        ret.add(new ImmutablePair<Integer, String>(1, "type=demonic"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=weak");
+        variants.put(1, "type=demonic");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java
index 26831f4c..ee4cdde1 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundAxe.java
@@ -4,7 +4,6 @@ import WayofTime.bloodmagic.api.BlockStack;
 import WayofTime.bloodmagic.api.ItemStackWrapper;
 import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
 import WayofTime.bloodmagic.client.IMeshProvider;
-import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable;
 import com.google.common.collect.HashMultiset;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
@@ -12,7 +11,6 @@ import net.minecraft.block.Block;
 import net.minecraft.block.BlockLeaves;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
-import net.minecraft.client.renderer.ItemMeshDefinition;
 import net.minecraft.enchantment.EnchantmentHelper;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.SharedMonsterAttributes;
@@ -22,17 +20,12 @@ import net.minecraft.init.Blocks;
 import net.minecraft.init.Enchantments;
 import net.minecraft.inventory.EntityEquipmentSlot;
 import net.minecraft.item.ItemStack;
-import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.event.world.BlockEvent;
 import net.minecraftforge.fml.common.eventhandler.Event;
-import net.minecraftforge.fml.relauncher.Side;
-import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
@@ -116,24 +109,4 @@ public class ItemBoundAxe extends ItemBoundTool implements IMeshProvider {
         }
         return multimap;
     }
-
-    @Override
-    @SideOnly(Side.CLIENT)
-    public ItemMeshDefinition getMeshDefinition() {
-        return new CustomMeshDefinitionActivatable("bound_axe");
-    }
-
-    @Nullable
-    @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
-    }
-
-    @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
-        ret.add("active=true");
-        ret.add("active=false");
-        return ret;
-    }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java
index bc2c47f3..21c7a231 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundPickaxe.java
@@ -4,14 +4,12 @@ import WayofTime.bloodmagic.api.BlockStack;
 import WayofTime.bloodmagic.api.ItemStackWrapper;
 import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
 import WayofTime.bloodmagic.client.IMeshProvider;
-import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable;
 import com.google.common.collect.HashMultiset;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
 import net.minecraft.block.Block;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
-import net.minecraft.client.renderer.ItemMeshDefinition;
 import net.minecraft.enchantment.EnchantmentHelper;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.SharedMonsterAttributes;
@@ -21,17 +19,12 @@ import net.minecraft.init.Blocks;
 import net.minecraft.init.Enchantments;
 import net.minecraft.inventory.EntityEquipmentSlot;
 import net.minecraft.item.ItemStack;
-import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.event.world.BlockEvent;
 import net.minecraftforge.fml.common.eventhandler.Event;
-import net.minecraftforge.fml.relauncher.Side;
-import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
@@ -129,24 +122,4 @@ public class ItemBoundPickaxe extends ItemBoundTool implements IMeshProvider {
         }
         return multimap;
     }
-
-    @Override
-    @SideOnly(Side.CLIENT)
-    public ItemMeshDefinition getMeshDefinition() {
-        return new CustomMeshDefinitionActivatable("bound_pickaxe");
-    }
-
-    @Nullable
-    @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
-    }
-
-    @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
-        ret.add("active=true");
-        ret.add("active=false");
-        return ret;
-    }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java
index c122d617..fd643888 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundShovel.java
@@ -4,14 +4,12 @@ import WayofTime.bloodmagic.api.BlockStack;
 import WayofTime.bloodmagic.api.ItemStackWrapper;
 import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
 import WayofTime.bloodmagic.client.IMeshProvider;
-import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable;
 import com.google.common.collect.HashMultiset;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
 import net.minecraft.block.Block;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
-import net.minecraft.client.renderer.ItemMeshDefinition;
 import net.minecraft.enchantment.EnchantmentHelper;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.SharedMonsterAttributes;
@@ -21,17 +19,12 @@ import net.minecraft.init.Blocks;
 import net.minecraft.init.Enchantments;
 import net.minecraft.inventory.EntityEquipmentSlot;
 import net.minecraft.item.ItemStack;
-import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.event.world.BlockEvent;
 import net.minecraftforge.fml.common.eventhandler.Event;
-import net.minecraftforge.fml.relauncher.Side;
-import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
@@ -115,24 +108,4 @@ public class ItemBoundShovel extends ItemBoundTool implements IMeshProvider {
         }
         return multimap;
     }
-
-    @Override
-    @SideOnly(Side.CLIENT)
-    public ItemMeshDefinition getMeshDefinition() {
-        return new CustomMeshDefinitionActivatable("bound_shovel");
-    }
-
-    @Nullable
-    @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
-    }
-
-    @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
-        ret.add("active=true");
-        ret.add("active=false");
-        return ret;
-    }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java
index cf6a8809..183d72ef 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundSword.java
@@ -30,14 +30,11 @@ import net.minecraft.item.ItemSword;
 import net.minecraft.util.ActionResult;
 import net.minecraft.util.EnumHand;
 import net.minecraft.util.NonNullList;
-import net.minecraft.util.ResourceLocation;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
-import java.util.ArrayList;
 import java.util.List;
 
 public class ItemBoundSword extends ItemSword implements IBindable, IActivatable, IMeshProvider {
@@ -133,18 +130,10 @@ public class ItemBoundSword extends ItemSword implements IBindable, IActivatable
         return new CustomMeshDefinitionActivatable("bound_sword");
     }
 
-    @Nullable
     @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
-    }
-
-    @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
-        ret.add("active=true");
-        ret.add("active=false");
-        return ret;
+    public void populateVariants(List<String> variants) {
+        variants.add("active=true");
+        variants.add("active=false");
     }
 
     // IBindable
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java
index 0bbcea86..5c830bde 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java
@@ -9,6 +9,8 @@ import WayofTime.bloodmagic.api.iface.IBindable;
 import WayofTime.bloodmagic.api.util.helper.NBTHelper;
 import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
 import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
+import WayofTime.bloodmagic.client.IMeshProvider;
+import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable;
 import WayofTime.bloodmagic.core.RegistrarBloodMagicItems;
 import WayofTime.bloodmagic.util.Utils;
 import WayofTime.bloodmagic.util.helper.TextHelper;
@@ -19,6 +21,7 @@ import com.google.common.collect.Multimap;
 import com.google.common.collect.Multiset;
 import net.minecraft.block.Block;
 import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.renderer.ItemMeshDefinition;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.entity.Entity;
@@ -45,7 +48,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-public class ItemBoundTool extends ItemTool implements IBindable, IActivatable {
+public class ItemBoundTool extends ItemTool implements IBindable, IActivatable, IMeshProvider {
     public final int chargeTime = 30;
     protected final String tooltipBase;
     private final String name;
@@ -250,6 +253,20 @@ public class ItemBoundTool extends ItemTool implements IBindable, IActivatable {
         return null;
     }
 
+    // IMeshProvider
+
+    @Override
+    @SideOnly(Side.CLIENT)
+    public ItemMeshDefinition getMeshDefinition() {
+        return new CustomMeshDefinitionActivatable("bound_" + name);
+    }
+
+    @Override
+    public void populateVariants(List<String> variants) {
+        variants.add("active=true");
+        variants.add("active=false");
+    }
+
     public String getTooltipBase() {
         return tooltipBase;
     }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java
index b5cdb49c..0b23856f 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemDaggerOfSacrifice.java
@@ -6,6 +6,7 @@ import WayofTime.bloodmagic.api.util.helper.PurificationHelper;
 import WayofTime.bloodmagic.api_impl.BloodMagicAPI;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.monster.IMob;
 import net.minecraft.entity.passive.EntityAnimal;
@@ -76,9 +77,7 @@ public class ItemDaggerOfSacrifice extends Item implements IVariantProvider {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = Lists.newArrayList();
-        ret.add(Pair.of(0, "type=normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=normal");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java
index bd8143dc..169265cf 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonCrystal.java
@@ -6,6 +6,7 @@ import WayofTime.bloodmagic.api.soul.IDiscreteDemonWill;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.core.RegistrarBloodMagicItems;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
@@ -90,11 +91,9 @@ public class ItemDemonCrystal extends Item implements IDiscreteDemonWill, IVaria
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
+    public void populateVariants(Int2ObjectMap<String> variants) {
         for (String name : NAMES)
-            ret.add(new ImmutablePair<Integer, String>(NAMES.indexOf(name), "type=" + name));
-        return ret;
+            variants.put(NAMES.indexOf(name), "type=" + name);
     }
 
     public static ItemStack getStack(String name) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java
index 68dcc7cf..5c3b8927 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemDemonWillGauge.java
@@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.api.iface.IDemonWillViewer;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
@@ -32,10 +33,8 @@ public class ItemDemonWillGauge extends Item implements IVariantProvider, IDemon
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=willgauge"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=willgauge");
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java
index e3799a0f..e7ca9173 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemEnum.java
@@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.item.types.ISubItem;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
@@ -49,11 +50,8 @@ public class ItemEnum<T extends Enum<T> & ISubItem> extends Item implements IVar
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> variants = Lists.newArrayList();
+    public void populateVariants(Int2ObjectMap<String> variants) {
         for (int i = 0; i < types.length; i++)
-            variants.add(Pair.of(i, "type=" + types[i].getInternalName()));
-
-        return variants;
+            variants.put(i, "type=" + types[i].getInternalName());
     }
 }
\ No newline at end of file
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java
index 45fad002..1973bb51 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java
@@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.api.util.helper.NBTHelper;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.SoundEvents;
@@ -59,14 +60,12 @@ public class ItemExperienceBook extends Item implements IVariantProvider {
                 giveOneLevelExpToPlayer(stack, player);
         }
 
-        return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack);
+        return new ActionResult<>(EnumActionResult.SUCCESS, stack);
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=experiencetome"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=experiencetome");
     }
 
     public void giveOneLevelExpToPlayer(ItemStack stack, EntityPlayer player) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java
index 4481c2a2..51186953 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemInscriptionTool.java
@@ -7,6 +7,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper;
 import WayofTime.bloodmagic.block.BlockRitualStone;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
@@ -102,11 +103,9 @@ public class ItemInscriptionTool extends ItemBindableBase implements IVariantPro
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
+    public void populateVariants(Int2ObjectMap<String> variants) {
         for (int i = 1; i < EnumRuneType.values().length; i++)
-            ret.add(new ImmutablePair<Integer, String>(i, "type=" + EnumRuneType.values()[i].name()));
-        return ret;
+            variants.put(i, "type=" + EnumRuneType.values()[i].name());
     }
 
     public EnumRuneType getType(ItemStack stack) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java
index c224ea7d..218f19c8 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemLavaCrystal.java
@@ -5,6 +5,7 @@ import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
 import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.MobEffects;
 import net.minecraft.item.ItemStack;
@@ -53,9 +54,7 @@ public class ItemLavaCrystal extends ItemBindableBase implements IVariantProvide
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = Lists.newArrayList();
-        ret.add(Pair.of(0, "type=normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+       variants.put(0, "type=normal");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java
index 3f5e15ac..4e628304 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemPotionFlask.java
@@ -4,7 +4,6 @@ import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.api.util.helper.NBTHelper;
 import WayofTime.bloodmagic.client.IMeshProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
-import com.google.common.collect.Lists;
 import net.minecraft.block.material.Material;
 import net.minecraft.client.renderer.ItemMeshDefinition;
 import net.minecraft.client.renderer.block.model.ModelResourceLocation;
@@ -24,7 +23,6 @@ import net.minecraft.world.World;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
 import java.util.List;
 
 public class ItemPotionFlask extends Item implements IMeshProvider {
@@ -131,14 +129,9 @@ public class ItemPotionFlask extends Item implements IMeshProvider {
         };
     }
 
-    @Nullable
     @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
-    }
-
-    @Override
-    public List<String> getVariants() {
-        return Lists.newArrayList("full=true", "full=false");
+    public void populateVariants(List<String> variants) {
+        variants.add("full=true");
+        variants.add("full=false");
     }
 }
\ No newline at end of file
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java
index 616b01a2..0a8c8e2f 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualDiviner.java
@@ -16,6 +16,7 @@ import WayofTime.bloodmagic.util.Utils;
 import WayofTime.bloodmagic.util.handler.event.ClientHandler;
 import WayofTime.bloodmagic.util.helper.TextHelper;
 import com.google.common.base.Strings;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.Block;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.client.util.ITooltipFlag;
@@ -332,12 +333,10 @@ public class ItemRitualDiviner extends Item implements IVariantProvider {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=basic"));
-        ret.add(new ImmutablePair<Integer, String>(1, "type=dusk"));
-        ret.add(new ImmutablePair<Integer, String>(2, "type=dawn"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=basic");
+        variants.put(1, "type=dusk");
+        variants.put(2, "type=dawn");
     }
 
     public void cycleDirection(ItemStack stack, EntityPlayer player) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java
index 455e3f1c..dfbae3ec 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemRitualReader.java
@@ -10,6 +10,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.ChatUtil;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
@@ -233,9 +234,7 @@ public class ItemRitualReader extends Item implements IVariantProvider {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=normal");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java
index 1444de0e..f06cfe2b 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemSacrificialDagger.java
@@ -30,8 +30,6 @@ import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -183,17 +181,9 @@ public class ItemSacrificialDagger extends Item implements IMeshProvider {
     }
 
     @Override
-    public List<String> getVariants() {
-        List<String> variants = new ArrayList<String>();
+    public void populateVariants(List<String> variants) {
         variants.add("type=normal");
         variants.add("type=creative");
         variants.add("type=ceremonial");
-        return variants;
-    }
-
-    @Nullable
-    @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java
index f17328f6..2656aaba 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java
@@ -11,6 +11,7 @@ import WayofTime.bloodmagic.tile.TileAltar;
 import WayofTime.bloodmagic.util.ChatUtil;
 import WayofTime.bloodmagic.util.helper.NumeralHelper;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.player.EntityPlayer;
@@ -109,7 +110,7 @@ public class ItemSanguineBook extends Item implements IVariantProvider, IAltarMa
     // IVariantProvider
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        return Collections.singletonList(Pair.of(0, "type=normal"));
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=normal");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java
index b2564ffb..ab68166d 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemSlate.java
@@ -3,6 +3,7 @@ package WayofTime.bloodmagic.item;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.item.Item;
@@ -51,13 +52,11 @@ public class ItemSlate extends Item implements IVariantProvider {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=blank"));
-        ret.add(new ImmutablePair<Integer, String>(1, "type=reinforced"));
-        ret.add(new ImmutablePair<Integer, String>(2, "type=imbued"));
-        ret.add(new ImmutablePair<Integer, String>(3, "type=demonic"));
-        ret.add(new ImmutablePair<Integer, String>(4, "type=ethereal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=blank");
+        variants.put(1, "type=reinforced");
+        variants.put(2, "type=imbued");
+        variants.put(3, "type=demonic");
+        variants.put(4, "type=ethereal");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java
index 64895638..e1926357 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemTelepositionFocus.java
@@ -5,6 +5,7 @@ import WayofTime.bloodmagic.api.Constants;
 import WayofTime.bloodmagic.api.util.helper.NBTHelper;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.entity.player.EntityPlayer;
@@ -87,13 +88,11 @@ public class ItemTelepositionFocus extends ItemBindableBase implements IVariantP
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=weak"));
-        ret.add(new ImmutablePair<Integer, String>(1, "type=enhanced"));
-        ret.add(new ImmutablePair<Integer, String>(2, "type=reinforced"));
-        ret.add(new ImmutablePair<Integer, String>(3, "type=demonic"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=weak");
+        variants.put(1, "type=enhanced");
+        variants.put(2, "type=reinforced");
+        variants.put(3, "type=demonic");
     }
 
     public World getWorld(ItemStack stack) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java
index c7bd3f2c..2a7e87b8 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTome.java
@@ -8,6 +8,7 @@ import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.item.armour.ItemLivingArmour;
 import WayofTime.bloodmagic.livingArmour.LivingArmour;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.entity.player.EntityPlayer;
@@ -96,10 +97,8 @@ public class ItemUpgradeTome extends Item implements IVariantProvider {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=upgradetome"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=upgradetome");
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java
index f22ac3c0..459b25ef 100644
--- a/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java
+++ b/src/main/java/WayofTime/bloodmagic/item/ItemUpgradeTrainer.java
@@ -7,6 +7,7 @@ import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade;
 import WayofTime.bloodmagic.api.util.helper.ItemHelper.LivingUpgrades;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.item.Item;
@@ -82,9 +83,7 @@ public class ItemUpgradeTrainer extends Item implements IUpgradeTrainer, IVarian
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=upgradetrainer"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=upgradetrainer");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java
index f65f891c..6e5e1e82 100644
--- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java
+++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemCuttingFluid.java
@@ -6,6 +6,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.core.RegistrarBloodMagicItems;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.item.Item;
@@ -67,11 +68,9 @@ public class ItemCuttingFluid extends Item implements IVariantProvider, ICustomA
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
+    public void populateVariants(Int2ObjectMap<String> variants) {
         for (String name : names)
-            ret.add(new ImmutablePair<Integer, String>(names.indexOf(name), "type=" + name));
-        return ret;
+            variants.put(names.indexOf(name), "type=" + name);
     }
 
     public int getDamageOfFluid(ItemStack stack) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java
index 30e35efd..269587c5 100644
--- a/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java
+++ b/src/main/java/WayofTime/bloodmagic/item/alchemy/ItemLivingArmourPointsUpgrade.java
@@ -7,6 +7,7 @@ import WayofTime.bloodmagic.item.armour.ItemLivingArmour;
 import WayofTime.bloodmagic.livingArmour.LivingArmour;
 import WayofTime.bloodmagic.util.helper.TextHelper;
 import com.google.common.collect.Iterables;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.entity.EntityLivingBase;
@@ -118,11 +119,9 @@ public class ItemLivingArmourPointsUpgrade extends Item implements IVariantProvi
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
+    public void populateVariants(Int2ObjectMap<String> variants) {
         for (String name : names)
-            ret.add(new ImmutablePair<Integer, String>(names.indexOf(name), "type=" + name));
-        return ret;
+            variants.put(names.indexOf(name), "type=" + name);
     }
 
     public static ItemStack getStack(String name) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java
index 55f632f9..886202e0 100644
--- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java
+++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java
@@ -9,7 +9,6 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper;
 import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
 import WayofTime.bloodmagic.client.IMeshProvider;
 import WayofTime.bloodmagic.core.RegistrarBloodMagicItems;
-import WayofTime.bloodmagic.item.types.ComponentType;
 import WayofTime.bloodmagic.item.types.ReagentType;
 import WayofTime.bloodmagic.livingArmour.LivingArmour;
 import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerRepairing;
@@ -45,8 +44,11 @@ import org.lwjgl.input.Keyboard;
 
 import javax.annotation.Nullable;
 import java.lang.reflect.Field;
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
+import java.util.UUID;
 
 public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshProvider {
     public static final boolean useSpecialArmourCalculation = true;
@@ -367,13 +369,11 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP
     }
 
     @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
-        ret.add("armour=head");
-        ret.add("armour=body");
-        ret.add("armour=leg");
-        ret.add("armour=feet");
-        return ret;
+    public void populateVariants(List<String> variants) {
+        variants.add("armour=head");
+        variants.add("armour=body");
+        variants.add("armour=leg");
+        variants.add("armour=feet");
     }
 
     public void setLivingArmour(ItemStack stack, LivingArmour armour, boolean forceWrite) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java
index 962a6272..63662c40 100644
--- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java
+++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemSentientArmour.java
@@ -33,7 +33,10 @@ import net.minecraftforge.common.ISpecialArmor;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-import java.util.*;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.UUID;
 
 public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMeshProvider, IMultiWillTool {
     public static String[] names = {"helmet", "chest", "legs", "boots"};
@@ -297,18 +300,15 @@ public class ItemSentientArmour extends ItemArmor implements ISpecialArmor, IMes
     }
 
     @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
+    public void populateVariants(List<String> variants) {
         for (EnumDemonWillType type : EnumDemonWillType.values()) {
             String additional = "_" + type.getName().toLowerCase();
 
-            ret.add("armour=head" + additional);
-            ret.add("armour=body" + additional);
-            ret.add("armour=leg" + additional);
-            ret.add("armour=feet" + additional);
+            variants.add("armour=head" + additional);
+            variants.add("armour=body" + additional);
+            variants.add("armour=leg" + additional);
+            variants.add("armour=feet" + additional);
         }
-
-        return ret;
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java
index 6f082408..3370d29f 100644
--- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java
+++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockAlchemyTable.java
@@ -3,6 +3,7 @@ package WayofTime.bloodmagic.item.block;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.tile.TileAlchemyTable;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.block.Block;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.entity.player.EntityPlayer;
@@ -64,7 +65,7 @@ public class ItemBlockAlchemyTable extends ItemBlock implements IVariantProvider
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        return Lists.newArrayList(Pair.of(0, "inventory"));
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "inventory");
     }
 }
\ No newline at end of file
diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java
index 3abdfdce..bece7301 100644
--- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java
+++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSacrifice.java
@@ -9,6 +9,7 @@ import WayofTime.bloodmagic.api.util.helper.ItemHelper.LPContainer;
 import WayofTime.bloodmagic.api.util.helper.NBTHelper;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.inventory.EntityEquipmentSlot;
@@ -76,10 +77,8 @@ public class ItemPackSacrifice extends ItemArmor implements IAltarManipulator, I
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=normal");
     }
 
     // IFillable
diff --git a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java
index 1dd19a4b..9d6c36f8 100644
--- a/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java
+++ b/src/main/java/WayofTime/bloodmagic/item/gear/ItemPackSelfSacrifice.java
@@ -10,6 +10,7 @@ import WayofTime.bloodmagic.api.util.helper.NBTHelper;
 import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.inventory.EntityEquipmentSlot;
@@ -101,10 +102,8 @@ public class ItemPackSelfSacrifice extends ItemArmor implements IAltarManipulato
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=normal");
     }
 
     // IFillable
diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java
index 455c44c4..d88f2432 100644
--- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java
+++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemFluidRouterFilter.java
@@ -7,6 +7,7 @@ import WayofTime.bloodmagic.routing.IFluidFilter;
 import WayofTime.bloodmagic.routing.RoutingFluidFilter;
 import WayofTime.bloodmagic.util.GhostItemHelper;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.item.Item;
@@ -121,10 +122,8 @@ public class ItemFluidRouterFilter extends Item implements IFluidFilterProvider,
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=exact"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=exact");
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java
index 3cdb1aa0..4cdc0ae6 100644
--- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java
+++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java
@@ -8,6 +8,7 @@ import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.routing.IMasterRoutingNode;
 import WayofTime.bloodmagic.routing.IRoutingNode;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
@@ -176,10 +177,8 @@ public class ItemNodeRouter extends Item implements INodeRenderer, IVariantProvi
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=normal");
     }
 
     public BlockPos getBlockPos(ItemStack stack) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java
index 76cc2b48..5fa81eed 100644
--- a/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java
+++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemRouterFilter.java
@@ -6,6 +6,7 @@ import WayofTime.bloodmagic.item.inventory.ItemInventory;
 import WayofTime.bloodmagic.routing.*;
 import WayofTime.bloodmagic.util.GhostItemHelper;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.item.Item;
@@ -138,13 +139,11 @@ public class ItemRouterFilter extends Item implements IItemFilterProvider, IVari
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=exact"));
-        ret.add(new ImmutablePair<Integer, String>(1, "type=ignorenbt"));
-        ret.add(new ImmutablePair<Integer, String>(2, "type=moditems"));
-        ret.add(new ImmutablePair<Integer, String>(3, "type=oredict"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=exact");
+        variants.put(1, "type=ignorenbt");
+        variants.put(2, "type=moditems");
+        variants.put(3, "type=oredict");
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java
index 7de088ff..74157b85 100644
--- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java
+++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilBase.java
@@ -6,6 +6,7 @@ import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
 import com.google.common.base.Strings;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.item.ItemStack;
 import net.minecraft.world.World;
@@ -51,10 +52,8 @@ public class ItemSigilBase extends ItemSigil implements IVariantProvider {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(Pair.of(0, "type=normal"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=normal");
     }
 
     public String getName() {
diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java
index da59eee5..5ac4df3f 100644
--- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java
+++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilHolding.java
@@ -12,6 +12,7 @@ import WayofTime.bloodmagic.client.key.KeyBindings;
 import WayofTime.bloodmagic.util.Utils;
 import WayofTime.bloodmagic.util.helper.TextHelper;
 import com.google.common.base.Strings;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
@@ -167,8 +168,8 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        return Collections.emptyList();
+    public void populateVariants(Int2ObjectMap<String> variants) {
+
     }
 
     public static int next(int mode) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java
index 7590fc19..fed28625 100644
--- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java
+++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilToggleableBase.java
@@ -10,14 +10,10 @@ import com.google.common.base.Strings;
 import net.minecraft.client.renderer.ItemMeshDefinition;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.item.ItemStack;
-import net.minecraft.util.ResourceLocation;
 import net.minecraft.world.World;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
-import org.apache.commons.lang3.text.WordUtils;
 
-import javax.annotation.Nullable;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
@@ -53,18 +49,9 @@ public class ItemSigilToggleableBase extends ItemSigilToggleable implements IMes
         return new CustomMeshDefinitionActivatable("sigil_" + name.toLowerCase(Locale.ROOT));
     }
 
-    @Nullable
     @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
-    }
-
-    @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
-        ret.add("active=false");
-        ret.add("active=true");
-
-        return ret;
+    public void populateVariants(List<String> variants) {
+        variants.add("active=false");
+        variants.add("active=true");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/sigil/ItemSigil.java b/src/main/java/WayofTime/bloodmagic/item/sigil/sigil/ItemSigil.java
index 1550549c..df087bf3 100644
--- a/src/main/java/WayofTime/bloodmagic/item/sigil/sigil/ItemSigil.java
+++ b/src/main/java/WayofTime/bloodmagic/item/sigil/sigil/ItemSigil.java
@@ -5,20 +5,21 @@ import WayofTime.bloodmagic.api.iface.IBindable;
 import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
 import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
 import WayofTime.bloodmagic.client.IMeshProvider;
-import com.google.common.collect.Lists;
 import net.minecraft.client.renderer.ItemMeshDefinition;
 import net.minecraft.client.renderer.block.model.ModelResourceLocation;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
-import net.minecraft.util.*;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.EnumActionResult;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.EnumHand;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
 import java.util.List;
 
 public class ItemSigil extends Item implements IBindable, IMeshProvider {
@@ -131,18 +132,11 @@ public class ItemSigil extends Item implements IBindable, IMeshProvider {
     }
 
     @Override
-    public List<String> getVariants() {
+    public void populateVariants(List<String> variants) {
         if (sigil instanceof ISigil.Toggle) {
-            return Lists.newArrayList(
-                    "active=true",
-                    "active=false"
-            );
-        } else return Lists.newArrayList("inventory");
-    }
-
-    @Nullable
-    @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
+            variants.add("active=true");
+            variants.add("active=false");
+        } else
+            variants.add("inventory");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java
index 3be9b4be..ed35d92d 100644
--- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java
+++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemMonsterSoul.java
@@ -7,6 +7,7 @@ import WayofTime.bloodmagic.api.soul.IDemonWill;
 import WayofTime.bloodmagic.api.util.helper.NBTHelper;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.item.Item;
@@ -105,13 +106,9 @@ public class ItemMonsterSoul extends Item implements IDemonWill, IVariantProvide
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        for (int i = 0; i < names.length; i++) {
-            String name = names[i];
-            ret.add(new ImmutablePair<Integer, String>(i, "type=" + name));
-        }
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        for (int i = 0; i < names.length; i++)
+            variants.put(i, "type=" + names[i]);
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java
index e25ae539..3c1e9fc6 100644
--- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java
+++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientArmourGem.java
@@ -5,19 +5,20 @@ import WayofTime.bloodmagic.api.soul.EnumDemonWillType;
 import WayofTime.bloodmagic.api.soul.PlayerDemonWillHandler;
 import WayofTime.bloodmagic.client.IMeshProvider;
 import WayofTime.bloodmagic.item.armour.ItemSentientArmour;
-import com.google.common.collect.Lists;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.renderer.ItemMeshDefinition;
 import net.minecraft.client.renderer.block.model.ModelResourceLocation;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
-import net.minecraft.util.*;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.EnumActionResult;
+import net.minecraft.util.EnumHand;
+import net.minecraft.util.NonNullList;
 import net.minecraft.world.World;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
 import java.util.List;
 
 public class ItemSentientArmourGem extends Item implements IMeshProvider {
@@ -53,7 +54,7 @@ public class ItemSentientArmourGem extends Item implements IMeshProvider {
             ItemSentientArmour.convertPlayerArmour(type, will, player);
         }
 
-        return new ActionResult<ItemStack>(EnumActionResult.PASS, player.getHeldItem(hand));
+        return new ActionResult<>(EnumActionResult.PASS, player.getHeldItem(hand));
     }
 
     @SideOnly(Side.CLIENT)
@@ -62,24 +63,17 @@ public class ItemSentientArmourGem extends Item implements IMeshProvider {
         return stack -> {
             boolean flag = false;
             NonNullList<ItemStack> armourInventory = Minecraft.getMinecraft().player.inventory.armorInventory;
-            for (ItemStack armourStack : armourInventory) {
-                if (armourStack != null && armourStack.getItem() instanceof ItemSentientArmour) {
+            for (ItemStack armourStack : armourInventory)
+                if (!armourStack.isEmpty() && armourStack.getItem() instanceof ItemSentientArmour)
                     flag = true;
-                }
-            }
 
             return new ModelResourceLocation(stack.getItem().getRegistryName(), "type=" + (flag ? "" : "de") + "activated");
         };
     }
 
     @Override
-    public List<String> getVariants() {
-        return Lists.newArrayList("type=activated", "type=deactivated");
-    }
-
-    @Nullable
-    @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
+    public void populateVariants(List<String> variants) {
+        variants.add("type=activated");
+        variants.add("type=deactivated");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java
index c2b82f28..24298f2a 100644
--- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java
+++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientAxe.java
@@ -36,13 +36,11 @@ import net.minecraft.nbt.NBTTagCompound;
 import net.minecraft.potion.PotionEffect;
 import net.minecraft.util.ActionResult;
 import net.minecraft.util.EnumHand;
-import net.minecraft.util.ResourceLocation;
 import net.minecraft.world.EnumDifficulty;
 import net.minecraft.world.World;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
 import java.util.*;
 
 public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool {
@@ -300,20 +298,10 @@ public class ItemSentientAxe extends ItemAxe implements IDemonWillWeapon, IMeshP
         return new CustomMeshDefinitionMultiWill("sentient_axe");
     }
 
-    @Nullable
     @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
-    }
-
-    @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
-        for (EnumDemonWillType type : EnumDemonWillType.values()) {
-            ret.add("type=" + type.getName().toLowerCase());
-        }
-
-        return ret;
+    public void populateVariants(List<String> variants) {
+        for (EnumDemonWillType type : EnumDemonWillType.values())
+            variants.add("type=" + type.getName().toLowerCase());
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java
index 97b87625..00c29dec 100644
--- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java
+++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientBow.java
@@ -12,6 +12,7 @@ import WayofTime.bloodmagic.core.RegistrarBloodMagicItems;
 import WayofTime.bloodmagic.entity.mob.EntitySentientSpecter;
 import WayofTime.bloodmagic.entity.projectile.EntitySentientArrow;
 import com.google.common.collect.Lists;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.enchantment.EnchantmentHelper;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.player.EntityPlayer;
@@ -253,8 +254,8 @@ public class ItemSentientBow extends ItemBow implements IMultiWillTool, ISentien
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        return Lists.newArrayList(Pair.of(0, "inventory"));
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "inventory");
     }
 
     public EntityTippedArrow getArrowEntity(World world, ItemStack stack, EntityLivingBase target, EntityLivingBase user, float velocity) {
diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java
index 05c51b19..07d8690f 100644
--- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java
+++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientPickaxe.java
@@ -36,13 +36,11 @@ import net.minecraft.nbt.NBTTagCompound;
 import net.minecraft.potion.PotionEffect;
 import net.minecraft.util.ActionResult;
 import net.minecraft.util.EnumHand;
-import net.minecraft.util.ResourceLocation;
 import net.minecraft.world.EnumDifficulty;
 import net.minecraft.world.World;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
 import java.util.*;
 
 public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool {
@@ -299,20 +297,10 @@ public class ItemSentientPickaxe extends ItemPickaxe implements IDemonWillWeapon
         return new CustomMeshDefinitionMultiWill("sentient_pickaxe");
     }
 
-    @Nullable
     @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
-    }
-
-    @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
-        for (EnumDemonWillType type : EnumDemonWillType.values()) {
-            ret.add("type=" + type.getName().toLowerCase());
-        }
-
-        return ret;
+    public void populateVariants(List<String> variants) {
+        for (EnumDemonWillType type : EnumDemonWillType.values())
+            variants.add("type=" + type.getName().toLowerCase());
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java
index 2edd2b73..e6888e5d 100644
--- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java
+++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientShovel.java
@@ -36,13 +36,11 @@ import net.minecraft.nbt.NBTTagCompound;
 import net.minecraft.potion.PotionEffect;
 import net.minecraft.util.ActionResult;
 import net.minecraft.util.EnumHand;
-import net.minecraft.util.ResourceLocation;
 import net.minecraft.world.EnumDifficulty;
 import net.minecraft.world.World;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
 import java.util.*;
 
 public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool {
@@ -300,20 +298,10 @@ public class ItemSentientShovel extends ItemSpade implements IDemonWillWeapon, I
         return new CustomMeshDefinitionMultiWill("sentient_shovel");
     }
 
-    @Nullable
     @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
-    }
-
-    @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
-        for (EnumDemonWillType type : EnumDemonWillType.values()) {
-            ret.add("type=" + type.getName().toLowerCase());
-        }
-
-        return ret;
+    public void populateVariants(List<String> variants) {
+        for (EnumDemonWillType type : EnumDemonWillType.values())
+            variants.add("type=" + type.getName().toLowerCase());
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java
index 4753c957..a7a0066f 100644
--- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java
+++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSentientSword.java
@@ -34,13 +34,11 @@ import net.minecraft.nbt.NBTTagCompound;
 import net.minecraft.potion.PotionEffect;
 import net.minecraft.util.ActionResult;
 import net.minecraft.util.EnumHand;
-import net.minecraft.util.ResourceLocation;
 import net.minecraft.world.EnumDifficulty;
 import net.minecraft.world.World;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
 import java.util.*;
 
 public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IMeshProvider, IMultiWillTool, ISentientTool {
@@ -275,20 +273,10 @@ public class ItemSentientSword extends ItemSword implements IDemonWillWeapon, IM
         return new CustomMeshDefinitionMultiWill("sentient_shovel");
     }
 
-    @Nullable
     @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
-    }
-
-    @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
-        for (EnumDemonWillType type : EnumDemonWillType.values()) {
-            ret.add("type=" + type.getName().toLowerCase());
-        }
-
-        return ret;
+    public void populateVariants(List<String> variants) {
+        for (EnumDemonWillType type : EnumDemonWillType.values())
+            variants.add("type=" + type.getName().toLowerCase());
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java
index a4095e15..6dde869a 100644
--- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java
+++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java
@@ -18,14 +18,15 @@ import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.util.*;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.EnumActionResult;
+import net.minecraft.util.EnumHand;
+import net.minecraft.util.NonNullList;
 import net.minecraft.util.math.MathHelper;
 import net.minecraft.world.World;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
@@ -55,7 +56,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I
         double filled = PlayerDemonWillHandler.addDemonWill(type, player, drain, stack);
         this.drainWill(type, stack, filled, true);
 
-        return new ActionResult<ItemStack>(EnumActionResult.PASS, stack);
+        return new ActionResult<>(EnumActionResult.PASS, stack);
     }
 
     @Override
@@ -64,24 +65,15 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I
         return new CustomMeshDefinitionWillGem("soul_gem");
     }
 
-    @Nullable
     @Override
-    public ResourceLocation getCustomLocation() {
-        return null;
-    }
-
-    @Override
-    public List<String> getVariants() {
-        List<String> ret = new ArrayList<String>();
+    public void populateVariants(List<String> variants) {
         for (EnumDemonWillType type : EnumDemonWillType.values()) {
-            ret.add("type=petty_" + type.getName().toLowerCase());
-            ret.add("type=lesser_" + type.getName().toLowerCase());
-            ret.add("type=common_" + type.getName().toLowerCase());
-            ret.add("type=greater_" + type.getName().toLowerCase());
-            ret.add("type=grand_" + type.getName().toLowerCase());
+            variants.add("type=petty_" + type.getName().toLowerCase());
+            variants.add("type=lesser_" + type.getName().toLowerCase());
+            variants.add("type=common_" + type.getName().toLowerCase());
+            variants.add("type=greater_" + type.getName().toLowerCase());
+            variants.add("type=grand_" + type.getName().toLowerCase());
         }
-
-        return ret;
     }
 
     @Override
diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java
index e6d76d8c..9842603b 100644
--- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java
+++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulSnare.java
@@ -4,6 +4,7 @@ import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare;
 import WayofTime.bloodmagic.util.helper.TextHelper;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import net.minecraft.client.util.ITooltipFlag;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.entity.player.EntityPlayer;
@@ -75,9 +76,7 @@ public class ItemSoulSnare extends Item implements IVariantProvider {
     }
 
     @Override
-    public List<Pair<Integer, String>> getVariants() {
-        List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
-        ret.add(new ImmutablePair<Integer, String>(0, "type=soulsnare"));
-        return ret;
+    public void populateVariants(Int2ObjectMap<String> variants) {
+        variants.put(0, "type=soulsnare");
     }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java
index f414bb72..d0a496c1 100644
--- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java
+++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java
@@ -3,8 +3,6 @@ package WayofTime.bloodmagic.proxy;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.api.Constants;
 import WayofTime.bloodmagic.api.soul.DemonWillHolder;
-import WayofTime.bloodmagic.client.IMeshProvider;
-import WayofTime.bloodmagic.client.IVariantProvider;
 import WayofTime.bloodmagic.client.helper.ShaderHelper;
 import WayofTime.bloodmagic.client.hud.HUDElementDemonWillAura;
 import WayofTime.bloodmagic.client.hud.HUDElementHolding;
@@ -21,15 +19,11 @@ import WayofTime.bloodmagic.entity.projectile.EntitySoulSnare;
 import WayofTime.bloodmagic.tile.*;
 import WayofTime.bloodmagic.tile.routing.TileRoutingNode;
 import com.google.common.collect.ImmutableMap;
-import net.minecraft.block.Block;
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.renderer.block.model.ModelResourceLocation;
 import net.minecraft.client.renderer.entity.RenderManager;
 import net.minecraft.client.renderer.entity.RenderPlayer;
-import net.minecraft.item.Item;
 import net.minecraft.potion.PotionUtils;
 import net.minecraft.util.ResourceLocation;
-import net.minecraftforge.client.model.ModelLoader;
 import net.minecraftforge.client.model.ModelLoaderRegistry;
 import net.minecraftforge.client.model.animation.AnimationTESR;
 import net.minecraftforge.client.model.obj.OBJLoader;
@@ -39,7 +33,6 @@ import net.minecraftforge.common.model.animation.IAnimationStateMachine;
 import net.minecraftforge.fml.client.registry.ClientRegistry;
 import net.minecraftforge.fml.client.registry.RenderingRegistry;
 import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
-import org.apache.commons.lang3.tuple.Pair;
 
 import java.awt.Color;
 import java.util.Map;
@@ -120,32 +113,6 @@ public class ClientProxy extends CommonProxy {
         new HUDElementDemonWillAura();
     }
 
-    @Override
-    public void tryHandleBlockModel(Block block, String name) {
-        if (block instanceof IVariantProvider) {
-            IVariantProvider variantProvider = (IVariantProvider) block;
-            for (Pair<Integer, String> variant : variantProvider.getVariants())
-                ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), variant.getLeft(), new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, name), variant.getRight()));
-        }
-    }
-
-    @Override
-    public void tryHandleItemModel(Item item, String name) {
-        if (item instanceof IMeshProvider) {
-            IMeshProvider meshProvider = (IMeshProvider) item;
-            ModelLoader.setCustomMeshDefinition(item, meshProvider.getMeshDefinition());
-            ResourceLocation resourceLocation = meshProvider.getCustomLocation();
-            if (resourceLocation == null)
-                resourceLocation = new ResourceLocation(BloodMagic.MODID, "item/" + name);
-            for (String variant : meshProvider.getVariants())
-                ModelLoader.registerItemVariants(item, new ModelResourceLocation(resourceLocation, variant));
-        } else if (item instanceof IVariantProvider) {
-            IVariantProvider variantProvider = (IVariantProvider) item;
-            for (Pair<Integer, String> variant : variantProvider.getVariants())
-                ModelLoader.setCustomModelResourceLocation(item, variant.getLeft(), new ModelResourceLocation(new ResourceLocation(BloodMagic.MODID, "item/" + name), variant.getRight()));
-        }
-    }
-
     private void addElytraLayer() {
         RenderManager renderManager = Minecraft.getMinecraft().getRenderManager();
         try {
diff --git a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java
index ec248e4b..1dbea0c8 100644
--- a/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java
+++ b/src/main/java/WayofTime/bloodmagic/proxy/CommonProxy.java
@@ -4,8 +4,6 @@ import WayofTime.bloodmagic.api.ritual.CapabilityRuneType;
 import WayofTime.bloodmagic.api.ritual.IRitualStone;
 import WayofTime.bloodmagic.api.teleport.TeleportQueue;
 import com.google.common.collect.ImmutableMap;
-import net.minecraft.block.Block;
-import net.minecraft.item.Item;
 import net.minecraft.util.ResourceLocation;
 import net.minecraft.world.World;
 import net.minecraftforge.common.MinecraftForge;
@@ -36,14 +34,6 @@ public class CommonProxy {
         return null;
     }
 
-    public void tryHandleBlockModel(Block block, String name) {
-        // NO-OP
-    }
-
-    public void tryHandleItemModel(Item item, String name) {
-        // NO-OP
-    }
-
     public IAnimationStateMachine load(ResourceLocation location, ImmutableMap<String, ITimeValue> parameters) {
         return null;
     }
diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java
index a1cd31a2..c1e46a44 100644
--- a/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java
+++ b/src/main/java/WayofTime/bloodmagic/registry/ModRecipes.java
@@ -110,7 +110,8 @@ public class ModRecipes {
 
         AlchemyArrayRecipeRegistry.registerRecipe(new ItemStack(Items.ARROW), new ItemStack(Items.FEATHER), new AlchemyArrayEffectSkeletonTurret("skeletonTurret"), new DualAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret1.png"), new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/SkeletonTurret2.png")));
 
-        AlchemyArrayRecipeRegistry.registerRecipe(ReagentType.REAGENT_FASTMINER.getStack(), new ItemStack(Items.IRON_PICKAXE), new AlchemyArrayEffectSigil("fastMiner", (ISigil) RegistrarBloodMagicItems.SIGIL_FAST_MINER), new SingleAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png")));
+        // FIXME
+//        AlchemyArrayRecipeRegistry.registerRecipe(ReagentType.REAGENT_FASTMINER.getStack(), new ItemStack(Items.IRON_PICKAXE), new AlchemyArrayEffectSigil("fastMiner", (ISigil) RegistrarBloodMagicItems.SIGIL_FAST_MINER), new SingleAlchemyCircleRenderer(new ResourceLocation("bloodmagic", "textures/models/AlchemyArrays/FastMinerSigil.png")));
 
     }
 
diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_air.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_air.json
index 32f44849..caaa2b92 100644
--- a/src/main/resources/assets/bloodmagic/blockstates/sigil_air.json
+++ b/src/main/resources/assets/bloodmagic/blockstates/sigil_air.json
@@ -5,12 +5,10 @@
     "transform": "forge:default-item"
   },
   "variants": {
-    "type": {
-      "normal": {
-        "textures": {
-          "layer0": "bloodmagic:items/AirSigil"
-        }
+    "inventory": [{
+      "textures": {
+        "layer0": "bloodmagic:items/AirSigil"
       }
-    }
+    }]
   }
 }
\ No newline at end of file
diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_blood_light.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_blood_light.json
index dc5b4f19..c82ae4de 100644
--- a/src/main/resources/assets/bloodmagic/blockstates/sigil_blood_light.json
+++ b/src/main/resources/assets/bloodmagic/blockstates/sigil_blood_light.json
@@ -5,12 +5,10 @@
     "transform": "forge:default-item"
   },
   "variants": {
-    "type": {
-      "normal": {
-        "textures": {
-          "layer0": "bloodmagic:items/BloodLightSigil"
-        }
+    "inventory": [{
+      "textures": {
+        "layer0": "bloodmagic:items/BloodLightSigil"
       }
-    }
+    }]
   }
 }
\ No newline at end of file
diff --git a/src/main/resources/assets/bloodmagic/blockstates/sigil_divination.json b/src/main/resources/assets/bloodmagic/blockstates/sigil_divination.json
index 184354d6..161209bd 100644
--- a/src/main/resources/assets/bloodmagic/blockstates/sigil_divination.json
+++ b/src/main/resources/assets/bloodmagic/blockstates/sigil_divination.json
@@ -5,12 +5,10 @@
     "transform": "forge:default-item"
   },
   "variants": {
-    "type": {
-      "normal": {
-        "textures": {
-          "layer0": "bloodmagic:items/DivinationSigil"
-        }
+    "inventory": [{
+      "textures": {
+        "layer0": "bloodmagic:items/DivinationSigil"
       }
-    }
+    }]
   }
 }
\ No newline at end of file