diff --git a/build.gradle b/build.gradle
index c0376bccd..c6ffa64d2 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,8 +30,8 @@ minecraft {
 }
 
 dependencies {
-	minecraft "com.mojang:minecraft:18w47a"
-	mappings "net.fabricmc:pomf:18w47a.2"
+	minecraft "com.mojang:minecraft:18w47b"
+	mappings "net.fabricmc:pomf:18w47b.10"
 	modCompile "net.fabricmc:fabric-loader:18w44a-0.1.0.46"
 }
 
diff --git a/src/main/java/net/fabricmc/fabric/client/render/FabricBlockEntityRendererRegistry.java b/src/main/java/net/fabricmc/fabric/client/render/FabricBlockEntityRendererRegistry.java
new file mode 100644
index 000000000..203eacd3a
--- /dev/null
+++ b/src/main/java/net/fabricmc/fabric/client/render/FabricBlockEntityRendererRegistry.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2016, 2017, 2018 FabricMC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.fabricmc.fabric.client.render;
+
+import net.minecraft.block.entity.BlockEntity;
+import net.minecraft.client.render.block.entity.BlockEntityRenderManager;
+import net.minecraft.client.render.block.entity.BlockEntityRenderer;
+
+import java.util.Map;
+
+public class FabricBlockEntityRendererRegistry {
+	public static final FabricBlockEntityRendererRegistry INSTANCE = new FabricBlockEntityRendererRegistry();
+	private Map<Class<? extends BlockEntity>, BlockEntityRenderer<? extends BlockEntity>> blockEntityRenderers;
+
+	private FabricBlockEntityRendererRegistry() {
+
+	}
+
+	public void setBlockEntityRendererMap(Map<Class<? extends BlockEntity>, BlockEntityRenderer<? extends BlockEntity>> map) {
+		if (blockEntityRenderers != null && blockEntityRenderers != map) {
+			throw new RuntimeException("Tried to set blockEntityRenderers twice!");
+		}
+
+		blockEntityRenderers = map;
+	}
+
+	public void register(Class<? extends BlockEntity> blockEntityClass, BlockEntityRenderer<? extends BlockEntity> blockEntityRenderer) {
+		// TODO: warn on duplicate
+		blockEntityRenderers.put(blockEntityClass, blockEntityRenderer);
+		blockEntityRenderer.setRenderManager(BlockEntityRenderManager.instance);
+	}
+}
diff --git a/src/main/java/net/fabricmc/fabric/commands/CommandRegistry.java b/src/main/java/net/fabricmc/fabric/commands/CommandRegistry.java
index 7d4848590..4101237df 100644
--- a/src/main/java/net/fabricmc/fabric/commands/CommandRegistry.java
+++ b/src/main/java/net/fabricmc/fabric/commands/CommandRegistry.java
@@ -17,7 +17,7 @@
 package net.fabricmc.fabric.commands;
 
 import com.mojang.brigadier.CommandDispatcher;
-import net.minecraft.command.ServerCommandSource;
+import net.minecraft.server.command.ServerCommandSource;
 
 import java.util.ArrayList;
 import java.util.Collections;
diff --git a/src/main/java/net/fabricmc/fabric/mixin/commands/MixinServerCommandManager.java b/src/main/java/net/fabricmc/fabric/mixin/commands/MixinServerCommandManager.java
index 6c6fc7d49..c07e7f93d 100644
--- a/src/main/java/net/fabricmc/fabric/mixin/commands/MixinServerCommandManager.java
+++ b/src/main/java/net/fabricmc/fabric/mixin/commands/MixinServerCommandManager.java
@@ -18,8 +18,8 @@ package net.fabricmc.fabric.mixin.commands;
 
 import com.mojang.brigadier.CommandDispatcher;
 import net.fabricmc.fabric.commands.CommandRegistry;
-import net.minecraft.command.ServerCommandManager;
-import net.minecraft.command.ServerCommandSource;
+import net.minecraft.server.command.ServerCommandManager;
+import net.minecraft.server.command.ServerCommandSource;
 import org.apache.logging.log4j.Logger;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
diff --git a/src/main/java/net/fabricmc/fabric/mixin/networking/MixinClientPlayNetworkHandler.java b/src/main/java/net/fabricmc/fabric/mixin/networking/MixinClientPlayNetworkHandler.java
index 2caa901d6..97cacdf45 100644
--- a/src/main/java/net/fabricmc/fabric/mixin/networking/MixinClientPlayNetworkHandler.java
+++ b/src/main/java/net/fabricmc/fabric/mixin/networking/MixinClientPlayNetworkHandler.java
@@ -21,12 +21,9 @@ import net.fabricmc.fabric.networking.CustomPayloadHandlerRegistry;
 import net.fabricmc.fabric.networking.PacketContext;
 import net.fabricmc.fabric.networking.SPacketCustomPayloadAccessor;
 import net.minecraft.client.MinecraftGame;
