diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
index 026e55214..3980b465d 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -1,20 +1,6 @@
 package net.minecraft.client;
 
-import static net.minecraft.core.Global.*;
-import static org.lwjgl.opengl.GL11.*;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Random;
-
-import org.lwjgl.LWJGLException;
-import org.lwjgl.input.Keyboard;
-import org.lwjgl.input.Mouse;
-import org.lwjgl.opengl.Display;
-
 import com.mojang.nbt.CompoundTag;
-
 import net.minecraft.client.achievement.stat.StatStringFormatKeyInv;
 import net.minecraft.client.discord.RichPresenceHandlerThread;
 import net.minecraft.client.entity.ClientSkinVariantList;
@@ -103,6 +89,7 @@ import net.minecraft.core.UnexpectedThrowable;
 import net.minecraft.core.achievement.AchievementList;
 import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.achievement.stat.StatsCounter;
+import net.minecraft.core.block.Block;
 import net.minecraft.core.block.BlockLeavesBase;
 import net.minecraft.core.crafting.legacy.CraftingManager;
 import net.minecraft.core.data.DataLoader;
@@ -111,6 +98,7 @@ import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.SkinVariantList;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumOS;
+import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.PlayerProfile;
@@ -142,6 +130,35 @@ import net.minecraft.core.world.save.LevelStorage;
 import net.minecraft.core.world.save.SaveConverters;
 import net.minecraft.core.world.save.SaveFormats;
 import net.minecraft.core.world.save.mcregion.SaveFormat19134;
+import org.lwjgl.LWJGLException;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.Display;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Random;
+
+import static net.minecraft.core.Global.CURRENT_SAVE_VERSION;
+import static org.lwjgl.opengl.GL11.GL_ALPHA_TEST;
+import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
+import static org.lwjgl.opengl.GL11.glAlphaFunc;
+import static org.lwjgl.opengl.GL11.glBindTexture;
+import static org.lwjgl.opengl.GL11.glClear;
+import static org.lwjgl.opengl.GL11.glClearColor;
+import static org.lwjgl.opengl.GL11.glClearDepth;
+import static org.lwjgl.opengl.GL11.glColor4f;
+import static org.lwjgl.opengl.GL11.glCullFace;
+import static org.lwjgl.opengl.GL11.glDepthFunc;
+import static org.lwjgl.opengl.GL11.glDisable;
+import static org.lwjgl.opengl.GL11.glEnable;
+import static org.lwjgl.opengl.GL11.glLoadIdentity;
+import static org.lwjgl.opengl.GL11.glMatrixMode;
+import static org.lwjgl.opengl.GL11.glOrtho;
+import static org.lwjgl.opengl.GL11.glShadeModel;
+import static org.lwjgl.opengl.GL11.glTranslatef;
+import static org.lwjgl.opengl.GL11.glViewport;
 
 // Referenced classes of package net.minecraft.client:
 //            MinecraftApplet
