diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java
index 30fee00f..42e89a1b 100644
--- a/src/main/java/WayofTime/bloodmagic/api/Constants.java
+++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java
@@ -92,6 +92,7 @@ public class Constants
     public static final class Gui
     {
         public static final int TELEPOSER_GUI = 0;
+        public static final int SOUL_FORGE_GUI = 1;
     }
 
     public static class Compat
diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java
index 3bb7b4b0..fbf707ea 100644
--- a/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java
+++ b/src/main/java/WayofTime/bloodmagic/block/BlockSoulForge.java
@@ -1,11 +1,20 @@
 package WayofTime.bloodmagic.block;
 
-import net.minecraft.block.Block;
+import net.minecraft.block.BlockContainer;
 import net.minecraft.block.material.Material;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.InventoryHelper;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.world.World;
 import WayofTime.bloodmagic.BloodMagic;
 import WayofTime.bloodmagic.api.Constants;
+import WayofTime.bloodmagic.tile.TileSoulForge;
+import WayofTime.bloodmagic.tile.TileTeleposer;
 
-public class BlockSoulForge extends Block
+public class BlockSoulForge extends BlockContainer
 {
     public BlockSoulForge()
     {
@@ -15,7 +24,7 @@ public class BlockSoulForge extends Block
         setHardness(2.0F);
         setResistance(5.0F);
         setStepSound(soundTypeMetal);
-        setHarvestLevel("pickaxe", 2);
+        setHarvestLevel("pickaxe", 1);
         setCreativeTab(BloodMagic.tabBloodMagic);
     }
 
@@ -42,4 +51,32 @@ public class BlockSoulForge extends Block
     {
         return 3;
     }
+
+    @Override
+    public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ)
+    {
+        if (world.getTileEntity(pos) instanceof TileSoulForge)
+        {
+            player.openGui(BloodMagic.instance, Constants.Gui.SOUL_FORGE_GUI, world, pos.getX(), pos.getY(), pos.getZ());
+        }
+
+        return true;
+    }
+
+    @Override
+    public void breakBlock(World worldIn, BlockPos pos, IBlockState state)
+    {
+        if (worldIn.getTileEntity(pos) != null && worldIn.getTileEntity(pos) instanceof TileTeleposer)
+        {
+            InventoryHelper.dropInventoryItems(worldIn, pos, (TileTeleposer) worldIn.getTileEntity(pos));
+        }
+
+        super.breakBlock(worldIn, pos, state);
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World worldIn, int meta)
+    {
+        return new TileSoulForge();
+    }
 }
diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java
index 61569de3..6e2e6c07 100644
--- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java
+++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java
@@ -1,13 +1,15 @@
 package WayofTime.bloodmagic.client.gui;
 
-import WayofTime.bloodmagic.api.Constants;
-import WayofTime.bloodmagic.tile.TileTeleposer;
-import WayofTime.bloodmagic.tile.container.ContainerTeleposer;
 import net.minecraft.client.multiplayer.WorldClient;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.util.BlockPos;
 import net.minecraft.world.World;
 import net.minecraftforge.fml.common.network.IGuiHandler;
+import WayofTime.bloodmagic.api.Constants;
+import WayofTime.bloodmagic.tile.TileSoulForge;
+import WayofTime.bloodmagic.tile.TileTeleposer;
+import WayofTime.bloodmagic.tile.container.ContainerSoulForge;
+import WayofTime.bloodmagic.tile.container.ContainerTeleposer;
 
 public class GuiHandler implements IGuiHandler
 {
@@ -20,6 +22,8 @@ public class GuiHandler implements IGuiHandler
         {
         case Constants.Gui.TELEPOSER_GUI:
             return new ContainerTeleposer(player.inventory, (TileTeleposer) world.getTileEntity(pos));
+        case Constants.Gui.SOUL_FORGE_GUI:
+            return new ContainerSoulForge(player.inventory, (TileSoulForge) world.getTileEntity(pos));
         }
 
         return null;
@@ -36,6 +40,8 @@ public class GuiHandler implements IGuiHandler
             {
             case Constants.Gui.TELEPOSER_GUI:
                 return new GuiTeleposer(player.inventory, (TileTeleposer) world.getTileEntity(pos));
+            case Constants.Gui.SOUL_FORGE_GUI:
+                return new GuiSoulForge(player.inventory, (TileSoulForge) world.getTileEntity(pos));
             }
         }
 
diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java
new file mode 100644
index 00000000..a025bc08
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiSoulForge.java
@@ -0,0 +1,51 @@
+package WayofTime.bloodmagic.client.gui;
+
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StatCollector;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+import WayofTime.bloodmagic.api.Constants;
+import WayofTime.bloodmagic.tile.container.ContainerSoulForge;
+import WayofTime.bloodmagic.util.helper.TextHelper;
+
+@SideOnly(Side.CLIENT)
+public class GuiSoulForge extends GuiContainer
+{
+    public GuiSoulForge(InventoryPlayer playerInventory, IInventory tileTeleposer)
+    {
+        super(new ContainerSoulForge(playerInventory, tileTeleposer));
+        this.xSize = 176;
+        this.ySize = 157;
+    }
+
+    @Override
+    protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY)
+    {
+        this.fontRendererObj.drawString(TextHelper.localize("tile.BloodMagic.soulForge.name"), 64, 23, 4210752);
+        this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 8, 47, 4210752);
+    }
+
+    @Override
+    protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY)
+    {
+        GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
+        ResourceLocation soulForgeGuiTextures = new ResourceLocation(Constants.Mod.MODID + ":textures/gui/soulForge.png");
+        this.mc.getTextureManager().bindTexture(soulForgeGuiTextures);
+        int i = (this.width - this.xSize) / 2;
+        int j = (this.height - this.ySize) / 2;
+        this.drawTexturedModalRect(i, j, 0, 0, this.xSize, this.ySize);
+
+        int l = this.getCookProgressScaled(36);
+        this.drawTexturedModalRect(i + 79, j + 32, 176, 0, l, 18);
+    }
+
+    public int getCookProgressScaled(int scale)
+    {
+        double progress = 1;
+        return (int) (progress * scale);
+    }
+}
diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java
index 41eb38a1..2b9f1a61 100644
--- a/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java
+++ b/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java
@@ -65,6 +65,7 @@ public class ModBlocks
         GameRegistry.registerTileEntity(TileSpectralBlock.class, Constants.Mod.MODID + ":" + TileSpectralBlock.class.getSimpleName());
         GameRegistry.registerTileEntity(TilePhantomBlock.class, Constants.Mod.MODID + ":" + TilePhantomBlock.class.getSimpleName());
         GameRegistry.registerTileEntity(TileTeleposer.class, Constants.Mod.MODID + ":" + TileTeleposer.class.getSimpleName());
+        GameRegistry.registerTileEntity(TileSoulForge.class, Constants.Mod.MODID + ":" + TileSoulForge.class.getSimpleName());
     }
 
     public static void initRenders()
diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java
new file mode 100644
index 00000000..cace5af1
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/tile/TileSoulForge.java
@@ -0,0 +1,30 @@
+package WayofTime.bloodmagic.tile;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ITickable;
+
+public class TileSoulForge extends TileInventory implements ITickable
+{
+    public TileSoulForge()
+    {
+        super(6, "soulForge");
+    }
+
+    @Override
+    public void readFromNBT(NBTTagCompound tagCompound)
+    {
+        super.readFromNBT(tagCompound);
+    }
+
+    @Override
+    public void writeToNBT(NBTTagCompound tagCompound)
+    {
+        super.writeToNBT(tagCompound);
+    }
+
+    @Override
+    public void update()
+    {
+
+    }
+}
diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java
new file mode 100644
index 00000000..6aae5609
--- /dev/null
+++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerSoulForge.java
@@ -0,0 +1,100 @@
+package WayofTime.bloodmagic.tile.container;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import WayofTime.bloodmagic.api.soul.ISoul;
+import WayofTime.bloodmagic.api.soul.ISoulGem;
+import WayofTime.bloodmagic.item.ItemTelepositionFocus;
+
+public class ContainerSoulForge extends Container
+{
+    private final IInventory tileForge;
+
+    public ContainerSoulForge(InventoryPlayer inventoryPlayer, IInventory tileForge)
+    {
+        this.tileForge = tileForge;
+        this.addSlotToContainer(new SlotSoul(tileForge, 0, 152, 51));
+
+        for (int i = 0; i < 3; i++)
+        {
+            for (int j = 0; j < 9; j++)
+            {
+                addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 75 + i * 18));
+            }
+        }
+
+        for (int i = 0; i < 9; i++)
+        {
+            addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 133));
+        }
+    }
+
+    @Override
+    public ItemStack transferStackInSlot(EntityPlayer player, int slot)
+    {
+        ItemStack stack = null;
+        Slot slotObject = inventorySlots.get(slot);
+        int slots = inventorySlots.size();
+
+        if (slotObject != null && slotObject.getHasStack())
+        {
+            ItemStack stackInSlot = slotObject.getStack();
+            stack = stackInSlot.copy();
+
+            if (stack.getItem() instanceof ItemTelepositionFocus)
+            {
+                if (slot <= slots)
+                {
+                    if (!this.mergeItemStack(stackInSlot, 0, slots, false))
+                    {
+                        return null;
+                    }
+                } else if (!this.mergeItemStack(stackInSlot, slots, 36 + slots, false))
+                {
+                    return null;
+                }
+            }
+
+            if (stackInSlot.stackSize == 0)
+            {
+                slotObject.putStack(null);
+            } else
+            {
+                slotObject.onSlotChanged();
+            }
+
+            if (stackInSlot.stackSize == stack.stackSize)
+            {
+                return null;
+            }
+
+            slotObject.onPickupFromSlot(player, stackInSlot);
+        }
+
+        return stack;
+    }
+
+    @Override
+    public boolean canInteractWith(EntityPlayer playerIn)
+    {
+        return this.tileForge.isUseableByPlayer(playerIn);
+    }
+
+    private class SlotSoul extends Slot
+    {
+        public SlotSoul(IInventory inventory, int slotIndex, int x, int y)
+        {
+            super(inventory, slotIndex, x, y);
+        }
+
+        @Override
+        public boolean isItemValid(ItemStack itemStack)
+        {
+            return itemStack.getItem() instanceof ISoulGem || itemStack.getItem() instanceof ISoul;
+        }
+    }
+}
diff --git a/src/main/resources/assets/bloodmagic/textures/gui/soulForge.png b/src/main/resources/assets/bloodmagic/textures/gui/soulForge.png
new file mode 100644
index 00000000..929cf156
Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/gui/soulForge.png differ