diff --git a/build.gradle b/build.gradle
index 4daed6d1c..d51188b9b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -31,7 +31,7 @@ minecraft {
 
 dependencies {
 	minecraft "com.mojang:minecraft:18w46a"
-	mappings "net.fabricmc:pomf:18w46a.4"
+	mappings "net.fabricmc:pomf:18w46a.6"
 	modCompile "net.fabricmc:fabric-loader:18w44a-0.1.0.46"
 }
 
diff --git a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java
index c64b423f1..6de2144f8 100644
--- a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java
+++ b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdList.java
@@ -27,7 +27,7 @@ import java.util.List;
 @Mixin(IdList.class)
 public class MixinIdList implements ExtendedIdList {
 	@Shadow
-	private int field_11099;
+	private int nextId;
 	@Shadow
 	private IdentityHashMap idMap;
 	@Shadow
@@ -35,7 +35,7 @@ public class MixinIdList implements ExtendedIdList {
 
 	@Override
 	public void clear() {
-		field_11099 = 0;
+		nextId = 0;
 		idMap.clear();
 		list.clear();
 	}
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 69739373b..986788bb6 100644
--- a/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java
+++ b/src/main/java/net/fabricmc/fabric/mixin/registry/MixinIdRegistry.java
@@ -61,8 +61,9 @@ public abstract class MixinIdRegistry<T> implements RemappableRegistry, Listenab
 		}
 	}
 
+	@SuppressWarnings({ "unchecked", "ConstantConditions" })
 	@Inject(method = "set", at = @At("HEAD"))
-	public void set(int id, Identifier identifier, Object object, CallbackInfoReturnable info) {
+	public void setPre(int id, Identifier identifier, Object object, CallbackInfoReturnable info) {
 		IdRegistry<Object> registry = (IdRegistry<Object>) (Object) this;
 		if (listeners != null) {
 			for (RegistryListener listener : listeners) {
@@ -71,6 +72,17 @@ public abstract class MixinIdRegistry<T> implements RemappableRegistry, Listenab
 		}
 	}
 
+	@SuppressWarnings({ "unchecked", "ConstantConditions" })
+	@Inject(method = "set", at = @At("RETURN"))
+	public void setPost(int id, Identifier identifier, Object object, CallbackInfoReturnable info) {
+		IdRegistry<Object> registry = (IdRegistry<Object>) (Object) this;
+		if (listeners != null) {
+			for (RegistryListener listener : listeners) {
+				listener.afterRegistryRegistration(registry, id, identifier, object);
+			}
+		}
+	}
+
 	@Override
 	public void remap(Object2IntMap<Identifier> idMap, boolean reallocateMissingEntries) throws RemapException {
 		//noinspection unchecked, ConstantConditions
@@ -120,7 +132,7 @@ public abstract class MixinIdRegistry<T> implements RemappableRegistry, Listenab
 		}
 
 		// We don't really need to clear anything but idStore yet.
-		idStore.method_15229();
+		idStore.clear();
 		nextId = 0;
 
 		for (Identifier identifier : idMap.keySet()) {
diff --git a/src/main/java/net/fabricmc/fabric/registry/RegistryListener.java b/src/main/java/net/fabricmc/fabric/registry/RegistryListener.java
index 3b246fbb4..976429efb 100644
--- a/src/main/java/net/fabricmc/fabric/registry/RegistryListener.java
+++ b/src/main/java/net/fabricmc/fabric/registry/RegistryListener.java
@@ -22,4 +22,5 @@ import net.minecraft.util.registry.Registry;
 public interface RegistryListener<T> {
 	default void beforeRegistryCleared(Registry<T> registry) {}
 	default void beforeRegistryRegistration(Registry<T> registry, int id, Identifier identifier, T object, boolean isNew) {}
+	default void afterRegistryRegistration(Registry<T> registry, int id, Identifier identifier, T object) {}
 }
diff --git a/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java b/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java
index 6101e1119..d5c694010 100644
--- a/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java
+++ b/src/main/java/net/fabricmc/fabric/registry/RegistrySyncManager.java
@@ -95,7 +95,7 @@ public final class RegistrySyncManager {
 		TagCompound mainTag = tag.getTagCompound("registries");
 
 		for (Identifier registryId : Registry.REGISTRIES.keys()) {
-			if (!mainTag.hasKey(registryId.toString())) {
+			if (!mainTag.containsKey(registryId.toString())) {
 				continue;
 			}
 
diff --git a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBiomeRegistryListener.java b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBiomeRegistryListener.java
index 7315960ad..f6c034251 100644
--- a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBiomeRegistryListener.java
+++ b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBiomeRegistryListener.java
@@ -34,7 +34,7 @@ public class BootstrapBiomeRegistryListener implements RegistryListener<Biome> {
 	public void beforeRegistryRegistration(Registry<Biome> registry, int id, Identifier identifier, Biome object, boolean isNew) {
 		// refer net.minecraft.biome.Biomes
 		if (object.hasParent()) {
-			Biome.PARENT_BIOME_ID_MAP.add(object, id);
+			Biome.PARENT_BIOME_ID_MAP.set(object, id);
 		}
 	}
 }
diff --git a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBlockRegistryListener.java b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBlockRegistryListener.java
index 099dc085a..622220246 100644
--- a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBlockRegistryListener.java
+++ b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapBlockRegistryListener.java
@@ -27,7 +27,7 @@ import net.minecraft.util.registry.Registry;
 public class BootstrapBlockRegistryListener implements RegistryListener<Block> {
 	@Override
 	public void beforeRegistryCleared(Registry<Block> registry) {
-		((ExtendedIdList) Block.BLOCKSTATE_ID_LIST).clear();
+		((ExtendedIdList) Block.STATE_IDS).clear();
 	}
 
 	@Override
@@ -35,9 +35,14 @@ public class BootstrapBlockRegistryListener implements RegistryListener<Block> {
 		// refer net.minecraft.block.Blocks
 		for (BlockState state : object.getStateFactory().getStates()) {
 			state.method_11590();
-			Block.BLOCKSTATE_ID_LIST.method_10205(state);
+			Block.STATE_IDS.add(state);
 		}
+	}
 
+	@Override
+	public void afterRegistryRegistration(Registry<Block> registry, int id, Identifier identifier, Block object) {
+		System.out.println(identifier);
+		// refer net.minecraft.block.Blocks
 		object.getDropTableId();
 	}
 }
diff --git a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapFluidRegistryListener.java b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapFluidRegistryListener.java
index 16d3467ec..24ab9295f 100644
--- a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapFluidRegistryListener.java
+++ b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapFluidRegistryListener.java
@@ -28,14 +28,14 @@ import net.minecraft.util.registry.Registry;
 public class BootstrapFluidRegistryListener implements RegistryListener<Fluid> {
 	@Override
 	public void beforeRegistryCleared(Registry<Fluid> registry) {
-		((ExtendedIdList) Block.BLOCKSTATE_ID_LIST).clear();
+		((ExtendedIdList) Fluid.STATE_IDS).clear();
 	}
 
 	@Override
 	public void beforeRegistryRegistration(Registry<Fluid> registry, int id, Identifier identifier, Fluid object, boolean isNew) {
 		// refer net.minecraft.fluid.Fluids
 		for (FluidState state : object.getStateFactory().getStates()) {
-			Fluid.field_15904.method_10205(state);
+			Fluid.STATE_IDS.add(state);
 		}
 	}
 }
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 b09a42151..7451b8261 100644
--- a/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapItemRegistryListener.java
+++ b/src/main/java/net/fabricmc/fabric/registry/listeners/BootstrapItemRegistryListener.java
@@ -33,7 +33,7 @@ public class BootstrapItemRegistryListener implements RegistryListener<Item> {
 	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).method_7713(Item.BLOCK_ITEM_MAP, object);
+			((ItemBlock) object).registerBlockItemMap(Item.BLOCK_ITEM_MAP, object);
 		}
 	}
 }
diff --git a/src/main/java/net/fabricmc/fabric/registry/listeners/IdListUpdater.java b/src/main/java/net/fabricmc/fabric/registry/listeners/IdListUpdater.java
index 14eac4b89..b9472ac57 100644
--- a/src/main/java/net/fabricmc/fabric/registry/listeners/IdListUpdater.java
+++ b/src/main/java/net/fabricmc/fabric/registry/listeners/IdListUpdater.java
@@ -58,7 +58,7 @@ public class IdListUpdater<K, V> implements RegistryListener<K> {
 	@Override
 	public void beforeRegistryRegistration(Registry<K> registry, int id, Identifier identifier, K object, boolean isNew) {
 		if (mapperCache.containsKey(identifier)) {
-			mappers.add(mapperCache.get(identifier), id);
+			mappers.set(mapperCache.get(identifier), id);
 		}
 	}
 }
diff --git a/src/main/java/net/fabricmc/fabric/util/HandlerList.java b/src/main/java/net/fabricmc/fabric/util/HandlerList.java
new file mode 100644
index 000000000..fb9b676b6
--- /dev/null
+++ b/src/main/java/net/fabricmc/fabric/util/HandlerList.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.util;
+
+public class HandlerList<T> implements HandlerRegistry<T> {
+	private static final Object[] EMPTY = new Object[0];
+	private T[] array;
+
+	@SuppressWarnings("unchecked")
+	public HandlerList() {
+		this.array = (T[]) EMPTY;
+	}
+
+	@Override
+	public void register(T handler) {
+		for (int i = 0; i < array.length; i++) {
+			if (array[i] == handler) {
+				throw new RuntimeException("Handler " + handler + " already registered!");
+			}
+		}
+
+		//noinspection unchecked
+		T[] newArray = (T[]) new Object[array.length + 1];
+		System.arraycopy(array, 0, newArray, 0, array.length);
+		newArray[array.length] = handler;
+		array = newArray;
+	}
+
+	public T[] getBackingArray() {
+		return array;
+	}
+}
diff --git a/src/main/java/net/fabricmc/fabric/util/HandlerRegistry.java b/src/main/java/net/fabricmc/fabric/util/HandlerRegistry.java
new file mode 100644
index 000000000..618708bc1
--- /dev/null
+++ b/src/main/java/net/fabricmc/fabric/util/HandlerRegistry.java
@@ -0,0 +1,21 @@
+/*
+ * 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.util;
+
+public interface HandlerRegistry<T> {
+	void register(T handler);
+}