@@ -332,6 +349,11 @@ public class Minecraft
     public void startGame() throws LWJGLException
     {
 		mcDataDir = getMinecraftDir();
+
+        // Manually initialize blocks and items
+        Block.initializeBlocks();
+        Item.initializeItems();
+
 		gameSettings = new GameSettings(this, mcDataDir);
 
 		GameResolution.defaultWidth = gameSettings.windowWidth.value;
@@ -452,6 +474,7 @@ public class Minecraft
         
         OpenGLHelper.checkError("post startup");
         ingameGUI = new GuiIngame(this);
+
         new Registries();
 
         // Load vanilla recipes
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
index 3bc301f0e..1775c1072 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
@@ -181,7 +181,7 @@ public class ItemModelDispatcher extends Dispatcher<Item, ItemModel> {
         addDispatch(new ItemModelStandard(Item.quartz, "minecraft"));
         addDispatch(new ItemModelStandard(Item.olivine, "minecraft"));
         addDispatch(new ItemModelStandard(Item.ammoPebble, "minecraft"));
-        addDispatch(new ItemModelStandard(Item.cherry, "minecraft"));
+        addDispatch(new ItemModelStandard(Item.foodCherry, "minecraft"));
         addDispatch(new ItemModelStandard(Item.bucketIcecream, "minecraft"));
         addDispatch(new ItemModelStandard(Item.ammoArrowPurple, "minecraft"));
         addDispatch(new ItemModelLabel(Item.label, "minecraft"));
diff --git a/src/main/java/net/minecraft/core/block/Block.java b/src/main/java/net/minecraft/core/block/Block.java
index 96f29d0fc..12f58671e 100644
--- a/src/main/java/net/minecraft/core/block/Block.java
+++ b/src/main/java/net/minecraft/core/block/Block.java
@@ -1,13 +1,7 @@
 package net.minecraft.core.block;
 
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-
 import com.b100.utils.Utils;
-
 import net.minecraft.core.HitResult;
 import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.block.entity.TileEntity;
@@ -31,15 +25,10 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.ItemToolShears;
 import net.minecraft.core.item.block.ItemBlock;
 import net.minecraft.core.item.block.ItemBlockAlgae;
-import net.minecraft.core.item.block.ItemBlockChestLegacy;
 import net.minecraft.core.item.block.ItemBlockLadder;
 import net.minecraft.core.item.block.ItemBlockLamp;
-import net.minecraft.core.item.block.ItemBlockLayer;
 import net.minecraft.core.item.block.ItemBlockLayerLeaves;
-import net.minecraft.core.item.block.ItemBlockLeaves;
 import net.minecraft.core.item.block.ItemBlockPainted;
-import net.minecraft.core.item.block.ItemBlockPiston;
-import net.minecraft.core.item.block.ItemBlockSlab;
 import net.minecraft.core.item.block.ItemBlockSlabPainted;
 import net.minecraft.core.item.block.ItemBlockStairsPainted;
 import net.minecraft.core.util.helper.Side;
@@ -48,6 +37,14 @@ import net.minecraft.core.util.phys.BoundingVolume;
 import net.minecraft.core.util.phys.Vec3d;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.function.Function;
+import java.util.function.Supplier;
 
 public class Block
     implements ITaggable<Block>, IItemConvertible
@@ -169,6 +166,14 @@ public class Block
         withHardness(-1F);
         return this;
     }
+    public Block setBlockItem(@NotNull Supplier<Item> itemSupplier){
+        this.blockItemSupplier = itemSupplier;
+        return this;
+    }
+    public Block setBlockItem(@NotNull Function<Block, Item> itemSupplier){
+        this.blockItemSupplier = () -> itemSupplier.apply(this);
+        return this;
+    }
 
     public float getHardness()
     {
@@ -744,19 +749,19 @@ public class Block
     public static final Map<String, Integer> keyToIdMap = new HashMap<>();
     public static int highestBlockId = 0;
 
-    public static final Block stone = new BlockStone("stone", 1).withHardness(1.5F).withBlastResistance(10F)
+    public static final Block stone = new BlockStone("stone", 1, () -> Block.cobbleStone).withHardness(1.5F).withBlastResistance(10F)
             .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block basalt = new BlockStone("basalt", 2).withHardness(1.5F).withBlastResistance(10F)
+    public static final Block basalt = new BlockStone("basalt", 2, () -> Block.cobbleBasalt).withHardness(1.5F).withBlastResistance(10F)
             .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block limestone = new BlockStone("limestone", 3).withHardness(1.5F).withBlastResistance(10F)
+    public static final Block limestone = new BlockStone("limestone", 3, () -> Block.cobbleLimestone).withHardness(1.5F).withBlastResistance(10F)
             .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block granite = new BlockStone("granite", 4).withHardness(1.5F).withBlastResistance(10F)
+    public static final Block granite = new BlockStone("granite", 4, () -> Block.cobbleGranite).withHardness(1.5F).withBlastResistance(10F)
             .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block marble = new Block("marble", 5, Material.stone).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block slate = new Block("slate", 6, Material.stone).withHardness(1.5F).withBlastResistance(10F)
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-    public static final Block permafrost = new BlockStone("permafrost", 7).withHardness(1.5F).withBlastResistance(10F)
+    public static final Block permafrost = new BlockStone("permafrost", 7, () -> Block.cobblePermafrost).withHardness(1.5F).withBlastResistance(10F)
             .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
 
     public static final Block cobbleStone = new Block("cobble.stone", 10, Material.stone).withHardness(2.0F).withBlastResistance(10F)
@@ -807,6 +812,7 @@ public class Block
     public static final Block planksOak = new Block("planks.oak", 50, Material.wood).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
     public static final Block planksOakPainted = new BlockPlanksPainted("planks.oak.painted", 51).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new ItemBlockPainted(b, false))
             .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
 
     public static final Block torchCoal = new BlockTorch("torch.coal", 60).withHardness(0.0F).withLightEmission(0.9375F).withDisabledNeighborNotifyOnMetadataChange()
@@ -815,22 +821,26 @@ public class Block
 //    .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
 
     public static final Block ladderOak = new BlockLadder("ladder.oak", 70).withHardness(0.4F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new ItemBlockLadder((BlockLadder) b))
             .withTags(BlockTags.MINEABLE_BY_AXE);
 
     public static final Block fencePlanksOak = new BlockFence("fence.planks.oak", 80).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE, BlockTags.CAN_HANG_OFF);
     public static final Block fencePlanksOakPainted = new BlockFencePainted("fence.planks.oak.painted", 81).withHardness(2.0F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new ItemBlockPainted(b, false))
             .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE, BlockTags.CAN_HANG_OFF);
 
     public static final Block fencegatePlanksOak = new BlockFenceGate("fencegate.planks.oak", 90).withHardness(2F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
     public static final Block fencegatePlanksOakPainted = new BlockFenceGatePainted("fencegate.planks.oak.painted", 91).withHardness(2F).withBlastResistance(5F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new ItemBlockPainted(b, true))
             .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
 
     public static final Block bookshelfPlanksOak = new Block("bookshelf.planks.oak", 100, Material.wood).withHardness(1.5F)
             .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
 
     public static final Block wool = new BlockWool("wool", 110).withHardness(0.8F).withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new ItemBlockPainted(b, false))
             .withTags(BlockTags.MINEABLE_BY_SHEARS);
     public static final Block rope = new BlockRope("rope", 111).withHardness(0.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.PREVENT_MOB_SPAWNS, BlockTags.CAN_HANG_OFF);
@@ -893,6 +903,7 @@ public class Block
     public static final Block slabBrickGranite = new BlockSlab(brickGranite, 153).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block slabPlanksOakPainted = new BlockSlabPainted(planksOakPainted, 154).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .setBlockItem(ItemBlockSlabPainted::new)
             .withTags(BlockTags.MINEABLE_BY_AXE);
     public static final Block slabBrickSlate = new BlockSlab(brickSlate, 155).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