-import net.minecraft.client.network.handler.ClientPlayNetworkHandler;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.EntityPlayerServer;
-import net.minecraft.network.handler.ServerPlayNetworkHandler;
-import net.minecraft.network.packet.client.CPacketCustomPayload;
-import net.minecraft.network.packet.server.SPacketCustomPayload;
+import net.minecraft.client.network.ClientPlayNetworkHandler;
+import net.minecraft.client.network.packet.CustomPayloadClientPacket;
+import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.util.ThreadTaskQueue;
 import org.spongepowered.asm.mixin.Mixin;
@@ -41,7 +38,7 @@ public class MixinClientPlayNetworkHandler implements PacketContext {
 	private MinecraftGame game;
 
 	@Inject(method = "onCustomPayload", at = @At("HEAD"), cancellable = true)
-	public void onCustomPayload(CPacketCustomPayload packet, CallbackInfo info) {
+	public void onCustomPayload(CustomPayloadClientPacket packet, CallbackInfo info) {
 		if (CustomPayloadHandlerRegistry.CLIENT.accept(packet.getChannel(), this, packet.getData())) {
 			info.cancel();
 		}
@@ -53,7 +50,7 @@ public class MixinClientPlayNetworkHandler implements PacketContext {
 	}
 
 	@Override
-	public EntityPlayer getPlayer() {
+	public PlayerEntity getPlayer() {
 		return game.player;
 	}
 
diff --git a/src/main/java/net/fabricmc/fabric/mixin/networking/MixinSPacketCustomPayload.java b/src/main/java/net/fabricmc/fabric/mixin/networking/MixinSPacketCustomPayload.java
index 67ea87c5c..9f51a9839 100644
--- a/src/main/java/net/fabricmc/fabric/mixin/networking/MixinSPacketCustomPayload.java
+++ b/src/main/java/net/fabricmc/fabric/mixin/networking/MixinSPacketCustomPayload.java
@@ -17,13 +17,13 @@
 package net.fabricmc.fabric.mixin.networking;
 
 import net.fabricmc.fabric.networking.SPacketCustomPayloadAccessor;
-import net.minecraft.network.packet.server.SPacketCustomPayload;
+import net.minecraft.server.network.packet.CustomPayloadServerPacket;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.PacketByteBuf;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
 
-@Mixin(SPacketCustomPayload.class)
+@Mixin(CustomPayloadServerPacket.class)
 public class MixinSPacketCustomPayload implements SPacketCustomPayloadAccessor {
 	@Shadow
 	private Identifier channel;
diff --git a/src/main/java/net/fabricmc/fabric/mixin/networking/MixinServerPlayNetworkHandler.java b/src/main/java/net/fabricmc/fabric/mixin/networking/MixinServerPlayNetworkHandler.java
index 3704e2013..8f45e3701 100644
--- a/src/main/java/net/fabricmc/fabric/mixin/networking/MixinServerPlayNetworkHandler.java
+++ b/src/main/java/net/fabricmc/fabric/mixin/networking/MixinServerPlayNetworkHandler.java
@@ -20,11 +20,11 @@ import net.fabricmc.api.Side;
 import net.fabricmc.fabric.networking.CustomPayloadHandlerRegistry;
 import net.fabricmc.fabric.networking.PacketContext;
 import net.fabricmc.fabric.networking.SPacketCustomPayloadAccessor;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.EntityPlayerServer;
-import net.minecraft.network.handler.ServerPlayNetworkHandler;
-import net.minecraft.network.packet.server.SPacketCustomPayload;
+import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.network.ServerPlayNetworkHandler;
+import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.server.network.packet.CustomPayloadServerPacket;
 import net.minecraft.util.ThreadTaskQueue;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
@@ -37,10 +37,10 @@ public class MixinServerPlayNetworkHandler implements PacketContext {
 	@Shadow
 	private MinecraftServer server;
 	@Shadow
-	private EntityPlayerServer player;
+	private ServerPlayerEntity player;
 
 	@Inject(method = "onCustomPayload", at = @At("HEAD"), cancellable = true)
-	public void onCustomPayload(SPacketCustomPayload packet, CallbackInfo info) {
+	public void onCustomPayload(CustomPayloadServerPacket packet, CallbackInfo info) {
 		SPacketCustomPayloadAccessor accessor = ((SPacketCustomPayloadAccessor) packet);
 
 		if (CustomPayloadHandlerRegistry.SERVER.accept(accessor.getChannel(), this, accessor.getData())) {
@@ -54,7 +54,7 @@ public class MixinServerPlayNetworkHandler implements PacketContext {
 	}
 
 	@Override
-	public EntityPlayer getPlayer() {
+	public PlayerEntity getPlayer() {
 		return player;
 	}
 
diff --git a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java
index a12ed2f40..49a151653 100644
--- a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java
+++ b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java
@@ -23,8 +23,8 @@ import net.fabricmc.fabric.registry.ListenableRegistry;
 import net.fabricmc.fabric.registry.RegistryListener;
 import net.fabricmc.fabric.registry.RemapException;
 import net.fabricmc.fabric.registry.RemappableRegistry;
-import net.minecraft.class_3513;
 import net.minecraft.util.Identifier;
+import net.minecraft.util.Int2ObjectBiMap;
 import net.minecraft.util.registry.DefaultMappedRegistry;
 import net.minecraft.util.registry.IdRegistry;
 import org.apache.logging.log4j.LogManager;
@@ -40,7 +40,7 @@ public abstract class MixinIdRegistry<T> implements RemappableRegistry, Listenab
 	@Shadow
 	protected static Logger ID_LOGGER;
 	@Shadow
-	protected class_3513<T> idStore;
+	protected Int2ObjectBiMap<T> idStore;
 	@Shadow
 	protected BiMap<Identifier, T> objectMap;
 	@Shadow
@@ -147,7 +147,7 @@ public abstract class MixinIdRegistry<T> implements RemappableRegistry, Listenab
 				// objectMap.put(identifier, object);
 			}
 
-			idStore.method_15230(object, id);
+			idStore.put(object, id);
 			if (nextId <= id) {
 				nextId = id + 1;
 			}
diff --git a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinServerPlayNetworkHandler.java b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinServerPlayNetworkHandler.java
index 437b6f798..0eecaf928 100644
--- a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinServerPlayNetworkHandler.java
+++ b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinServerPlayNetworkHandler.java
@@ -21,13 +21,11 @@ import net.fabricmc.fabric.networking.CustomPayloadHandlerRegistry;
 import net.fabricmc.fabric.networking.PacketContext;
 import net.fabricmc.fabric.networking.SPacketCustomPayloadAccessor;
 import net.fabricmc.fabric.registry.RegistrySyncManager;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.EntityPlayerServer;
 import net.minecraft.network.ClientConnection;
 import net.minecraft.network.Packet;
-import net.minecraft.network.handler.ServerPlayNetworkHandler;
-import net.minecraft.network.packet.server.SPacketCustomPayload;
 import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.network.ServerPlayNetworkHandler;
+import net.minecraft.server.network.ServerPlayerEntity;
 import net.minecraft.util.ThreadTaskQueue;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
@@ -41,7 +39,7 @@ public abstract class MixinServerPlayNetworkHandler {
 	public abstract void sendPacket(Packet<?> var1);
 
 	@Inject(method = "<init>", at = @At("RETURN"))
-	public void init(MinecraftServer server, ClientConnection connection, EntityPlayerServer player, CallbackInfo info) {
+	public void init(MinecraftServer server, ClientConnection connection, ServerPlayerEntity player, CallbackInfo info) {
 		//if (server.isDedicated()) {
 		sendPacket(RegistrySyncManager.createPacket());
 		//}
diff --git a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinWorldSaveHandler.java b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinWorldSaveHandler.java
index 4790154c4..6db14e64f 100644
--- a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinWorldSaveHandler.java
+++ b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinWorldSaveHandler.java
@@ -20,7 +20,7 @@ import net.fabricmc.fabric.registry.RegistrySyncManager;
 import net.fabricmc.fabric.registry.RemapException;
 import net.minecraft.nbt.TagCompound;
 import net.minecraft.nbt.TagStorageHelper;
-import net.minecraft.world.WorldSaveHandlerOld;
+import net.minecraft.world.OldWorldSaveHandler;
 import net.minecraft.world.level.LevelProperties;
 import org.apache.logging.log4j.Logger;
 import org.spongepowered.asm.mixin.Mixin;
@@ -34,7 +34,7 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 
-@Mixin(value = WorldSaveHandlerOld.class)
+@Mixin(value = OldWorldSaveHandler.class)
 public class MixinWorldSaveHandler {
 	private static final int ID_REGISTRY_BACKUPS = 3;
 
diff --git a/src/main/java/net/fabricmc/fabric/mixin/render/MixinBlockEntityRenderManager.java b/src/main/java/net/fabricmc/fabric/mixin/render/MixinBlockEntityRenderManager.java
new file mode 100644
index 000000000..8c5b1acb1
--- /dev/null
+++ b/src/main/java/net/fabricmc/fabric/mixin/render/MixinBlockEntityRenderManager.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2016, 2017, 2018 FabricMC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.fabricmc.fabric.mixin.render;
+
+import com.google.common.collect.Maps;
+import net.fabricmc.fabric.client.render.FabricBlockEntityRendererRegistry;
+import net.minecraft.block.entity.BlockEntity;
+import net.minecraft.client.render.block.entity.BlockEntityRenderManager;
+import net.minecraft.client.render.block.entity.BlockEntityRenderer;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import java.util.Map;
+
+@Mixin(BlockEntityRenderManager.class)
+public class MixinBlockEntityRenderManager {
+	@Shadow
+	private Map<Class<? extends BlockEntity>, BlockEntityRenderer<? extends BlockEntity>> blockEntityRenderers;
+
+	@Inject(method = "<init>()V", at = @At("RETURN"))
+	public void init(CallbackInfo info) {
+		FabricBlockEntityRendererRegistry.INSTANCE.setBlockEntityRendererMap(blockEntityRenderers);
+	}
+}
diff --git a/src/main/java/net/fabricmc/fabric/networking/PacketContext.java b/src/main/java/net/fabricmc/fabric/networking/PacketContext.java
index f027f000e..c0b28b18a 100644
--- a/src/main/java/net/fabricmc/fabric/networking/PacketContext.java
+++ b/src/main/java/net/fabricmc/fabric/networking/PacketContext.java
@@ -17,7 +17,7 @@
 package net.fabricmc.fabric.networking;
 
 import net.fabricmc.api.Side;
-import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.util.ThreadTaskQueue;
 
 /**
@@ -27,6 +27,6 @@ import net.minecraft.util.ThreadTaskQueue;
  */
 public interface PacketContext {
 	Side getNetworkSide();
-	EntityPlayer getPlayer();
+	PlayerEntity getPlayer();
 	ThreadTaskQueue getTaskQueue();
 }
diff --git a/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java b/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java
index d5c694010..ee6f8ec84 100644
--- a/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java
+++ b/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java
@@ -22,9 +22,8 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap;
 import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
 import net.fabricmc.fabric.networking.CustomPayloadHandlerRegistry;
 import net.fabricmc.fabric.networking.PacketContext;
-import net.minecraft.entity.player.EntityPlayerServer;
+import net.minecraft.client.network.packet.CustomPayloadClientPacket;
 import net.minecraft.nbt.TagCompound;
-import net.minecraft.network.packet.client.CPacketCustomPayload;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.PacketByteBuf;
 import net.minecraft.util.registry.IdRegistry;
@@ -44,11 +43,11 @@ public final class RegistrySyncManager {
 
 	}
 
-	public static CPacketCustomPayload createPacket() {
+	public static CustomPayloadClientPacket createPacket() {
 		PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer());
 		buf.writeTagCompound(toTag(true));
 
-		CPacketCustomPayload packet = new CPacketCustomPayload(ID, buf);
+	    CustomPayloadClientPacket packet = new CustomPayloadClientPacket(ID, buf);
 		return packet;
 	}
 
diff --git a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapItemRegistryListener.java b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapItemRegistryListener.java
index 7451b8261..b91825486 100644
--- a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapItemRegistryListener.java
+++ b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapItemRegistryListener.java
@@ -19,7 +19,7 @@ package net.fabricmc.fabric.registry.listeners;
 import net.fabricmc.fabric.registry.ExtendedIdList;
 import net.fabricmc.fabric.registry.RegistryListener;
 import net.minecraft.item.Item;
-import net.minecraft.item.block.ItemBlock;
+import net.minecraft.item.block.BlockItem;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.registry.Registry;
 
@@ -32,8 +32,8 @@ public class BootstrapItemRegistryListener implements RegistryListener<Item> {
 	@Override
 	public void beforeRegistryRegistration(Registry<Item> registry, int id, Identifier identifier, Item object, boolean isNew) {
 		// refer net.minecraft.item.Items
-		if (object instanceof ItemBlock) {
-			((ItemBlock) object).registerBlockItemMap(Item.BLOCK_ITEM_MAP, object);
+		if (object instanceof BlockItem) {
+			((BlockItem) object).registerBlockItemMap(Item.BLOCK_ITEM_MAP, object);
 		}
 	}
 }
diff --git a/src/main/resources/net.fabricmc.fabric.mixins.client.json b/src/main/resources/net.fabricmc.fabric.mixins.client.json
index e10090746..3d640ab5e 100644
--- a/src/main/resources/net.fabricmc.fabric.mixins.client.json
+++ b/src/main/resources/net.fabricmc.fabric.mixins.client.json
@@ -7,6 +7,7 @@
     "registry.client.MixinBlockColorMap",
     "registry.client.MixinItemColorMap",
     "registry.client.MixinItemModelMap",
+    "render.MixinBlockEntityRenderManager",
     "resources.MixinMinecraftGame"
   ],
   "injectors": {