@@ -928,6 +939,7 @@ public class Block
     public static final Block stairsBrickClay = new BlockStairs(brickClay, 170).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block stairsPlanksOakPainted = new BlockStairs(planksOakPainted, 171).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
+            .setBlockItem(ItemBlockStairsPainted::new)
             .withTags(BlockTags.MINEABLE_BY_AXE);
     public static final Block stairsBrickSlate = new BlockStairs(brickSlate, 172).withDisabledNeighborNotifyOnMetadataChange().withLitInteriorSurface(true)
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
@@ -1071,6 +1083,7 @@ public class Block
     public static final Block spinifex = new BlockSpinifex("spinifex", 323).withHardness(0.0F)
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH);
     public static final Block algae = new BlockAlgae("algae", 324, Material.plant).withHardness(0.0F).withLitInteriorSurface(true)
+            .setBlockItem((b) -> new ItemBlockAlgae(b))
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH);
 
     public static final Block flowerYellow = new BlockFlower("flower.yellow", 330).setKilledByWeather().setBonemealable().withHardness(0.0F)
@@ -1243,6 +1256,7 @@ public class Block
     public static final Block trapdoorGlass = new BlockTrapDoor("trapdoor.glass", 572, Material.glass, false).withHardness(0.3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block trapdoorPlanksOakPainted = new BlockTrapDoorPainted("trapdoor.planks.oak.painted", 573, Material.wood).withHardness(3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new ItemBlockPainted(b, true))
             .withTags(BlockTags.MINEABLE_BY_AXE);
 
     public static final Block tnt = new BlockTNT("tnt", 580).withHardness(0.0F);
@@ -1256,8 +1270,10 @@ public class Block
     public static final Block doorIronTop = new BlockDoor("door.iron.top", 593, Material.metal, true).withHardness(5F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block doorPlanksOakPaintedBottom = new BlockDoorPainted("door.planks.oak.painted.bottom", 594, Material.wood, false).withHardness(3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new ItemBlockPainted(b, true))
             .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
     public static final Block doorPlanksOakPaintedTop = new BlockDoorPainted("door.planks.oak.painted.top", 595, Material.wood, true).withHardness(3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new ItemBlockPainted(b, true))
             .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
     public static final Block doorGlassBottom = new BlockDoorGlass("door.glass.bottom", 596, Material.glass, false).withHardness(0.3F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
@@ -1311,6 +1327,7 @@ public class Block
     public static final Block chestPlanksOak = new BlockChest("chest.planks.oak", 682, Material.wood).withHardness(2.5F).withBlastResistance(5.0f).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
             .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
     public static final Block chestPlanksOakPainted = new BlockChestPainted("chest.planks.oak.painted", 683, Material.wood).withHardness(2.5F).withBlastResistance(5.0f).withDisabledNeighborNotifyOnMetadataChange().withImmovableFlagSet()
+            .setBlockItem((b) -> new ItemBlockPainted(b, true))
             .withTags(BlockTags.FENCES_CONNECT, BlockTags.MINEABLE_BY_AXE);
 
     public static final Block cropsWheat = new BlockCropsWheat("crops.wheat", 690).withHardness(0.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
@@ -1329,11 +1346,12 @@ public class Block
     public static final Block flag = new BlockFlag("flag", 712, Material.wood).withHardness(1.0F)
             .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
 
-    public static final Block layerSnow = new BlockLayerSnow("layer.snow", 720, Material.topSnow).withHardness(0.1F).withLitInteriorSurface(true)
+    public static final Block layerSnow = new BlockLayerSnow("layer.snow", 720, Material.topSnow).setFullBlockID(() -> Block.blockSnow.id).withHardness(0.1F).withLitInteriorSurface(true)
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.MINEABLE_BY_SHOVEL, BlockTags.OVERRIDE_STEPSOUND);
-    public static final Block layerLeavesOak = new BlockLayerLeaves("layer.leaves.oak", 721, Material.leaves).withLitInteriorSurface(true)
+    public static final Block layerLeavesOak = new BlockLayerLeaves("layer.leaves.oak", 721, Material.leaves).setFullBlockID(() -> Block.leavesOak.id).withLitInteriorSurface(true)
+            .setBlockItem(ItemBlockLayerLeaves::new)
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.MINEABLE_BY_SHEARS, BlockTags.MINEABLE_BY_SWORD, BlockTags.MINEABLE_BY_AXE, BlockTags.MINEABLE_BY_HOE);
-    public static final Block layerSlate = new BlockLayerSlate("layer.slate", 722, Material.stone).withHardness(1.5F).withBlastResistance(10F).withLitInteriorSurface(true)
+    public static final Block layerSlate = new BlockLayerSlate("layer.slate", 722, Material.stone).setFullBlockID(() -> Block.slate.id).withHardness(1.5F).withBlastResistance(10F).withLitInteriorSurface(true)
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
 
     public static final Block ice = new BlockIce("ice", 730).withHardness(0.5F).withLightBlock(3)
@@ -1389,19 +1407,20 @@ public class Block
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.NOT_IN_CREATIVE_MENU);
 
     public static final Block lampIdle = new BlockLamp("lamp.idle", 850, false).withHardness(0.5F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+            .setBlockItem((b) -> new ItemBlockLamp(b))
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block lampActive = new BlockLamp("lamp.active", 851, true).withLightEmission(0.9375F).withHardness(0.5F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
 
-    public static final Block lanternFireflyGreen = new BlockLanternFirefly("lantern.firefly.green", 870, EntityFireflyCluster.FireflyColor.GREEN).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+    public static final Block lanternFireflyGreen = new BlockLanternFirefly("lantern.firefly.green", 870, EntityFireflyCluster.FireflyColor.GREEN, () -> Item.lanternFireflyGreen).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block lanternFireflyBlue = new BlockLanternFirefly("lantern.firefly.blue", 871, EntityFireflyCluster.FireflyColor.BLUE).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+    public static final Block lanternFireflyBlue = new BlockLanternFirefly("lantern.firefly.blue", 871, EntityFireflyCluster.FireflyColor.BLUE, () -> Item.lanternFireflyBlue).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block lanternFireflyOrange = new BlockLanternFirefly("lantern.firefly.orange", 872, EntityFireflyCluster.FireflyColor.ORANGE).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+    public static final Block lanternFireflyOrange = new BlockLanternFirefly("lantern.firefly.orange", 872, EntityFireflyCluster.FireflyColor.ORANGE, () -> Item.lanternFireflyOrange).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block lanternFireflyRed = new BlockLanternFirefly("lantern.firefly.red", 873, EntityFireflyCluster.FireflyColor.RED).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+    public static final Block lanternFireflyRed = new BlockLanternFirefly("lantern.firefly.red", 873, EntityFireflyCluster.FireflyColor.RED, () -> Item.lanternFireflyRed).withHardness(0.1F).withLightEmission(0.9375F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
-    public static final Block jarGlass = new BlockJar("jar.glass", 874).withHardness(0.1F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
+    public static final Block jarGlass = new BlockJar("jar.glass", 874, () -> Item.jar).withHardness(0.1F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.MINEABLE_BY_PICKAXE, BlockTags.NOT_IN_CREATIVE_MENU);
 
     public static final Block overlayPebbles = new BlockOverlayPebbles("overlay.pebbles", 880, Material.decoration).withHardness(0.0F).withDisabledStats().withDisabledNeighborNotifyOnMetadataChange()
@@ -1448,69 +1467,17 @@ public class Block
     public boolean hasOverbright = false;
     public int dropOverride = -1;
     public boolean immovable = false;
-
-    static
-    {      
-    	((BlockStone)stone).setCobblestoneType(cobbleStone);
-    	((BlockStone)limestone).setCobblestoneType(cobbleLimestone);
-    	((BlockStone)granite).setCobblestoneType(cobbleGranite);
-    	((BlockStone)basalt).setCobblestoneType(cobbleBasalt);
-        ((BlockStone)permafrost).setCobblestoneType(cobblePermafrost);
-    	
-    	((BlockLanternFirefly)lanternFireflyGreen).setItem(Item.lanternFireflyGreen);
-    	((BlockLanternFirefly)lanternFireflyOrange).setItem(Item.lanternFireflyOrange);
-    	((BlockLanternFirefly)lanternFireflyBlue).setItem(Item.lanternFireflyBlue);
-        ((BlockLanternFirefly)lanternFireflyRed).setItem(Item.lanternFireflyRed);
-        ((BlockJar)jarGlass).setItem(Item.jar);
-
-        ((BlockEdible)cake).setItem(Item.foodCake);
-        ((BlockEdible)pumpkinPie).setItem(Item.foodPumpkinPie);
-
+    @NotNull
+    public Supplier<Item> blockItemSupplier = () -> new ItemBlock(this);
+    public static void initializeBlocks(){
         BlockMoss.initMossMap();
 
-        ((BlockLayerBase)layerSnow).setFullBlockID(Block.blockSnow.id);
-        ((BlockLayerBase)layerLeavesOak).setFullBlockID(Block.leavesOak.id);
-        ((BlockLayerBase)layerSlate).setFullBlockID(Block.slate.id);
-
-        Item.itemsList[wool.id] = new ItemBlockPainted(wool, false);
-        Item.itemsList[pistonBase.id] = new ItemBlockPiston(pistonBase);
-        Item.itemsList[pistonBaseSticky.id] = new ItemBlockPiston(pistonBaseSticky);
-        Item.itemsList[planksOakPainted.id] = new ItemBlockPainted(planksOakPainted, false);
-        Item.itemsList[chestPlanksOakPainted.id] = new ItemBlockPainted(chestPlanksOakPainted, true);
-        Item.itemsList[fencePlanksOakPainted.id] = new ItemBlockPainted(fencePlanksOakPainted, false);
-        Item.itemsList[fencegatePlanksOakPainted.id] = new ItemBlockPainted(fencegatePlanksOakPainted, true);
-        Item.itemsList[doorPlanksOakPaintedBottom.id] = new ItemBlockPainted(doorPlanksOakPaintedBottom, true);
-        Item.itemsList[doorPlanksOakPaintedTop.id] = new ItemBlockPainted(doorPlanksOakPaintedTop, true);
-        Item.itemsList[trapdoorPlanksOakPainted.id] = new ItemBlockPainted(trapdoorPlanksOakPainted, true);
-        Item.itemsList[lampIdle.id] = new ItemBlockLamp(lampIdle);
-        Item.itemsList[algae.id] = new ItemBlockAlgae(algae);
-        Item.itemsList[chestLegacy.id] = new ItemBlockChestLegacy(chestLegacy);
-        Item.itemsList[layerLeavesOak.id] = new ItemBlockLayerLeaves(layerLeavesOak);
-        Item.itemsList[ladderOak.id] = new ItemBlockLadder((BlockLadder) ladderOak);
-
-        Item.itemsList[slabPlanksOakPainted.id] = new ItemBlockSlabPainted(slabPlanksOakPainted);
-        Item.itemsList[stairsPlanksOakPainted.id] = new ItemBlockStairsPainted(stairsPlanksOakPainted);
-
         for(int i = 0; i < blocksList.length; i++)
         {
             if(blocksList[i] != null && Item.itemsList[i] == null)
             {
-                if (blocksList[i] instanceof BlockLeavesBase)
-                {
-                    Item.itemsList[i] = new ItemBlockLeaves(blocksList[i]);
-                }
-                else if (blocksList[i] instanceof BlockLayerBase)
-                {
-                    Item.itemsList[i] = new ItemBlockLayer(blocksList[i]);
-                }
-                else if (blocksList[i] instanceof BlockSlab)
-                {
-                    Item.itemsList[i] = new ItemBlockSlab(blocksList[i]);
-                }
-                else
-                {
-                    Item.itemsList[i] = new ItemBlock(blocksList[i]);
-                }
+                Block block = blocksList[i];
+                Item.itemsList[i] = block.blockItemSupplier.get();
                 blocksList[i].initializeBlock();
             }
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockCake.java b/src/main/java/net/minecraft/core/block/BlockCake.java
index 672778d78..8dc8b2ec7 100644
--- a/src/main/java/net/minecraft/core/block/BlockCake.java
+++ b/src/main/java/net/minecraft/core/block/BlockCake.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.item.Item;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.WorldSource;
 
@@ -8,7 +9,7 @@ public class BlockCake extends BlockEdible
 
 	public BlockCake(String key, int id)
     {
-        super(key, id, 6, 3);
+        super(key, id, 6, 3, () -> Item.foodCake);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockEdible.java b/src/main/java/net/minecraft/core/block/BlockEdible.java
index fde544c91..6feeac636 100644
--- a/src/main/java/net/minecraft/core/block/BlockEdible.java
+++ b/src/main/java/net/minecraft/core/block/BlockEdible.java
@@ -7,16 +7,29 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.function.Supplier;
 
 public abstract class BlockEdible extends Block {
+    public Item item;
+    @NotNull
+    private final Supplier<Item> itemSupplier;
+    public int maxBites;
+    public int healAmount;
 
-    public BlockEdible(String key, int id, int maxBites, int healAmount)
+    public BlockEdible(String key, int id, int maxBites, int healAmount, @NotNull Supplier<Item> dropItemSupplier)
     {
         super(key, id, Material.cake);
         this.maxBites = maxBites;
         this.healAmount = healAmount;
+        this.itemSupplier = dropItemSupplier;
         setTicking(true);
     }
+    @Override
+    public void initializeBlock() {
+        this.item = itemSupplier.get();
+    }
 
     @Override
     public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
@@ -98,12 +111,4 @@ public abstract class BlockEdible extends Block {
         return world.getBlockMaterial(x, y - 1, z).isSolid();
     }
 
-    public void setItem(Item item) {
-        this.item = item;
-    }
-
-    public Item item;
-    public int maxBites;
-    public int healAmount;
-
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockJar.java b/src/main/java/net/minecraft/core/block/BlockJar.java
index 2d6271f73..f2dcf713c 100644
--- a/src/main/java/net/minecraft/core/block/BlockJar.java
+++ b/src/main/java/net/minecraft/core/block/BlockJar.java
@@ -12,13 +12,22 @@ import net.minecraft.core.item.block.ItemBlock;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.function.Supplier;
 
 public class BlockJar extends BlockTileEntity{
 
     public Item item;
-    public BlockJar(String key, int id) {
+    private final Supplier<Item> itemSupplier;
+    public BlockJar(String key, int id, @NotNull Supplier<Item> itemSupplier) {
         super(key, id, Material.glass);
         setBlockBounds(0.3125f, 0, 0.3125f, 1 - 0.3125f, 0.375f, 1 - 0.3125f);
+        this.itemSupplier = itemSupplier;
+    }
+    @Override
+    public void initializeBlock() {
+        this.item = itemSupplier.get();
     }
 
     @Override
@@ -133,8 +142,4 @@ public class BlockJar extends BlockTileEntity{
         return new TileEntityFlowerJar();
     }
 
-    public void setItem(Item item) {
-        this.item = item;
-    }
-
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java b/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java
index 8278fb1fe..9fa4b9588 100644
--- a/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java
+++ b/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java
@@ -13,19 +13,27 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.Random;
+import java.util.function.Supplier;
 
 public class BlockLanternFirefly extends Block{
 
     public Item item;
+    private final Supplier<Item> itemSupplier;
     private final EntityFireflyCluster.FireflyColor color;
 
-    public BlockLanternFirefly(String key, int id, EntityFireflyCluster.FireflyColor colour) {
+    public BlockLanternFirefly(String key, int id, EntityFireflyCluster.FireflyColor colour, @NotNull Supplier<Item> itemSupplier) {
         super(key, id, Material.glass);
         this.color = colour;
+        this.itemSupplier = itemSupplier;
         setBlockBounds(0.3125f, 0, 0.3125f, 1 - 0.3125f, 0.5f, 1 - 0.3125f);
     }
+    @Override
+    public void initializeBlock() {
+        this.item = itemSupplier.get();
+    }
 
     @Override
     public AABB getCollisionBoundingBoxFromPool(WorldSource world, int x, int y, int z)
@@ -164,9 +172,4 @@ public class BlockLanternFirefly extends Block{
         	world.entityJoinedWorld(entity);
     	}
     }
-
-    public void setItem(Item item) {
-        this.item = item;
-    }
-
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockLayerBase.java b/src/main/java/net/minecraft/core/block/BlockLayerBase.java
index ab45fb414..1cb3d1f4d 100644
--- a/src/main/java/net/minecraft/core/block/BlockLayerBase.java
+++ b/src/main/java/net/minecraft/core/block/BlockLayerBase.java
@@ -1,9 +1,12 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
+import net.minecraft.core.item.block.ItemBlockLayer;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.WorldSource;
 
+import java.util.function.Supplier;
+
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, World, AxisAlignedBB, 
 //            IBlockAccess, Item, EntityItem, ItemStack, 
@@ -11,17 +14,22 @@ import net.minecraft.core.world.WorldSource;
 
 public abstract class BlockLayerBase extends Block
 {
-
+    private Supplier<Integer> idSupplier = null;
 	public int fullBlockID = -1;
 	
 	public BlockLayerBase(String key, int id, Material material)
     {
         super(key, id, material);
         setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F);
+        setBlockItem(() -> new ItemBlockLayer(this));
+    }
+    @Override
+    public void initializeBlock() {
+        fullBlockID = idSupplier.get();
     }
-    public Block setFullBlockID(int id)
+    public BlockLayerBase setFullBlockID(Supplier<Integer> idSupplier)
     {
-    	fullBlockID = id;
+    	this.idSupplier = idSupplier;
     	return this;
     }
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesBase.java b/src/main/java/net/minecraft/core/block/BlockLeavesBase.java
index c28493488..d9383c65a 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesBase.java
+++ b/src/main/java/net/minecraft/core/block/BlockLeavesBase.java
@@ -1,16 +1,17 @@
 package net.minecraft.core.block;
 
-import java.util.Random;
-
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.block.ItemBlockLeaves;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.season.Season;
 
+import java.util.Random;
+
 // Referenced classes of package net.minecraft.src:
 //            Block, IBlockAccess, Material
 
@@ -21,6 +22,7 @@ public abstract class BlockLeavesBase extends Block
     {
         super(key, id, material);
         setTicking(true);
+        setBlockItem(() -> new ItemBlockLeaves(this));
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesCherryFlowering.java b/src/main/java/net/minecraft/core/block/BlockLeavesCherryFlowering.java
index a5ff1be95..faa4f1e7f 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesCherryFlowering.java
+++ b/src/main/java/net/minecraft/core/block/BlockLeavesCherryFlowering.java
@@ -27,7 +27,7 @@ public class BlockLeavesCherryFlowering extends BlockLeavesCherry implements IBo
         if (growthRate == 0) return null;
         else
         {
-            return new ItemStack[] { new ItemStack(Item.cherry, world.rand.nextInt(2) + 1) };
+            return new ItemStack[] { new ItemStack(Item.foodCherry, world.rand.nextInt(2) + 1) };
         }
     }
 
diff --git a/src/main/java/net/minecraft/core/block/BlockPumpkinPie.java b/src/main/java/net/minecraft/core/block/BlockPumpkinPie.java
index 61813f766..95e5075e7 100644
--- a/src/main/java/net/minecraft/core/block/BlockPumpkinPie.java
+++ b/src/main/java/net/minecraft/core/block/BlockPumpkinPie.java
@@ -1,18 +1,15 @@
 package net.minecraft.core.block;
 
-import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.item.Item;
 import net.minecraft.core.util.phys.AABB;
-import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
-import java.util.Random;
-
 public class BlockPumpkinPie extends BlockEdible
 {
 
     public BlockPumpkinPie(String key, int id)
     {
-        super(key, id, 4, 5);
+        super(key, id, 4, 5, () -> Item.foodPumpkinPie);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockSlab.java b/src/main/java/net/minecraft/core/block/BlockSlab.java
index ca636d34f..6baeb3387 100644
--- a/src/main/java/net/minecraft/core/block/BlockSlab.java
+++ b/src/main/java/net/minecraft/core/block/BlockSlab.java
@@ -6,6 +6,7 @@ import net.minecraft.core.entity.EntityLiving;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.item.block.ItemBlockSlab;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
@@ -24,6 +25,7 @@ public class BlockSlab extends Block
     public BlockSlab(Block modelBlock, int id)
     {
         this(modelBlock, id, 0);
+        setBlockItem(() -> new ItemBlockSlab(this));
     }
     
     public BlockSlab(Block modelBlock, int id, int modelBlockMetadata)
diff --git a/src/main/java/net/minecraft/core/block/BlockStone.java b/src/main/java/net/minecraft/core/block/BlockStone.java
index 14604589e..a6495a688 100644
--- a/src/main/java/net/minecraft/core/block/BlockStone.java
+++ b/src/main/java/net/minecraft/core/block/BlockStone.java
@@ -11,15 +11,22 @@ import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.chunk.Chunk;
 
 import java.util.Random;
+import java.util.function.Supplier;
 
 public class BlockStone extends Block {
 	
 	public Block cobblestone;
+	private final Supplier<Block> blockSupplier;
 	
-	public BlockStone(String key, int id) {
+	public BlockStone(String key, int id, Supplier<Block> cobbleStoneSupplier) {
 		super(key, id, Material.stone);
+		this.blockSupplier = cobbleStoneSupplier;
+	}
+
+	@Override
+	public void initializeBlock() {
+		this.cobblestone = blockSupplier.get();
 	}
-	
 	@Override
 	public void harvestBlock(World world, EntityPlayer player, int x, int y, int z, int meta, TileEntity tileEntity)
 	{
@@ -40,10 +47,6 @@ public class BlockStone extends Block {
 				world.spawnParticle("slimechunk", x, y, z, 0.0D, 0.0D, 0.0D, 0);
 		}
 	}
-	
-	public void setCobblestoneType(Block block) {
-		this.cobblestone = block;
-	}
 
 	@Override
 	public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
diff --git a/src/main/java/net/minecraft/core/block/piston/BlockPistonBase.java b/src/main/java/net/minecraft/core/block/piston/BlockPistonBase.java
index 935fb9fd7..f54487a8f 100644
--- a/src/main/java/net/minecraft/core/block/piston/BlockPistonBase.java
+++ b/src/main/java/net/minecraft/core/block/piston/BlockPistonBase.java
@@ -1,13 +1,12 @@
 package net.minecraft.core.block.piston;
 
-import java.util.ArrayList;
-
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.logic.PistonDirections;
 import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.logic.PistonDirections;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.EntityLiving;
 import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.item.block.ItemBlockPiston;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
@@ -15,6 +14,8 @@ import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
+import java.util.ArrayList;
+
 public class BlockPistonBase extends Block
 {
 
@@ -22,6 +23,7 @@ public class BlockPistonBase extends Block
     {
         super(key, id, Material.piston);
         this.isSticky = isSticky;
+        setBlockItem(() -> new ItemBlockPiston(this));
         withHardness(0.5F);
     }
 
diff --git a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFood.java b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFood.java
index 53486903e..8573976ae 100644
--- a/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFood.java
+++ b/src/main/java/net/minecraft/core/crafting/legacy/recipe/RecipesFood.java
@@ -29,7 +29,7 @@ public class RecipesFood
             "#X#", Character.valueOf('X'), new ItemStack(Item.dye, 1, 3), Character.valueOf('#'), Item.wheat
         });
         craftingmanager.addRecipe(new ItemStack(Item.bucketIcecream), false, true, true, new Object[] {
-                " Y ", "#O#"," X ", Character.valueOf('O'), new ItemStack(Item.ammoSnowball), Character.valueOf('X'), new ItemStack(Item.bucketMilk), Character.valueOf('#'), new ItemStack(Item.dye, 1, 3), Character.valueOf('Y'), new ItemStack(Item.cherry)
+                " Y ", "#O#"," X ", Character.valueOf('O'), new ItemStack(Item.ammoSnowball), Character.valueOf('X'), new ItemStack(Item.bucketMilk), Character.valueOf('#'), new ItemStack(Item.dye, 1, 3), Character.valueOf('Y'), new ItemStack(Item.foodCherry)
         });
     }
 }
diff --git a/src/main/java/net/minecraft/core/item/Item.java b/src/main/java/net/minecraft/core/item/Item.java
index 13beb787b..8988e2a48 100644
--- a/src/main/java/net/minecraft/core/item/Item.java
+++ b/src/main/java/net/minecraft/core/item/Item.java
@@ -406,7 +406,7 @@ public class Item
     public static Item quartz = (new Item("quartz", 16512));
     public static Item olivine = (new Item("olivine", 16513));
     public static Item ammoPebble = (new ItemPebble("ammo.pebble", 16514));
-    public static Item cherry = (new ItemFood("food.cherry", 16515, 2, 2, false, 8));
+    public static Item foodCherry = (new ItemFood("food.cherry", 16515, 2, 2, false, 8));
     public static Item bucketIcecream = (new ItemBucketIceCream("bucket.icecream", 16516, 10, 4)).setContainerItem(bucket);
     public static Item ammoArrowPurple = (new Item("ammo.arrow.purple", 16517)).withTags(ItemTags.NOT_IN_CREATIVE_MENU);
     public static Item label = (new ItemLabel("label", 16518));
@@ -436,9 +436,7 @@ public class Item
     protected boolean hasSubtypes;
     private Item containerItem;
     private String key;
-
-    static 
-    {
+    public static void initializeItems(){
         StatList.onItemInit();
     }
 
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 52a011f5b..6bcab559d 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1,34 +1,16 @@
 package net.minecraft.server;
 
-import static net.minecraft.core.Global.*;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Random;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.PropertyConfigurator;
-
 import com.mojang.nbt.CompoundTag;
-
 import net.minecraft.core.Global;
 import net.minecraft.core.MinecraftAccessor;
 import net.minecraft.core.achievement.stat.StatList;
+import net.minecraft.core.block.Block;
 import net.minecraft.core.crafting.legacy.CraftingManager;
 import net.minecraft.core.data.DataLoader;
 import net.minecraft.core.data.legacy.LegacyWorldTypes;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.entity.SkinVariantList;
+import net.minecraft.core.item.Item;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.ICommandListener;
 import net.minecraft.core.net.IUpdatePlayerListBox;
@@ -74,6 +56,25 @@ import net.minecraft.server.world.WorldManager;
 import net.minecraft.server.world.WorldServer;
 import net.minecraft.server.world.WorldServerMulti;
 import net.minecraft.server.world.chunk.provider.ChunkProviderServer;
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+
+import static net.minecraft.core.Global.CURRENT_SAVE_VERSION;
+import static net.minecraft.core.Global.isServer;
 
 public class MinecraftServer
         implements Runnable, ICommandListener, MinecraftAccessor
@@ -170,6 +171,10 @@ public class MinecraftServer
             }
         }
 
+        // Manually initialize blocks and items
+        Block.initializeBlocks();
+        Item.initializeItems();
+
         new Registries();
         BiomeProviderOverworld.init();
 
diff --git a/src/main/resources/bg/backgrounds.json b/src/main/resources/bg/backgrounds.json
index 177f054ad..a1399ccc0 100644
--- a/src/main/resources/bg/backgrounds.json
+++ b/src/main/resources/bg/backgrounds.json
@@ -6,13 +6,6 @@
 		"bg2",
 		"bg3",
 		"bg4",
-		"bg5",
-		"bg6",
-		"bg7",
-		"bg8",
-		"bg9",
-		"bg10",
-		"bg11",
-		"bg12"
+		"bg5"
 	]
 }
\ No newline at end of file
diff --git a/src/main/resources/bg/bg0.png b/src/main/resources/bg/bg0.png
index c89f5fee5..3649670b6 100644
Binary files a/src/main/resources/bg/bg0.png and b/src/main/resources/bg/bg0.png differ
diff --git a/src/main/resources/bg/bg1.png b/src/main/resources/bg/bg1.png
index 317a877de..81fa8c636 100644
Binary files a/src/main/resources/bg/bg1.png and b/src/main/resources/bg/bg1.png differ
diff --git a/src/main/resources/bg/bg10.png b/src/main/resources/bg/bg10.png
deleted file mode 100644
index c2206086c..000000000
Binary files a/src/main/resources/bg/bg10.png and /dev/null differ
diff --git a/src/main/resources/bg/bg11.png b/src/main/resources/bg/bg11.png
deleted file mode 100644
index b3ee518af..000000000
Binary files a/src/main/resources/bg/bg11.png and /dev/null differ
diff --git a/src/main/resources/bg/bg12.png b/src/main/resources/bg/bg12.png
deleted file mode 100644
index d5f5d7d84..000000000
Binary files a/src/main/resources/bg/bg12.png and /dev/null differ
diff --git a/src/main/resources/bg/bg2.png b/src/main/resources/bg/bg2.png
index 02d5cdf61..0c0d1def2 100644
Binary files a/src/main/resources/bg/bg2.png and b/src/main/resources/bg/bg2.png differ
diff --git a/src/main/resources/bg/bg3.png b/src/main/resources/bg/bg3.png
index 0c7af9e41..11bc772d8 100644
Binary files a/src/main/resources/bg/bg3.png and b/src/main/resources/bg/bg3.png differ
diff --git a/src/main/resources/bg/bg4.png b/src/main/resources/bg/bg4.png
index 0d54d57a0..eddffdea2 100644
Binary files a/src/main/resources/bg/bg4.png and b/src/main/resources/bg/bg4.png differ
diff --git a/src/main/resources/bg/bg5.png b/src/main/resources/bg/bg5.png
index 6c31d0807..40c0ec1d9 100644
Binary files a/src/main/resources/bg/bg5.png and b/src/main/resources/bg/bg5.png differ
diff --git a/src/main/resources/bg/bg6.png b/src/main/resources/bg/bg6.png
deleted file mode 100644
index e9814cf1e..000000000
Binary files a/src/main/resources/bg/bg6.png and /dev/null differ
diff --git a/src/main/resources/bg/bg7.png b/src/main/resources/bg/bg7.png
deleted file mode 100644
index 95e350a2d..000000000
Binary files a/src/main/resources/bg/bg7.png and /dev/null differ
diff --git a/src/main/resources/bg/bg8.png b/src/main/resources/bg/bg8.png
deleted file mode 100644
index c256bdf8d..000000000
Binary files a/src/main/resources/bg/bg8.png and /dev/null differ
diff --git a/src/main/resources/bg/bg9.png b/src/main/resources/bg/bg9.png
deleted file mode 100644
index 270c8b9f1..000000000
Binary files a/src/main/resources/bg/bg9.png and /dev/null differ
diff --git a/src/main/resources/bg/credits.txt b/src/main/resources/bg/credits.txt
index 5a41f8532..991eb141d 100644
--- a/src/main/resources/bg/credits.txt
+++ b/src/main/resources/bg/credits.txt
@@ -1,13 +1,6 @@
-bg0.png - @jonkadelic
-bg1.png - @mrbobnew
-bg2.png - @mrbobnew
-bg3.png - @infernoswelt
-bg4.png - @mhplayer123
-bg5.png - @snek8611
-bg6.png - @jonkadelic
-bg7.png - @lexali5
-bg8.png - @thaboar
-bg9.png - @musicano
-bg10.png - @lostglaceon
-bg11.png - @sausemaster
-bg12.png - @uselessbullets
\ No newline at end of file
+bg0.png - @tess_o
+bg1.png - @thaboar
+bg2.png - @thaboar
+bg3.png - @koomah
+bg4.png - @clyran
+bg5.png - @clyran
\ No newline at end of file
