diff --git a/build.gradle b/build.gradle
index 261d357ff..dcea72cfd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,9 +12,9 @@ plugins {
 def ENV = System.getenv()
 
 class Globals {
-	static def baseVersion = "0.3.4"
-	static def mcVersion = "19w38b"
-	static def yarnVersion = "+build.4"
+	static def baseVersion = "0.4.0"
+	static def mcVersion = "19w39a"
+	static def yarnVersion = "+build.1"
 }
 
 import org.apache.commons.codec.digest.DigestUtils
diff --git a/fabric-blockrenderlayer-v1/build.gradle b/fabric-blockrenderlayer-v1/build.gradle
index c3bd98ef3..bfcf054e2 100644
--- a/fabric-blockrenderlayer-v1/build.gradle
+++ b/fabric-blockrenderlayer-v1/build.gradle
@@ -1,5 +1,5 @@
 archivesBaseName = "fabric-blockrenderlayer-v1"
-version = getSubprojectVersion(project, "1.0.0")
+version = getSubprojectVersion(project, "1.0.1")
 
 dependencies {
 	compile project(path: ':fabric-api-base', configuration: 'dev')
diff --git a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/api/blockrenderlayer/v1/BlockRenderLayerMap.java b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/api/blockrenderlayer/v1/BlockRenderLayerMap.java
index eb9335e39..648c00691 100644
--- a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/api/blockrenderlayer/v1/BlockRenderLayerMap.java
+++ b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/api/blockrenderlayer/v1/BlockRenderLayerMap.java
@@ -16,7 +16,7 @@
 
 package net.fabricmc.fabric.api.blockrenderlayer.v1;
 
-import net.fabricmc.fabric.impl.blockrenderlayer.v1.BlockRenderLayerMapImpl;
+import net.fabricmc.fabric.impl.blockrenderlayer.BlockRenderLayerMapImpl;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockRenderLayer;
 import net.minecraft.fluid.Fluid;
diff --git a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/impl/blockrenderlayer/v1/BlockRenderLayerMapImpl.java b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/impl/blockrenderlayer/BlockRenderLayerMapImpl.java
similarity index 98%
rename from fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/impl/blockrenderlayer/v1/BlockRenderLayerMapImpl.java
rename to fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/impl/blockrenderlayer/BlockRenderLayerMapImpl.java
index ba06d0f4b..c0617361d 100644
--- a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/impl/blockrenderlayer/v1/BlockRenderLayerMapImpl.java
+++ b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/impl/blockrenderlayer/BlockRenderLayerMapImpl.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package net.fabricmc.fabric.impl.blockrenderlayer.v1;
+package net.fabricmc.fabric.impl.blockrenderlayer;
 
 import java.util.function.BiConsumer;
 
diff --git a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/mixin/blockrenderlayer/MixinBlockRenderLayer.java b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/mixin/blockrenderlayer/MixinBlockRenderLayer.java
index acaee8fbe..c75112965 100644
--- a/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/mixin/blockrenderlayer/MixinBlockRenderLayer.java
+++ b/fabric-blockrenderlayer-v1/src/main/java/net/fabricmc/fabric/mixin/blockrenderlayer/MixinBlockRenderLayer.java
@@ -24,7 +24,7 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
-import net.fabricmc.fabric.impl.blockrenderlayer.v1.BlockRenderLayerMapImpl;
+import net.fabricmc.fabric.impl.blockrenderlayer.BlockRenderLayerMapImpl;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockRenderLayer;
 import net.minecraft.fluid.Fluid;
diff --git a/fabric-item-groups-v0/build.gradle b/fabric-item-groups-v0/build.gradle
index dc92b822e..c9f7aba62 100644
--- a/fabric-item-groups-v0/build.gradle
+++ b/fabric-item-groups-v0/build.gradle
@@ -1,5 +1,5 @@
 archivesBaseName = "fabric-item-groups-v0"
-version = getSubprojectVersion(project, "0.1.2")
+version = getSubprojectVersion(project, "0.1.3")
 
 dependencies {
 	compile project(path: ':fabric-api-base', configuration: 'dev')
diff --git a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricCreativeGuiComponents.java b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricCreativeGuiComponents.java
index fef738b1d..51995b6bc 100644
--- a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricCreativeGuiComponents.java
+++ b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricCreativeGuiComponents.java
@@ -60,7 +60,7 @@ public class FabricCreativeGuiComponents {
 
 			if (this.visible) {
 				MinecraftClient minecraftClient = MinecraftClient.getInstance();
-				minecraftClient.getTextureManager().method_22813(BUTTON_TEX);
+				minecraftClient.getTextureManager().bindTexture(BUTTON_TEX);
 				RenderSystem.disableLighting();
 				RenderSystem.color4f(1F, 1F, 1F, 1F);
 				this.blit(this.x, this.y, (type == Type.NEXT ? 12 : 0), (active ? 0 : 12), 12, 12);
diff --git a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinCreativePlayerInventoryGui.java b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinCreativePlayerInventoryGui.java
index 93980eb35..2fab22c1f 100644
--- a/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinCreativePlayerInventoryGui.java
+++ b/fabric-item-groups-v0/src/main/java/net/fabricmc/fabric/mixin/itemgroup/client/MixinCreativePlayerInventoryGui.java
@@ -42,7 +42,7 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryS
 	protected abstract void setSelectedTab(ItemGroup itemGroup_1);
 
 	@Shadow
-	public abstract int method_2469(); /* XXX getSelectedTab XXX */
+	public abstract int getSelectedTab(); /* XXX getSelectedTab XXX */
 
 	// "static" matches selectedTab
 	private static int fabric_currentPage = 0;
@@ -103,7 +103,7 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryS
 	private void fabric_updateSelection() {
 		int minPos = fabric_getPageOffset(fabric_currentPage);
 		int maxPos = fabric_getPageOffset(fabric_currentPage + 1) - 1;
-		int curPos = method_2469();
+		int curPos = getSelectedTab();
 
 		if (curPos < minPos || curPos > maxPos) {
 			setSelectedTab(ItemGroup.GROUPS[fabric_getPageOffset(fabric_currentPage)]);
@@ -129,7 +129,7 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryS
 		}
 	}
 
-	@Inject(method = "method_2471", at = @At("HEAD"), cancellable = true)
+	@Inject(method = "renderTabTooltipIfHovered", at = @At("HEAD"), cancellable = true)
 	private void method_2471(ItemGroup itemGroup, int mx, int my, CallbackInfoReturnable<Boolean> info) {
 		if (!fabric_isGroupVisible(itemGroup)) {
 			info.setReturnValue(false);
@@ -143,7 +143,7 @@ public abstract class MixinCreativePlayerInventoryGui extends AbstractInventoryS
 		}
 	}
 
-	@Inject(method = "method_2468", at = @At("HEAD"), cancellable = true)
+	@Inject(method = "renderTabIcon", at = @At("HEAD"), cancellable = true)
 	private void method_2468(ItemGroup itemGroup, CallbackInfo info) {
 		if (!fabric_isGroupVisible(itemGroup)) {
 			info.cancel();
diff --git a/fabric-loot-tables-v1/build.gradle b/fabric-loot-tables-v1/build.gradle
index ab95d04aa..b5be3afa5 100644
--- a/fabric-loot-tables-v1/build.gradle
+++ b/fabric-loot-tables-v1/build.gradle
@@ -1,5 +1,5 @@
 archivesBaseName = "fabric-loot-tables-v1"
-version = getSubprojectVersion(project, "0.1.1")
+version = getSubprojectVersion(project, "0.1.2")
 
 dependencies {
 	compile project(path: ':fabric-api-base', configuration: 'dev')
diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplier.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplier.java
index 3c78ff55f..b65ad7bc7 100644
--- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplier.java
+++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplier.java
@@ -17,7 +17,7 @@
 package net.fabricmc.fabric.api.loot.v1;
 
 import net.minecraft.world.loot.LootPool;
-import net.minecraft.world.loot.LootSupplier;
+import net.minecraft.world.loot.LootTable;
 import net.minecraft.world.loot.context.LootContextType;
 import net.minecraft.world.loot.function.LootFunction;
 
@@ -28,8 +28,8 @@ import java.util.List;
  * Fabric API is present. Contains accessors for various fields.
  */
 public interface FabricLootSupplier {
-	default LootSupplier asVanilla() {
-		return (LootSupplier) this;
+	default LootTable asVanilla() {
+		return (LootTable) this;
 	}
 	List<LootPool> getPools();
 	List<LootFunction> getFunctions();
diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplierBuilder.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplierBuilder.java
index adf42b27e..316a025c0 100644
--- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplierBuilder.java
+++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/FabricLootSupplierBuilder.java
@@ -18,18 +18,18 @@ package net.fabricmc.fabric.api.loot.v1;
 
 import net.fabricmc.fabric.mixin.loot.LootSupplierBuilderHooks;
 import net.minecraft.world.loot.LootPool;
-import net.minecraft.world.loot.LootSupplier;
+import net.minecraft.world.loot.LootTable;
 import net.minecraft.world.loot.context.LootContextType;
 import net.minecraft.world.loot.function.LootFunction;
 
 import java.util.Collection;
 
-public class FabricLootSupplierBuilder extends LootSupplier.Builder {
+public class FabricLootSupplierBuilder extends LootTable.Builder {
 	private final LootSupplierBuilderHooks extended = (LootSupplierBuilderHooks) this;
 
 	protected FabricLootSupplierBuilder() {}
 
-	private FabricLootSupplierBuilder(LootSupplier supplier) {
+	private FabricLootSupplierBuilder(LootTable supplier) {
 		copyFrom(supplier, true);
 	}
 
@@ -75,7 +75,7 @@ public class FabricLootSupplierBuilder extends LootSupplier.Builder {
 	 * Copies the pools and functions of the {@code supplier} to this builder.
 	 * This is equal to {@code copyFrom(supplier, false)}.
 	 */
-	public FabricLootSupplierBuilder copyFrom(LootSupplier supplier) {
+	public FabricLootSupplierBuilder copyFrom(LootTable supplier) {
 		return copyFrom(supplier, false);
 	}
 
@@ -83,7 +83,7 @@ public class FabricLootSupplierBuilder extends LootSupplier.Builder {
 	 * Copies the pools and functions of the {@code supplier} to this builder.
 	 * If {@code copyType} is true, the {@link FabricLootSupplier#getType type} of the supplier is also copied.
 	 */
-	public FabricLootSupplierBuilder copyFrom(LootSupplier supplier, boolean copyType) {
+	public FabricLootSupplierBuilder copyFrom(LootTable supplier, boolean copyType) {
 		FabricLootSupplier extendedSupplier = (FabricLootSupplier) supplier;
 		extended.getPools().addAll(extendedSupplier.getPools());
 		extended.getFunctions().addAll(extendedSupplier.getFunctions());
@@ -99,7 +99,7 @@ public class FabricLootSupplierBuilder extends LootSupplier.Builder {
 		return new FabricLootSupplierBuilder();
 	}
 
-	public static FabricLootSupplierBuilder of(LootSupplier supplier) {
+	public static FabricLootSupplierBuilder of(LootTable supplier) {
 		return new FabricLootSupplierBuilder(supplier);
 	}
 }
diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/event/LootTableLoadingCallback.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/event/LootTableLoadingCallback.java
index c6e255c93..52b50ce75 100644
--- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/event/LootTableLoadingCallback.java
+++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/api/loot/v1/event/LootTableLoadingCallback.java
@@ -22,7 +22,7 @@ import net.fabricmc.fabric.api.loot.v1.FabricLootSupplierBuilder;
 import net.minecraft.resource.ResourceManager;
 import net.minecraft.util.Identifier;
 import net.minecraft.world.loot.LootManager;
-import net.minecraft.world.loot.LootSupplier;
+import net.minecraft.world.loot.LootTable;
 
 /**
  * An event handler that is called when loot tables are loaded.
@@ -32,7 +32,7 @@ import net.minecraft.world.loot.LootSupplier;
 public interface LootTableLoadingCallback {
 	@FunctionalInterface
 	interface LootTableSetter {
-		void set(LootSupplier supplier);
+		void set(LootTable supplier);
 	}
 
 	final Event<LootTableLoadingCallback> EVENT = EventFactory.createArrayBacked(
diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootSupplierBuilderHooks.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootSupplierBuilderHooks.java
index a1aab3925..71d4a979a 100644
--- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootSupplierBuilderHooks.java
+++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/LootSupplierBuilderHooks.java
@@ -17,14 +17,14 @@
 package net.fabricmc.fabric.mixin.loot;
 
 import net.minecraft.world.loot.LootPool;
-import net.minecraft.world.loot.LootSupplier;
+import net.minecraft.world.loot.LootTable;
 import net.minecraft.world.loot.function.LootFunction;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.gen.Accessor;
 
 import java.util.List;
 
-@Mixin(LootSupplier.Builder.class)
+@Mixin(LootTable.Builder.class)
 public interface LootSupplierBuilderHooks {
 	@Accessor
 	List<LootPool> getPools();
diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootManager.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootManager.java
index c619fdbe3..a8517d72a 100644
--- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootManager.java
+++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootManager.java
@@ -24,7 +24,7 @@ import net.minecraft.resource.ResourceManager;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.profiler.Profiler;
 import net.minecraft.world.loot.LootManager;
-import net.minecraft.world.loot.LootSupplier;
+import net.minecraft.world.loot.LootTable;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.injection.At;
@@ -36,11 +36,11 @@ import java.util.Map;
 
 @Mixin(LootManager.class)
 public class MixinLootManager {
-	@Shadow private Map<Identifier, LootSupplier> suppliers;
+	@Shadow private Map<Identifier, LootTable> suppliers;
 
 	@Inject(method = "method_20712", at = @At("RETURN"))
 	private void apply(Map<Identifier, JsonObject> objectMap, ResourceManager manager, Profiler profiler, CallbackInfo info) {
-		Map<Identifier, LootSupplier> newSuppliers = new HashMap<>();
+		Map<Identifier, LootTable> newSuppliers = new HashMap<>();
 
 		suppliers.forEach((id, supplier) -> {
 			FabricLootSupplierBuilder builder = FabricLootSupplierBuilder.of(supplier);
diff --git a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootSupplier.java b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootSupplier.java
index f37414fae..d38e9c8c4 100644
--- a/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootSupplier.java
+++ b/fabric-loot-tables-v1/src/main/java/net/fabricmc/fabric/mixin/loot/MixinLootSupplier.java
@@ -18,7 +18,7 @@ package net.fabricmc.fabric.mixin.loot;
 
 import net.fabricmc.fabric.api.loot.v1.FabricLootSupplier;
 import net.minecraft.world.loot.LootPool;
-import net.minecraft.world.loot.LootSupplier;
+import net.minecraft.world.loot.LootTable;
 import net.minecraft.world.loot.context.LootContextType;
 import net.minecraft.world.loot.function.LootFunction;
 import org.spongepowered.asm.mixin.Final;
@@ -29,7 +29,7 @@ import org.spongepowered.asm.mixin.gen.Accessor;
 import java.util.Arrays;
 import java.util.List;
 
-@Mixin(LootSupplier.class)
+@Mixin(LootTable.class)
 public abstract class MixinLootSupplier implements FabricLootSupplier {
 	@Shadow @Final private LootPool[] pools;
 	@Shadow @Final private LootFunction[] functions;
diff --git a/fabric-renderer-api-v1/build.gradle b/fabric-renderer-api-v1/build.gradle
index e7e39f58c..6c8d0f9e4 100644
--- a/fabric-renderer-api-v1/build.gradle
+++ b/fabric-renderer-api-v1/build.gradle
@@ -1,5 +1,5 @@
 archivesBaseName = "fabric-renderer-api-v1"
-version = getSubprojectVersion(project, "0.2.1")
+version = getSubprojectVersion(project, "0.2.2")
 
 dependencies {
 	compile project(path: ':fabric-api-base', configuration: 'dev')
diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/BlendMode.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/BlendMode.java
index c96b0999c..a10dadc5b 100644
--- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/BlendMode.java
+++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/material/BlendMode.java
@@ -30,7 +30,7 @@ public enum BlendMode {
 	/**
 	 * Fully opaque with depth test, no blending. Used for most normal blocks.
 	 */
-	SOLID(BlockRenderLayer.field_9178),
+	SOLID(BlockRenderLayer.SOLID),
 
 	/**
 	 * Pixels with alpha > 0.5 are rendered as if {@code SOLID}. Other pixels are not rendered.
@@ -42,13 +42,13 @@ public enum BlendMode {
 	 * Pixels with alpha > 0.5 are rendered as if {@code SOLID}. Other pixels are not rendered.
 	 * Texture mip-map disabled.  Used for iron bars, glass and other cutout sprites with hard edges.
 	 */
-	CUTOUT(BlockRenderLayer.field_9174),
+	CUTOUT(BlockRenderLayer.CUTOUT),
 
 	/**
 	 * Pixels are blended with the background according to alpha color values. Some performance cost,
 	 * use in moderation. Texture mip-map enabled.  Used for stained glass.
 	 */
-	TRANSLUCENT(BlockRenderLayer.field_9179);
+	TRANSLUCENT(BlockRenderLayer.TRANSLUCENT);
 
 	public final BlockRenderLayer blockRenderLayer;
 
@@ -57,13 +57,13 @@ public enum BlendMode {
 	}
 
 	public static BlendMode fromRenderLayer(BlockRenderLayer renderLayer) {
-		if (renderLayer == BlockRenderLayer.field_9178) {
+		if (renderLayer == BlockRenderLayer.SOLID) {
 			return SOLID;
 		} else if (renderLayer == BlockRenderLayer.CUTOUT_MIPPED) {
 			return CUTOUT_MIPPED;
-		} else if (renderLayer == BlockRenderLayer.field_9174) {
+		} else if (renderLayer == BlockRenderLayer.CUTOUT) {
 			return CUTOUT;
-		} else if (renderLayer == BlockRenderLayer.field_9179) {
+		} else if (renderLayer == BlockRenderLayer.TRANSLUCENT) {
 			return TRANSLUCENT;
 		} else {
 			return DEFAULT;
diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ModelHelper.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ModelHelper.java
index 91560c393..bee076ec4 100644
--- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ModelHelper.java
+++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/api/renderer/v1/model/ModelHelper.java
@@ -75,12 +75,18 @@ public abstract class ModelHelper {
 
 		@SuppressWarnings("unchecked")
 		final ImmutableList.Builder<BakedQuad>[] builders = new ImmutableList.Builder[7];
+
 		for (int i = 0; i < 7; i++) {
 			builders[i] = ImmutableList.builder();
 		}
 
+		if (mesh == null) {
+			return null;
+		}
+
 		mesh.forEach(q -> {
 			final int limit = q.material().spriteDepth();
+
 			for (int l = 0; l < limit; l++) {
 				Direction face = q.cullFace();
 				builders[face == null ? 6 : face.getId()].add(q.toBakedQuad(l, finder.find(q, l), false));
diff --git a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinBlockRenderManager.java b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinBlockRenderManager.java
index 0312d82f1..82766e612 100644
--- a/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinBlockRenderManager.java
+++ b/fabric-renderer-api-v1/src/main/java/net/fabricmc/fabric/mixin/renderer/client/MixinBlockRenderManager.java
@@ -28,6 +28,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
 import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
 import net.fabricmc.fabric.impl.renderer.DamageModel;
+import net.minecraft.class_4587;
+import net.minecraft.class_4588;
 import net.minecraft.block.BlockState;
 import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.block.BlockModelRenderer;
@@ -42,35 +44,36 @@ import net.minecraft.world.BlockRenderView;
  */
 @Mixin(BlockRenderManager.class)
 public abstract class MixinBlockRenderManager {
-	@Shadow
-	private BlockModelRenderer renderer;
-	@Shadow
-	private Random random;
+// TODO: temporarily disabled - may no longer be needed
+//	@Shadow
+//	private BlockModelRenderer renderer;
+//	@Shadow
+//	private Random random;
 
-	private static final ThreadLocal<MutablePair<DamageModel, BakedModel>> DAMAGE_STATE = ThreadLocal.withInitial(() -> MutablePair.of(new DamageModel(), null));
+//	private static final ThreadLocal<MutablePair<DamageModel, BakedModel>> DAMAGE_STATE = ThreadLocal.withInitial(() -> MutablePair.of(new DamageModel(), null));
 
-	/**
-	 * Intercept the model assignment from getModel() - simpler than capturing entire LVT.
-	 */
-	@ModifyVariable(method = "tesselateDamage", at = @At(value = "STORE", ordinal = 0), allow = 1, require = 1)
-	private BakedModel hookTesselateDamageModel(BakedModel modelIn) {
-		DAMAGE_STATE.get().right = modelIn;
-		return modelIn;
-	}
+//	/**
+//	 * Intercept the model assignment from getModel() - simpler than capturing entire LVT.
+//	 */
+//	@ModifyVariable(method = "tesselateDamage", at = @At(value = "STORE", ordinal = 0), allow = 1, require = 1)
+//	private BakedModel hookTesselateDamageModel(BakedModel modelIn) {
+//		DAMAGE_STATE.get().right = modelIn;
+//		return modelIn;
+//	}
 
-	/**
-	 * If the model we just captured is a fabric model, render it using a specialized 
-	 * damage render context and cancel rest of the logic. Avoids creating a bunch of
-	 * vanilla quads for complex meshes and honors dynamic model geometry.
-	 */
-	@Inject(method = "tesselateDamage", cancellable = true, at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/client/render/block/BlockModels;getModel(Lnet/minecraft/block/BlockState;)Lnet/minecraft/client/render/model/BakedModel;"))
-	private void hookTesselateDamage(BufferBuilder bufferBuilder, BlockState blockState, BlockPos blockPos, Sprite sprite, BlockRenderView blockView, CallbackInfo ci) {
-		MutablePair<DamageModel, BakedModel> damageState = DAMAGE_STATE.get();
-
-		if (damageState.right != null && !((FabricBakedModel) damageState.right).isVanillaAdapter()) {
-			damageState.left.prepare(damageState.right, sprite, blockState, blockPos);
-			this.renderer.tesselate(blockView, damageState.left, blockState, blockPos, bufferBuilder, true, this.random, blockState.getRenderingSeed(blockPos));
-			ci.cancel();
-		}
-	}
+//	/**
+//	 * If the model we just captured is a fabric model, render it using a specialized
+//	 * damage render context and cancel rest of the logic. Avoids creating a bunch of
+//	 * vanilla quads for complex meshes and honors dynamic model geometry.
+//	 */
+//	@Inject(method = "tesselateDamage", cancellable = true, at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/client/render/block/BlockModels;getModel(Lnet/minecraft/block/BlockState;)Lnet/minecraft/client/render/model/BakedModel;"))
+//	private void hookTesselateDamage(BlockState blockState, BlockPos blockPos, BlockRenderView blockView, class_4587 matrix, class_4588 buffer, CallbackInfo ci) {
+//		MutablePair<DamageModel, BakedModel> damageState = DAMAGE_STATE.get();
+//
+//		if (damageState.right != null && !((FabricBakedModel) damageState.right).isVanillaAdapter()) {
+//			damageState.left.prepare(damageState.right, sprite, blockState, blockPos);
+//			this.renderer.tesselate(blockView, damageState.left, blockState, blockPos, matrix, buffer, true, this.random, blockState.getRenderingSeed(blockPos));
+//			ci.cancel();
+//		}
+//	}
 }
diff --git a/fabric-renderer-api-v1/src/main/resources/fabric.mod.json b/fabric-renderer-api-v1/src/main/resources/fabric.mod.json
index f8e4eb134..501a70e68 100644
--- a/fabric-renderer-api-v1/src/main/resources/fabric.mod.json
+++ b/fabric-renderer-api-v1/src/main/resources/fabric.mod.json
@@ -17,7 +17,7 @@
   ],
   "depends": {
     "fabricloader": ">=0.6.2",
-    "minecraft": ">=1.15-alpha.19.38.b",
+    "minecraft": ">=1.15-alpha.19.39.a",
     "fabric-api-base": "*"
   },
   "description": "Defines rendering extensions for dynamic/fancy block and item models.",
diff --git a/fabric-renderer-indigo/build.gradle b/fabric-renderer-indigo/build.gradle
index 26031b236..7942cab86 100644
--- a/fabric-renderer-indigo/build.gradle
+++ b/fabric-renderer-indigo/build.gradle
@@ -1,5 +1,5 @@
 archivesBaseName = "fabric-renderer-indigo"
-version = getSubprojectVersion(project, "0.2.1")
+version = getSubprojectVersion(project, "0.2.2")
 
 dependencies {
 	compile project(path: ':fabric-api-base', configuration: 'dev')
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/accessor/AccessBufferBuilder.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/accessor/AccessBufferBuilder.java
deleted file mode 100644
index c18c0434b..000000000
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/accessor/AccessBufferBuilder.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (c) 2016, 2017, 2018, 2019 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.indigo.renderer.accessor;
-
-import net.fabricmc.indigo.renderer.mesh.QuadViewImpl;
-
-public interface AccessBufferBuilder {
-	void fabric_putQuad(QuadViewImpl quad);
-}
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/accessor/AccessChunkRenderer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/accessor/AccessChunkRenderer.java
index dd9810d65..30ca83295 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/accessor/AccessChunkRenderer.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/accessor/AccessChunkRenderer.java
@@ -17,8 +17,7 @@
 package net.fabricmc.indigo.renderer.accessor;
 
 import net.minecraft.client.render.BufferBuilder;
-import net.minecraft.util.math.BlockPos;
 
 public interface AccessChunkRenderer {
-	void fabric_beginBufferBuilding(BufferBuilder bufferBuilder_1, BlockPos blockPos_1);
+	void fabric_beginBufferBuilding(BufferBuilder bufferBuilder);
 }
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/EncodingFormat.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/EncodingFormat.java
index f313866ed..6522a3ef3 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/EncodingFormat.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mesh/EncodingFormat.java
@@ -59,11 +59,11 @@ public abstract class EncodingFormat {
 		VERTEX_X = HEADER_STRIDE + 0;
 		VERTEX_Y = HEADER_STRIDE + 1;
 		VERTEX_Z = HEADER_STRIDE + 2;
-		VERTEX_COLOR = HEADER_STRIDE + (format.getColorOffset() >> 2);
-		VERTEX_U = HEADER_STRIDE + (format.getUvOffset(0) >> 2);
+		VERTEX_COLOR = HEADER_STRIDE + 4;
+		VERTEX_U = HEADER_STRIDE + 5;
 		VERTEX_V = VERTEX_U + 1;
-		VERTEX_LIGHTMAP = HEADER_STRIDE + (format.getUvOffset(1) >> 2);
-		VERTEX_NORMAL = HEADER_STRIDE + (format.getNormalOffset() >> 2);
+		VERTEX_LIGHTMAP = HEADER_STRIDE + 6;
+		VERTEX_NORMAL = HEADER_STRIDE + 7;
 		VERTEX_STRIDE = format.getVertexSizeInteger();
 		QUAD_STRIDE = VERTEX_STRIDE * 4;
 		QUAD_STRIDE_BYTES = QUAD_STRIDE * 4;
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinBlockModelRenderer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinBlockModelRenderer.java
index d4da17359..049c0f8df 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinBlockModelRenderer.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinBlockModelRenderer.java
@@ -30,9 +30,10 @@ import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
 import net.fabricmc.indigo.renderer.accessor.AccessBlockModelRenderer;
 import net.fabricmc.indigo.renderer.aocalc.VanillaAoHelper;
 import net.fabricmc.indigo.renderer.render.BlockRenderContext;
+import net.minecraft.class_4587;
+import net.minecraft.class_4588;
 import net.minecraft.block.BlockState;
 import net.minecraft.client.color.block.BlockColors;
-import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.block.BlockModelRenderer;
 import net.minecraft.client.render.model.BakedModel;
 import net.minecraft.util.math.BlockPos;
@@ -50,12 +51,12 @@ public abstract class MixinBlockModelRenderer implements AccessBlockModelRendere
 	private final ThreadLocal<BlockRenderContext> CONTEXTS = ThreadLocal.withInitial(BlockRenderContext::new);
 
 	@Inject(at = @At("HEAD"), method = "tesselate", cancellable = true)
-	private void hookTesselate(BlockRenderView blockView, BakedModel model, BlockState state, BlockPos pos, BufferBuilder buffer, boolean checkSides, Random rand, long seed, CallbackInfoReturnable<Boolean> ci) {
+	private void hookTesselate(BlockRenderView blockView, BakedModel model, BlockState state, BlockPos pos, class_4587 matrix, class_4588 buffer, boolean checkSides, Random rand, long seed, CallbackInfoReturnable<Boolean> ci) {
 		if (!((FabricBakedModel) model).isVanillaAdapter()) {
 			BlockRenderContext context = CONTEXTS.get();
 
 			if (!context.isCallingVanilla()) {
-				ci.setReturnValue(CONTEXTS.get().tesselate((BlockModelRenderer) (Object) this, blockView, model, state, pos, buffer, seed));
+				ci.setReturnValue(CONTEXTS.get().tesselate((BlockModelRenderer)(Object) this, blockView, model, state, pos, matrix, buffer, checkSides, seed));
 			}
 		}
 	}
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinBufferBuilder.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinBufferBuilder.java
deleted file mode 100644
index 4b49bcddc..000000000
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinBufferBuilder.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2016, 2017, 2018, 2019 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.indigo.renderer.mixin;
-
-import java.nio.IntBuffer;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-
-import net.fabricmc.indigo.Indigo;
-import net.fabricmc.indigo.renderer.accessor.AccessBufferBuilder;
-import net.fabricmc.indigo.renderer.mesh.EncodingFormat;
-import net.fabricmc.indigo.renderer.mesh.QuadViewImpl;
-import net.minecraft.client.render.BufferBuilder;
-import net.minecraft.client.render.VertexFormat;
-import net.minecraft.client.render.VertexFormatElement;
-
-@Mixin(BufferBuilder.class)
-public abstract class MixinBufferBuilder implements AccessBufferBuilder {
-	@Shadow
-	private IntBuffer bufInt;
-	@Shadow
-	private int vertexCount;
-
-	@Shadow
-	abstract void grow(int size);
-
-	@Shadow
-	abstract int getCurrentSize();
-
-	@Shadow
-	public abstract VertexFormat getVertexFormat();
-
-	@Override
-	public void fabric_putQuad(QuadViewImpl quad) {
-		if (Indigo.ENSURE_VERTEX_FORMAT_COMPATIBILITY) {
-			bufferCompatibly(quad);
-		} else {
-			bufferFast(quad);
-		}
-	}
-
-	private void bufferFast(QuadViewImpl quad) {
-		grow(EncodingFormat.QUAD_STRIDE_BYTES + getVertexFormat().getVertexSize());
-		bufInt.limit(bufInt.capacity());
-		bufInt.position(getCurrentSize());
-		bufInt.put(quad.data(), quad.vertexStart(), EncodingFormat.QUAD_STRIDE);
-		vertexCount += 4;
-	}
-
-	/**
-	 * Uses buffer vertex format to drive buffer population.
-	 * Relies on logic elsewhere to ensure coordinates don't include chunk offset
-	 * (because buffer builder will handle that.)<p>
-	 * 
-	 * Calling putVertexData() would likely be a little faster but this approach
-	 * gives us a chance to pass vertex normals to shaders, which isn't possible
-	 * with the standard block format. It also doesn't require us to encode a specific
-	 * custom format directly, which would be prone to breakage outside our control. 
-	 */
-	private void bufferCompatibly(QuadViewImpl quad) {
-		final VertexFormat format = getVertexFormat();
-		final int elementCount = format.getElementCount();
-		
-		for (int i = 0; i < 4; i++) {
-			for (int j = 0; j < elementCount; j++) {
-				VertexFormatElement e = format.getElement(j);
-				
-				switch (e.getType()) {
-				case COLOR:
-					final int c = quad.spriteColor(i, 0);
-					((BufferBuilder) (Object) this).color(c & 0xFF, (c >>> 8) & 0xFF, (c >>> 16) & 0xFF, (c >>> 24) & 0xFF);
-					break;
-				case NORMAL:
-					((BufferBuilder) (Object) this).normal(quad.normalX(i), quad.normalY(i), quad.normalZ(i));
-					break;
-				case POSITION:
-					((BufferBuilder) (Object) this).vertex(quad.x(i), quad.y(i), quad.z(i));
-					break;
-				case UV:
-					if (e.getIndex() == 0) {
-						((BufferBuilder) (Object) this).texture(quad.spriteU(i, 0), quad.spriteV(i, 0));
-					} else {
-						final int b = quad.lightmap(i);
-						((BufferBuilder) (Object) this).texture((b >> 16) & 0xFFFF, b & 0xFFFF);
-					}
-					break;
-
-				// these types should never occur and/or require no action
-				case PADDING:
-				case GENERIC:
-				default:
-					break;
-
-				}
-			}
-			
-			((BufferBuilder) (Object) this).next();
-		}
-	}
-}
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRebuildTask.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRebuildTask.java
index d68be2e06..f78e66611 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRebuildTask.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRebuildTask.java
@@ -30,6 +30,8 @@ import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
 import net.fabricmc.indigo.Indigo;
 import net.fabricmc.indigo.renderer.accessor.AccessChunkRendererRegion;
 import net.fabricmc.indigo.renderer.render.TerrainRenderContext;
+import net.minecraft.class_4587;
+import net.minecraft.class_4588;
 import net.minecraft.block.BlockRenderType;
 import net.minecraft.block.BlockState;
 import net.minecraft.block.entity.BlockEntity;
@@ -91,17 +93,19 @@ public class MixinChunkRebuildTask {
 	 * Normally this does nothing but will allow mods to create rendering hooks that are
 	 * driven off of render type. (Not recommended or encouraged, but also not prevented.)
 	 */
-	@Redirect(method = "method_22785", require = 1, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/BlockRenderManager;tesselateBlock(Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/client/render/BufferBuilder;Ljava/util/Random;)Z"))
-	private boolean hookChunkBuildTesselate(BlockRenderManager renderManager, BlockState blockState, BlockPos blockPos, BlockRenderView blockView, BufferBuilder bufferBuilder, Random random) {
-		if (blockState.getRenderType() == BlockRenderType.MODEL) {
-			final BakedModel model = renderManager.getModel(blockState);
+	@Redirect(method = "method_22785", require = 1, at = @At(value = "INVOKE", 
+			target = "Lnet/minecraft/client/render/block/BlockRenderManager;tesselateBlock(Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/class_4587;Lnet/minecraft/class_4588;ZLjava/util/Random;)Z"))
+	private boolean hookChunkBuildTesselate(BlockRenderManager renderManager, BlockState blockState, BlockPos blockPos, BlockRenderView blockView, class_4587 matrix, class_4588 bufferBuilder, boolean checkSides, Random random) {
+		// TODO: temporarily disabled
+		//		if (blockState.getRenderType() == BlockRenderType.MODEL) {
+		//			final BakedModel model = renderManager.getModel(blockState);
+		//
+		//			if (Indigo.ALWAYS_TESSELATE_INDIGO || !((FabricBakedModel) model).isVanillaAdapter()) {
+		//				return ((AccessChunkRendererRegion) blockView).fabric_getRenderer().tesselateBlock(blockState, blockPos, model, matrix);
+		//			}
+		//		}
 
-			if (Indigo.ALWAYS_TESSELATE_INDIGO || !((FabricBakedModel) model).isVanillaAdapter()) {
-				return ((AccessChunkRendererRegion) blockView).fabric_getRenderer().tesselateBlock(blockState, blockPos, model);
-			}
-		}
-
-		return renderManager.tesselateBlock(blockState, blockPos, blockView, bufferBuilder, random);
+		return renderManager.tesselateBlock(blockState, blockPos, blockView, matrix, bufferBuilder, checkSides, random);
 	}
 
 	/**
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderer.java
index 8ed9b9bad..3538b6aec 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderer.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinChunkRenderer.java
@@ -22,18 +22,17 @@ import org.spongepowered.asm.mixin.Shadow;
 import net.fabricmc.indigo.renderer.accessor.AccessChunkRenderer;
 import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.chunk.ChunkBatcher.ChunkRenderer;
-import net.minecraft.util.math.BlockPos;
 
 @Mixin(ChunkRenderer.class)
 public abstract class MixinChunkRenderer implements AccessChunkRenderer {
 	@Shadow
-	abstract void beginBufferBuilding(BufferBuilder builder, BlockPos pos);
+	abstract void beginBufferBuilding(BufferBuilder builder);
 
 	/** 
 	 * Access method for renderer.
 	 */
 	@Override
-	public void fabric_beginBufferBuilding(BufferBuilder builder, BlockPos pos) {
-		beginBufferBuilding(builder, pos);
+	public void fabric_beginBufferBuilding(BufferBuilder builder) {
+		beginBufferBuilding(builder);
 	}
 }
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinItemRenderer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinItemRenderer.java
index eb5c0d9da..bb47086db 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinItemRenderer.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/MixinItemRenderer.java
@@ -16,50 +16,38 @@
 
 package net.fabricmc.indigo.renderer.mixin;
 
-import java.util.List;
-
 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 net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
-import net.fabricmc.indigo.renderer.render.ItemRenderContext;
-import net.minecraft.client.color.item.ItemColors;
-import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.item.ItemRenderer;
-import net.minecraft.client.render.model.BakedModel;
-import net.minecraft.client.render.model.BakedQuad;
-import net.minecraft.item.ItemStack;
 
 @Mixin(ItemRenderer.class)
 public abstract class MixinItemRenderer {
-	@Shadow
-	protected abstract void renderQuads(BufferBuilder bufferBuilder, List<BakedQuad> quads, int color, ItemStack stack);
-
-	@Shadow
-	protected ItemColors colorMap;
-	private final ThreadLocal<ItemRenderContext> CONTEXTS = ThreadLocal.withInitial(() -> new ItemRenderContext(colorMap));
-
-	/**
-	 * Save stack for enchantment glint renders - we won't otherwise have access to it 
-	 * during the glint render because it receives an empty stack. 
-	 */
-	@Inject(at = @At("HEAD"), method = "renderItemAndGlow")
-	private void hookRenderItemAndGlow(ItemStack stack, BakedModel model, CallbackInfo ci) {
-		if (stack.hasEnchantmentGlint() && !((FabricBakedModel) model).isVanillaAdapter()) {
-			CONTEXTS.get().enchantmentStack = stack;
-		}
-	}
-
-	@Inject(at = @At("HEAD"), method = "renderModel", cancellable = true)
-	private void hookRenderModel(BakedModel model, int color, ItemStack stack, CallbackInfo ci) {
-		final FabricBakedModel fabricModel = (FabricBakedModel) model;
-
-		if (!fabricModel.isVanillaAdapter()) {
-			CONTEXTS.get().renderModel(fabricModel, color, stack, this::renderQuads);
-			ci.cancel();
-		}
-	}
+	// TODO: temporarily disabled
+	//	@Shadow
+	//	protected abstract void renderQuads(BufferBuilder bufferBuilder, List<BakedQuad> quads, int color, ItemStack stack);
+	//
+	//	@Shadow
+	//	protected ItemColors colorMap;
+	//	private final ThreadLocal<ItemRenderContext> CONTEXTS = ThreadLocal.withInitial(() -> new ItemRenderContext(colorMap));
+	//
+	//	/**
+	//	 * Save stack for enchantment glint renders - we won't otherwise have access to it 
+	//	 * during the glint render because it receives an empty stack. 
+	//	 */
+	//	@Inject(at = @At("HEAD"), method = "renderItemAndGlow")
+	//	private void hookRenderItemAndGlow(ItemStack stack, BakedModel model, CallbackInfo ci) {
+	//		if (stack.hasEnchantmentGlint() && !((FabricBakedModel) model).isVanillaAdapter()) {
+	//			CONTEXTS.get().enchantmentStack = stack;
+	//		}
+	//	}
+	//
+	//	@Inject(at = @At("HEAD"), method = "renderModel", cancellable = true)
+	//	private void hookRenderModel(BakedModel model, int color, ItemStack stack, CallbackInfo ci) {
+	//		final FabricBakedModel fabricModel = (FabricBakedModel) model;
+	//
+	//		if (!fabricModel.isVanillaAdapter()) {
+	//			CONTEXTS.get().renderModel(fabricModel, color, stack, this::renderQuads);
+	//			ci.cancel();
+	//		}
+	//	}
 }
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractMeshConsumer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractMeshConsumer.java
index 1bba113ce..1478f7e49 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractMeshConsumer.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractMeshConsumer.java
@@ -24,7 +24,6 @@ import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter;
 import net.fabricmc.fabric.api.renderer.v1.render.RenderContext.QuadTransform;
 import net.fabricmc.indigo.renderer.IndigoRenderer;
 import net.fabricmc.indigo.renderer.RenderMaterialImpl;
-import net.fabricmc.indigo.renderer.accessor.AccessBufferBuilder;
 import net.fabricmc.indigo.renderer.aocalc.AoCalculator;
 import net.fabricmc.indigo.renderer.helper.ColorHelper;
 import net.fabricmc.indigo.renderer.helper.GeometryHelper;
@@ -33,13 +32,14 @@ import net.fabricmc.indigo.renderer.mesh.MeshImpl;
 import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl;
 import net.minecraft.block.BlockRenderLayer;
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.render.BufferBuilder;
 
 /**
  * Consumer for pre-baked meshes.  Works by copying the mesh data to a
  * "editor" quad held in the instance, where all transformations are applied before buffering.
  */
 public abstract class AbstractMeshConsumer extends AbstractQuadRenderer implements Consumer<Mesh> {
-	protected AbstractMeshConsumer(BlockRenderInfo blockInfo, Function<BlockRenderLayer, AccessBufferBuilder> bufferFunc, AoCalculator aoCalc, QuadTransform transform) {
+	protected AbstractMeshConsumer(BlockRenderInfo blockInfo, Function<BlockRenderLayer, BufferBuilder> bufferFunc, AoCalculator aoCalc, QuadTransform transform) {
 		super(blockInfo, bufferFunc, aoCalc, transform);
 	}
 
@@ -102,13 +102,9 @@ public abstract class AbstractMeshConsumer extends AbstractQuadRenderer implemen
 			aoCalc.compute(q, false);
 		}
 
-		applyOffsets(q);
-
 		tesselateQuad(q, mat, 0);
 	}
 
-	protected abstract void applyOffsets(MutableQuadViewImpl quad);
-
 	/** 
 	 * Determines color index and render layer, then routes to appropriate 
 	 * tesselate routine based on material properties.
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java
index 7f12301f1..c25bd143d 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractQuadRenderer.java
@@ -21,13 +21,14 @@ import static net.fabricmc.indigo.renderer.helper.GeometryHelper.LIGHT_FACE_FLAG
 import java.util.function.Function;
 
 import net.fabricmc.fabric.api.renderer.v1.render.RenderContext.QuadTransform;
-import net.fabricmc.indigo.renderer.accessor.AccessBufferBuilder;
 import net.fabricmc.indigo.renderer.aocalc.AoCalculator;
 import net.fabricmc.indigo.renderer.helper.ColorHelper;
 import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockRenderLayer;
 import net.minecraft.block.BlockState;
+import net.minecraft.client.render.BufferBuilder;
+import net.minecraft.client.util.math.Matrix4f;
 import net.minecraft.util.math.BlockPos;
 
 /**
@@ -37,12 +38,14 @@ import net.minecraft.util.math.BlockPos;
 public abstract class AbstractQuadRenderer {
 	static final int FULL_BRIGHTNESS = 0xF000F0;
 
-	protected final Function<BlockRenderLayer, AccessBufferBuilder> bufferFunc;
+	protected final Function<BlockRenderLayer, BufferBuilder> bufferFunc;
 	protected final BlockRenderInfo blockInfo;
 	protected final AoCalculator aoCalc;
 	protected final QuadTransform transform;
 
-	AbstractQuadRenderer(BlockRenderInfo blockInfo, Function<BlockRenderLayer, AccessBufferBuilder> bufferFunc, AoCalculator aoCalc, QuadTransform transform) {
+	protected abstract Matrix4f matrix();
+
+	AbstractQuadRenderer(BlockRenderInfo blockInfo, Function<BlockRenderLayer, BufferBuilder> bufferFunc, AoCalculator aoCalc, QuadTransform transform) {
 		this.blockInfo = blockInfo;
 		this.bufferFunc = bufferFunc;
 		this.aoCalc = aoCalc;
@@ -65,7 +68,19 @@ public abstract class AbstractQuadRenderer {
 
 	/** final output step, common to all renders */
 	private void bufferQuad(MutableQuadViewImpl quad, BlockRenderLayer renderLayer) {
-		bufferFunc.apply(renderLayer).fabric_putQuad(quad);
+		bufferQuad(bufferFunc.apply(renderLayer), quad, matrix());
+	}
+
+	public static void bufferQuad(BufferBuilder buff, MutableQuadViewImpl quad, Matrix4f matrix) {
+		for (int i = 0; i < 4; i++) {
+			buff.method_22918(matrix, quad.x(i), quad.y(i), quad.z(i));
+			final int color = quad.spriteColor(i, 0);
+			buff.color(color & 0xFF, (color >> 8) & 0xFF, (color >> 16) & 0xFF, (color >> 24) & 0xFF);
+			buff.method_22913(quad.spriteU(i, 0), quad.spriteV(i, 0));
+			buff.method_22916(quad.lightmap(i));
+			buff.method_22914(quad.normalX(i),quad.normalY(i), quad.normalZ(i));
+			buff.next();
+		}
 	}
 
 	// routines below have a bit of copy-paste code reuse to avoid conditional execution inside a hot loop
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java
index b7d476518..e65d5a44f 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/AbstractRenderContext.java
@@ -19,10 +19,26 @@ package net.fabricmc.indigo.renderer.render;
 import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView;
 import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
+import net.minecraft.class_4587;
+import net.minecraft.block.BlockState;
+import net.minecraft.client.util.math.Matrix4f;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.Vec3d;
+import net.minecraft.world.BlockRenderView;
 
 abstract class AbstractRenderContext implements RenderContext {
 	private final ObjectArrayList<QuadTransform> transformStack = new ObjectArrayList<>();
 	private static final QuadTransform NO_TRANSFORM = (q) -> true;
+	protected class_4587 matrixStack;
+	protected Matrix4f matrix;
+
+	protected void prepareMatrix(BlockState blockState, BlockPos blockPos, BlockRenderView blockView, class_4587 matrixStack) {
+		this.matrixStack = matrixStack;
+		Vec3d vec = blockState.getOffsetPos(blockView, blockPos);
+		matrixStack.method_22903();
+		matrixStack.method_22904((double)(blockPos.getX() & 15) + vec.x, (double)(blockPos.getY() & 15) + vec.y, (double)(blockPos.getZ() & 15) + vec.z);
+		matrix = matrixStack.method_22910();
+	}
 
 	private final QuadTransform stackTransform = (q) -> {
 		int i = transformStack.size() - 1;
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java
index 491487fe9..7760ab117 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/BlockRenderContext.java
@@ -24,16 +24,16 @@ import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh;
 import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter;
 import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
 import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
-import net.fabricmc.indigo.renderer.accessor.AccessBufferBuilder;
 import net.fabricmc.indigo.renderer.aocalc.AoCalculator;
 import net.fabricmc.indigo.renderer.aocalc.AoLuminanceFix;
-import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl;
-import net.fabricmc.indigo.renderer.mixin.BufferBuilderOffsetAccessor;
+import net.minecraft.class_4587;
+import net.minecraft.class_4588;
 import net.minecraft.block.BlockRenderLayer;
 import net.minecraft.block.BlockState;
 import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.block.BlockModelRenderer;
 import net.minecraft.client.render.model.BakedModel;
+import net.minecraft.client.util.math.Matrix4f;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.BlockRenderView;
 
@@ -46,15 +46,11 @@ public class BlockRenderContext extends AbstractRenderContext implements RenderC
 	private final MeshConsumer meshConsumer = new MeshConsumer(blockInfo, this::outputBuffer, aoCalc, this::transform);
 	private final Random random = new Random();
 	private BlockModelRenderer vanillaRenderer;
-	private AccessBufferBuilder fabricBuffer;
+	private BufferBuilder bufferBuilder;
 	private long seed;
 	private boolean isCallingVanilla = false;
 	private boolean didOutput = false;
 
-	private double offsetX;
-	private double offsetY;
-	private double offsetZ;
-
 	public boolean isCallingVanilla() {
 		return isCallingVanilla;
 	}
@@ -72,57 +68,47 @@ public class BlockRenderContext extends AbstractRenderContext implements RenderC
 		return blockView == null ? 1f : AoLuminanceFix.INSTANCE.apply(blockView, pos);
 	}
 
-	private AccessBufferBuilder outputBuffer(BlockRenderLayer renderLayer) {
+	private BufferBuilder outputBuffer(BlockRenderLayer renderLayer) {
 		didOutput = true;
-		return fabricBuffer;
+		return bufferBuilder;
 	}
 
-	public boolean tesselate(BlockModelRenderer vanillaRenderer, BlockRenderView blockView, BakedModel model, BlockState state, BlockPos pos, BufferBuilder buffer, long seed) {
+	public boolean tesselate(BlockModelRenderer vanillaRenderer, BlockRenderView blockView, BakedModel model, BlockState state, BlockPos pos, class_4587 matrixStack, class_4588 buffer, boolean checkSides, long seed) {
 		this.vanillaRenderer = vanillaRenderer;
-		this.fabricBuffer = (AccessBufferBuilder) buffer;
+		this.bufferBuilder = (BufferBuilder) buffer;
+		this.prepareMatrix(state, pos, blockView, matrixStack);
+
 		this.seed = seed;
 		this.didOutput = false;
 		aoCalc.clear();
 		blockInfo.setBlockView(blockView);
 		blockInfo.prepareForBlock(state, pos, model.useAmbientOcclusion());
-		setupOffsets();
 
 		((FabricBakedModel) model).emitBlockQuads(blockView, state, pos, blockInfo.randomSupplier, this);
 
 		this.vanillaRenderer = null;
 		blockInfo.release();
-		this.fabricBuffer = null;
+		this.bufferBuilder = null;
+
+		matrixStack.method_22909();
+
 		return didOutput;
 	}
 
 	protected void acceptVanillaModel(BakedModel model) {
 		isCallingVanilla = true;
-		didOutput = didOutput && vanillaRenderer.tesselate(blockInfo.blockView, model, blockInfo.blockState, blockInfo.blockPos, (BufferBuilder) fabricBuffer, false, random, seed);
+		didOutput = didOutput && vanillaRenderer.tesselate(blockInfo.blockView, model, blockInfo.blockState, blockInfo.blockPos, matrixStack, (class_4588) bufferBuilder, false, random, seed);
 		isCallingVanilla = false;
 	}
 
-	private void setupOffsets() {
-		final BufferBuilderOffsetAccessor buffer = (BufferBuilderOffsetAccessor) fabricBuffer;
-		final BlockPos pos = blockInfo.blockPos;
-		offsetX = buffer.getOffsetX() + pos.getX();
-		offsetY = buffer.getOffsetY() + pos.getY();
-		offsetZ = buffer.getOffsetZ() + pos.getZ();
-	}
-
 	private class MeshConsumer extends AbstractMeshConsumer {
-		MeshConsumer(BlockRenderInfo blockInfo, Function<BlockRenderLayer, AccessBufferBuilder> bufferFunc, AoCalculator aoCalc, QuadTransform transform) {
+		MeshConsumer(BlockRenderInfo blockInfo, Function<BlockRenderLayer, BufferBuilder> bufferFunc, AoCalculator aoCalc, QuadTransform transform) {
 			super(blockInfo, bufferFunc, aoCalc, transform);
 		}
 
 		@Override
-		protected void applyOffsets(MutableQuadViewImpl q) {
-			final double x = offsetX;
-			final double y = offsetY;
-			final double z = offsetZ;
-	
-			for (int i = 0; i < 4; i++) {
-				q.pos(i, (float) (q.x(i) + x), (float) (q.y(i) + y), (float) (q.z(i) + z));
-			}
+		protected Matrix4f matrix() {
+			return matrix;
 		}
 	}
 
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ChunkRenderInfo.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ChunkRenderInfo.java
index f2c3e2767..fe9edf280 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ChunkRenderInfo.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ChunkRenderInfo.java
@@ -20,7 +20,6 @@ import it.unimi.dsi.fastutil.longs.Long2FloatOpenHashMap;
 import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap;
 import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
 import net.fabricmc.indigo.Indigo;
-import net.fabricmc.indigo.renderer.accessor.AccessBufferBuilder;
 import net.fabricmc.indigo.renderer.accessor.AccessChunkRenderer;
 import net.fabricmc.indigo.renderer.accessor.AccessChunkRendererData;
 import net.fabricmc.indigo.renderer.aocalc.AoLuminanceFix;
@@ -77,7 +76,7 @@ public class ChunkRenderInfo {
 	BlockLayeredBufferBuilder builders;
 	BlockRenderView blockView;
 
-	private final Object2ObjectOpenHashMap<BlockRenderLayer, AccessBufferBuilder> buffers = new Object2ObjectOpenHashMap<>();
+	private final Object2ObjectOpenHashMap<BlockRenderLayer, BufferBuilder> buffers = new Object2ObjectOpenHashMap<>();
 
 	private double chunkOffsetX;
 	private double chunkOffsetY;
@@ -141,17 +140,17 @@ public class ChunkRenderInfo {
 	}
 
 	/** Lazily retrieves output buffer for given layer, initializing as needed. */
-	public AccessBufferBuilder getInitializedBuffer(BlockRenderLayer renderLayer) {
-		AccessBufferBuilder result = buffers.get(renderLayer);
+	public BufferBuilder getInitializedBuffer(BlockRenderLayer renderLayer) {
+		BufferBuilder result = buffers.get(renderLayer);
 
 		if (result == null) {
 			BufferBuilder builder = builders.get(renderLayer);
-			result = (AccessBufferBuilder) builder;
+			result = (BufferBuilder) builder;
 			chunkData.fabric_markPopulated(renderLayer);
 			buffers.put(renderLayer, result);
 
 			if (chunkData.fabric_markInitialized(renderLayer)) {
-				((AccessChunkRenderer) chunkRenderer).fabric_beginBufferBuilding(builder, chunkOrigin);
+				((AccessChunkRenderer) chunkRenderer).fabric_beginBufferBuilding(builder);
 			}
 		}
 		return result;
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java
index adb644e13..3c70351ca 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/ItemRenderContext.java
@@ -32,7 +32,6 @@ import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
 import net.fabricmc.fabric.api.renderer.v1.model.ModelHelper;
 import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
 import net.fabricmc.indigo.renderer.RenderMaterialImpl;
-import net.fabricmc.indigo.renderer.accessor.AccessBufferBuilder;
 import net.fabricmc.indigo.renderer.helper.ColorHelper;
 import net.fabricmc.indigo.renderer.helper.GeometryHelper;
 import net.fabricmc.indigo.renderer.mesh.EncodingFormat;
@@ -45,6 +44,7 @@ import net.minecraft.client.render.Tessellator;
 import net.minecraft.client.render.VertexFormats;
 import net.minecraft.client.render.model.BakedModel;
 import net.minecraft.client.render.model.BakedQuad;
+import net.minecraft.client.util.math.Matrix4f;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.math.Direction;
 
@@ -67,7 +67,6 @@ public class ItemRenderContext extends AbstractRenderContext implements RenderCo
 	private final Random random = new Random();
 	private final Consumer<BakedModel> fallbackConsumer;
 	BufferBuilder bufferBuilder;
-	AccessBufferBuilder fabricBuffer;
 	private int color;
 	private ItemStack itemStack;
 	private VanillaQuadHandler vanillaHandler;
@@ -109,7 +108,6 @@ public class ItemRenderContext extends AbstractRenderContext implements RenderCo
 		this.vanillaHandler = vanillaHandler;
 		Tessellator tessellator = Tessellator.getInstance();
 		bufferBuilder = tessellator.getBufferBuilder();
-		fabricBuffer = (AccessBufferBuilder) this.bufferBuilder;
 
 		bufferBuilder.begin(7, VertexFormats.POSITION_COLOR_UV_NORMAL);
 		model.emitItemQuads(stack, randomSupplier, this);
@@ -121,7 +119,6 @@ public class ItemRenderContext extends AbstractRenderContext implements RenderCo
 		}
 
 		bufferBuilder = null;
-		fabricBuffer = null;
 		tessellator = null;
 		this.itemStack = null;
 		this.vanillaHandler = null;
@@ -137,7 +134,8 @@ public class ItemRenderContext extends AbstractRenderContext implements RenderCo
 		public Maker emit() {
 			lightFace(GeometryHelper.lightFace(this));
 			ColorHelper.applyDiffuseShading(this, false);
-			renderQuad();
+			//TODO: populate
+			renderQuad(null);
 			clear();
 			return this;
 		}
@@ -155,7 +153,8 @@ public class ItemRenderContext extends AbstractRenderContext implements RenderCo
 			System.arraycopy(data, index, editorQuad.data(), 0, EncodingFormat.TOTAL_STRIDE);
 			editorQuad.load();
 			index += EncodingFormat.TOTAL_STRIDE;
-			renderQuad();
+			//TODO: populate
+			renderQuad(null);
 		}
 	};
 
@@ -185,7 +184,7 @@ public class ItemRenderContext extends AbstractRenderContext implements RenderCo
 		return quadColor;
 	}
 
-	private void colorizeAndOutput(int quadColor) {
+	private void colorizeAndOutput(int quadColor, Matrix4f matrix) {
 		final MutableQuadViewImpl q = editorQuad;
 
 		for (int i = 0; i < 4; i++) {
@@ -194,10 +193,10 @@ public class ItemRenderContext extends AbstractRenderContext implements RenderCo
 			q.spriteColor(i, 0, ColorHelper.swapRedBlueIfNeeded(c));
 		}
 
-		fabricBuffer.fabric_putQuad(q);
+		AbstractQuadRenderer.bufferQuad(bufferBuilder, q, matrix);
 	}
 
-	private void renderQuad() {
+	private void renderQuad(Matrix4f matrix) {
 		final MutableQuadViewImpl quad = editorQuad;
 
 		if (!transform(editorQuad)) {
@@ -212,7 +211,7 @@ public class ItemRenderContext extends AbstractRenderContext implements RenderCo
 		quad.populateMissingNormals();
 		quad.lightmap(FULL_BRIGHTNESS, FULL_BRIGHTNESS, FULL_BRIGHTNESS, FULL_BRIGHTNESS);
 
-		colorizeAndOutput(!enchantment && mat.disableColorIndex(0) ? -1 : quadColor);
+		colorizeAndOutput(!enchantment && mat.disableColorIndex(0) ? -1 : quadColor, matrix);
 	}
 
 	@Override
@@ -252,7 +251,8 @@ public class ItemRenderContext extends AbstractRenderContext implements RenderCo
 				editorQuad.lightFace(lightFace);
 				editorQuad.nominalFace(lightFace);
 				editorQuad.colorIndex(q.getColorIndex());
-				renderQuad();
+				//TODO: populate
+				renderQuad(null);
 			}
 		} else {
 			vanillaHandler.accept(bufferBuilder, quads, color, stack);
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java
index 27ba108f0..1464dcfad 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainFallbackConsumer.java
@@ -33,6 +33,7 @@ import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl;
 import net.minecraft.block.BlockState;
 import net.minecraft.client.render.model.BakedModel;
 import net.minecraft.client.render.model.BakedQuad;
+import net.minecraft.client.util.math.Matrix4f;
 import net.minecraft.util.math.Direction;
 
 /**
@@ -60,10 +61,17 @@ public class TerrainFallbackConsumer extends AbstractQuadRenderer implements Con
 
 	private final int[] editorBuffer = new int[EncodingFormat.TOTAL_STRIDE];
 	private final ChunkRenderInfo chunkInfo;
+	private final Supplier<Matrix4f> matrixSupplier;
 
-	TerrainFallbackConsumer(BlockRenderInfo blockInfo, ChunkRenderInfo chunkInfo, AoCalculator aoCalc, QuadTransform transform) {
+	TerrainFallbackConsumer(BlockRenderInfo blockInfo, ChunkRenderInfo chunkInfo, AoCalculator aoCalc, QuadTransform transform, Supplier<Matrix4f> matrixSupplier) {
 		super(blockInfo, chunkInfo::getInitializedBuffer, aoCalc, transform);
 		this.chunkInfo = chunkInfo;
+		this.matrixSupplier = matrixSupplier;
+	}
+
+	@Override
+	protected Matrix4f matrix() {
+		return matrixSupplier.get();
 	}
 
 	private final MutableQuadViewImpl editorQuad = new MutableQuadViewImpl() {
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainMeshConsumer.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainMeshConsumer.java
index 69a898ffd..a698c608a 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainMeshConsumer.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainMeshConsumer.java
@@ -16,20 +16,22 @@
 
 package net.fabricmc.indigo.renderer.render;
 
+import java.util.function.Supplier;
+
 import net.fabricmc.fabric.api.renderer.v1.render.RenderContext.QuadTransform;
 import net.fabricmc.indigo.renderer.aocalc.AoCalculator;
-import net.fabricmc.indigo.renderer.mesh.MutableQuadViewImpl;
+import net.minecraft.client.util.math.Matrix4f;
 
 public class TerrainMeshConsumer extends AbstractMeshConsumer {
-	private final ChunkRenderInfo chunkInfo;
+	final Supplier<Matrix4f> matrixSupplier;
 
-	TerrainMeshConsumer(TerrainBlockRenderInfo blockInfo, ChunkRenderInfo chunkInfo, AoCalculator aoCalc, QuadTransform transform) {
+	TerrainMeshConsumer(TerrainBlockRenderInfo blockInfo, ChunkRenderInfo chunkInfo, AoCalculator aoCalc, QuadTransform transform, Supplier<Matrix4f> matrixSupplier) {
 		super(blockInfo, chunkInfo::getInitializedBuffer, aoCalc, transform);
-		this.chunkInfo = chunkInfo;
+		this.matrixSupplier = matrixSupplier;
 	}
 
 	@Override
-	protected void applyOffsets(MutableQuadViewImpl quad) {
-		chunkInfo.applyOffsets(quad);
+	protected Matrix4f matrix() {
+		return matrixSupplier.get();
 	}
 }
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java
index 26e94bda6..23ad20e55 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java
+++ b/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/render/TerrainRenderContext.java
@@ -23,12 +23,14 @@ import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter;
 import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
 import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
 import net.fabricmc.indigo.renderer.aocalc.AoCalculator;
+import net.minecraft.class_4587;
 import net.minecraft.block.BlockState;
+import net.minecraft.client.render.chunk.BlockLayeredBufferBuilder;
 import net.minecraft.client.render.chunk.ChunkBatcher.ChunkRenderData;
 import net.minecraft.client.render.chunk.ChunkBatcher.ChunkRenderer;
-import net.minecraft.client.render.chunk.BlockLayeredBufferBuilder;
 import net.minecraft.client.render.chunk.ChunkRendererRegion;
 import net.minecraft.client.render.model.BakedModel;
+import net.minecraft.client.util.math.Matrix4f;
 import net.minecraft.util.crash.CrashException;
 import net.minecraft.util.crash.CrashReport;
 import net.minecraft.util.crash.CrashReportSection;
@@ -44,8 +46,8 @@ public class TerrainRenderContext extends AbstractRenderContext implements Rende
 	private final TerrainBlockRenderInfo blockInfo = new TerrainBlockRenderInfo();
 	private final ChunkRenderInfo chunkInfo = new ChunkRenderInfo(blockInfo);
 	private final AoCalculator aoCalc = new AoCalculator(blockInfo, chunkInfo::cachedBrightness, chunkInfo::cachedAoLevel);
-	private final TerrainMeshConsumer meshConsumer = new TerrainMeshConsumer(blockInfo, chunkInfo, aoCalc, this::transform);
-	private final TerrainFallbackConsumer fallbackConsumer = new TerrainFallbackConsumer(blockInfo, chunkInfo, aoCalc, this::transform);
+	private final TerrainMeshConsumer meshConsumer = new TerrainMeshConsumer(blockInfo, chunkInfo, aoCalc, this::transform, this::matrix);
+	private final TerrainFallbackConsumer fallbackConsumer = new TerrainFallbackConsumer(blockInfo, chunkInfo, aoCalc, this::transform, this::matrix);
 
 	public TerrainRenderContext prepare(ChunkRendererRegion blockView, ChunkRenderer chunkRenderer, ChunkRenderData chunkData, BlockLayeredBufferBuilder builders) {
 		blockInfo.setBlockView(blockView);
@@ -58,8 +60,13 @@ public class TerrainRenderContext extends AbstractRenderContext implements Rende
 		blockInfo.release();
 	}
 
+	protected Matrix4f matrix() {
+		return matrix;
+	}
+
 	/** Called from chunk renderer hook. */
-	public boolean tesselateBlock(BlockState blockState, BlockPos blockPos, final BakedModel model) {
+	public boolean tesselateBlock(BlockState blockState, BlockPos blockPos, final BakedModel model, class_4587 matrixStack) {
+		prepareMatrix(blockState, blockPos, blockInfo.blockView, matrixStack);
 		try {
 			aoCalc.clear();
 			blockInfo.prepareForBlock(blockState, blockPos, model.useAmbientOcclusion());
@@ -71,6 +78,7 @@ public class TerrainRenderContext extends AbstractRenderContext implements Rende
 			CrashReportSection.addBlockInfo(crashReportElement_1, blockPos, blockState);
 			throw new CrashException(crashReport_1);
 		}
+		matrixStack.method_22909();
 		// false because we've already marked the chunk as populated - caller doesn't need to
 		return false;
 	}
diff --git a/fabric-renderer-indigo/src/main/resources/fabric-renderer-indigo.mixins.json b/fabric-renderer-indigo/src/main/resources/fabric-renderer-indigo.mixins.json
index 589b1589d..d1a99666b 100755
--- a/fabric-renderer-indigo/src/main/resources/fabric-renderer-indigo.mixins.json
+++ b/fabric-renderer-indigo/src/main/resources/fabric-renderer-indigo.mixins.json
@@ -6,10 +6,8 @@
   "mixins": [
   ],
   "client": [
-    "BufferBuilderOffsetAccessor",
     "MixinAmbientOcclusionCalculator",
     "MixinBlockModelRenderer",
-    "MixinBufferBuilder",
     "MixinChunkRebuildTask",
     "MixinChunkRenderData",
     "MixinChunkRenderer",
diff --git a/fabric-renderer-indigo/src/main/resources/fabric.mod.json b/fabric-renderer-indigo/src/main/resources/fabric.mod.json
index cef6affc6..738d3df7a 100755
--- a/fabric-renderer-indigo/src/main/resources/fabric.mod.json
+++ b/fabric-renderer-indigo/src/main/resources/fabric.mod.json
@@ -17,7 +17,7 @@
   ],
   "depends": {
     "fabricloader": ">=0.6.2",
-    "minecraft": ">=1.15-alpha.19.38.b",
+    "minecraft": ">=1.15-alpha.19.39.a",
     "fabric-api-base": "*",
     "fabric-renderer-api-v1": "*"
   },
diff --git a/fabric-renderer-registries-v1/build.gradle b/fabric-renderer-registries-v1/build.gradle
new file mode 100644
index 000000000..df2ccde69
--- /dev/null
+++ b/fabric-renderer-registries-v1/build.gradle
@@ -0,0 +1,6 @@
+archivesBaseName = "fabric-renderer-registries-v1"
+version = getSubprojectVersion(project, "1.0.0")
+
+dependencies {
+	compile project(path: ':fabric-api-base', configuration: 'dev')
+}
diff --git a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinBlockEntityRenderManager.java b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/BlockEntityRendererRegistry.java
similarity index 50%
rename from fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinBlockEntityRenderManager.java
rename to fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/BlockEntityRendererRegistry.java
index c1090112d..15c125e47 100644
--- a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinBlockEntityRenderManager.java
+++ b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/BlockEntityRendererRegistry.java
@@ -14,27 +14,25 @@
  * limitations under the License.
  */
 
-package net.fabricmc.fabric.mixin.client.render;
+package net.fabricmc.fabric.api.client.rendereregistry.v1;
 
-import net.fabricmc.fabric.api.client.render.BlockEntityRendererRegistry;
+import net.fabricmc.fabric.mixin.client.rendereregistry.MixinBlockEntityRenderDispatcher;
 import net.minecraft.block.entity.BlockEntity;
+import net.minecraft.block.entity.BlockEntityType;
 import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
 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;
+/**
+ * Helper class for registering BlockEntityRenderers.
+ */
+public class BlockEntityRendererRegistry {
+	public static final BlockEntityRendererRegistry INSTANCE = new BlockEntityRendererRegistry();
 
-@Mixin(BlockEntityRenderDispatcher.class)
-public class MixinBlockEntityRenderManager {
-	@Shadow
-	private Map<Class<? extends BlockEntity>, BlockEntityRenderer<? extends BlockEntity>> renderers;
+	private BlockEntityRendererRegistry() {
 
-	@Inject(method = "<init>()V", at = @At("RETURN"))
-	public void init(CallbackInfo info) {
-		BlockEntityRendererRegistry.INSTANCE.initialize((BlockEntityRenderDispatcher) (Object) this, renderers);
+	}
+
+	public <E extends BlockEntity> void register(BlockEntityType<E> blockEntityType, BlockEntityRenderer<E> blockEntityRenderer) {
+		((MixinBlockEntityRenderDispatcher) BlockEntityRenderDispatcher.INSTANCE).invoke_method_23078(blockEntityType, blockEntityRenderer);
 	}
 }
diff --git a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/EntityRendererRegistry.java b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/EntityRendererRegistry.java
similarity index 74%
rename from fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/EntityRendererRegistry.java
rename to fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/EntityRendererRegistry.java
index 1517571e5..8b1c73f76 100644
--- a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/EntityRendererRegistry.java
+++ b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/api/client/rendereregistry/v1/EntityRendererRegistry.java
@@ -14,13 +14,14 @@
  * limitations under the License.
  */
 
-package net.fabricmc.fabric.api.client.render;
+package net.fabricmc.fabric.api.client.rendereregistry.v1;
 
 import net.minecraft.client.render.entity.EntityRenderDispatcher;
 import net.minecraft.client.render.entity.EntityRenderer;
 import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.client.texture.TextureManager;
 import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityType;
 import net.minecraft.resource.ReloadableResourceManager;
 
 import java.util.HashMap;
@@ -40,9 +41,9 @@ public class EntityRendererRegistry {
 		private final TextureManager textureManager;
 		private final ReloadableResourceManager resourceManager;
 		private final ItemRenderer itemRenderer;
-		private final Map<Class<? extends Entity>, EntityRenderer<? extends Entity>> rendererMap;
+		private final Map<EntityType<?>, EntityRenderer<?>> rendererMap;
 
-		private Context(TextureManager textureManager, ReloadableResourceManager resourceManager, ItemRenderer itemRenderer, Map<Class<? extends Entity>, EntityRenderer<? extends Entity>> rendererMap) {
+		private Context(TextureManager textureManager, ReloadableResourceManager resourceManager, ItemRenderer itemRenderer,Map<EntityType<?>, EntityRenderer<?>> rendererMap) {
 			this.textureManager = textureManager;
 			this.resourceManager = resourceManager;
 			this.itemRenderer = itemRenderer;
@@ -64,32 +65,34 @@ public class EntityRendererRegistry {
 
 	public static final EntityRendererRegistry INSTANCE = new EntityRendererRegistry();
 	private final Map<EntityRenderDispatcher, Context> renderManagerMap = new WeakHashMap<>();
-	private final Map<Class<? extends Entity>, EntityRendererRegistry.Factory> renderSupplierMap = new HashMap<>();
+	private final Map<EntityType<?>, EntityRendererRegistry.Factory> renderSupplierMap = new HashMap<>();
 
 	private EntityRendererRegistry() {
 
 	}
 
-	public void initialize(EntityRenderDispatcher manager, TextureManager textureManager, ReloadableResourceManager resourceManager, ItemRenderer itemRenderer, Map<Class<? extends Entity>, EntityRenderer<? extends Entity>> map) {
+	public void initialize(EntityRenderDispatcher manager, TextureManager textureManager, ReloadableResourceManager resourceManager, ItemRenderer itemRenderer, Map<EntityType<?>, EntityRenderer<?>> renderers) {
 		synchronized (renderSupplierMap) {
 			if (renderManagerMap.containsKey(manager)) {
 				return;
 			}
 
-			Context context = new Context(textureManager, resourceManager, itemRenderer, map);
+			Context context = new Context(textureManager, resourceManager, itemRenderer, renderers);
 			renderManagerMap.put(manager, context);
-			for (Class<? extends Entity> c : renderSupplierMap.keySet()) {
-				map.put(c, renderSupplierMap.get(c).create(manager, context));
+
+			for (EntityType<?> c : renderSupplierMap.keySet()) {
+				renderers.put(c, renderSupplierMap.get(c).create(manager, context));
 			}
 		}
 	}
 
-	public void register(Class<? extends Entity> entityClass, EntityRendererRegistry.Factory factory) {
+	public void register(EntityType<?> entityType, EntityRendererRegistry.Factory factory) {
 		synchronized (renderSupplierMap) {
 			// TODO: warn on duplicate
-			renderSupplierMap.put(entityClass, factory);
+			renderSupplierMap.put(entityType, factory);
+
 			for (EntityRenderDispatcher manager : renderManagerMap.keySet()) {
-				renderManagerMap.get(manager).rendererMap.put(entityClass, factory.create(manager, renderManagerMap.get(manager)));
+				renderManagerMap.get(manager).rendererMap.put(entityType, factory.create(manager, renderManagerMap.get(manager)));
 			}
 		}
 	}
diff --git a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/BufferBuilderOffsetAccessor.java b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinBlockEntityRenderDispatcher.java
similarity index 54%
rename from fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/BufferBuilderOffsetAccessor.java
rename to fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinBlockEntityRenderDispatcher.java
index 358634212..8a15f615d 100644
--- a/fabric-renderer-indigo/src/main/java/net/fabricmc/indigo/renderer/mixin/BufferBuilderOffsetAccessor.java
+++ b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinBlockEntityRenderDispatcher.java
@@ -14,20 +14,18 @@
  * limitations under the License.
  */
 
-package net.fabricmc.indigo.renderer.mixin;
+package net.fabricmc.fabric.mixin.client.rendereregistry;
 
-import net.minecraft.client.render.BufferBuilder;
 import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
+import org.spongepowered.asm.mixin.gen.Invoker;
 
-@Mixin(BufferBuilder.class)
-public interface BufferBuilderOffsetAccessor {
-	@Accessor
-	double getOffsetX();
+import net.minecraft.block.entity.BlockEntityType;
+import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
+import net.minecraft.client.render.block.entity.BlockEntityRenderer;
 
-	@Accessor
-	double getOffsetY();
-
-	@Accessor
-	double getOffsetZ();
+@Mixin(BlockEntityRenderDispatcher.class)
+public interface MixinBlockEntityRenderDispatcher {
+	@Invoker(value="method_23078")
+	@SuppressWarnings("rawtypes")
+	void invoke_method_23078(BlockEntityType blockEntityType, BlockEntityRenderer blockEntityRenderer);
 }
diff --git a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinEntityRenderManager.java b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinEntityRenderDispatcher.java
similarity index 70%
rename from fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinEntityRenderManager.java
rename to fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinEntityRenderDispatcher.java
index 2d6735e0b..415843dd6 100644
--- a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/mixin/client/render/MixinEntityRenderManager.java
+++ b/fabric-renderer-registries-v1/src/main/java/net/fabricmc/fabric/mixin/client/rendereregistry/MixinEntityRenderDispatcher.java
@@ -14,14 +14,16 @@
  * limitations under the License.
  */
 
-package net.fabricmc.fabric.mixin.client.render;
+package net.fabricmc.fabric.mixin.client.rendereregistry;
 
-import net.fabricmc.fabric.api.client.render.EntityRendererRegistry;
+import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry;
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.options.GameOptions;
 import net.minecraft.client.render.entity.EntityRenderDispatcher;
 import net.minecraft.client.render.entity.EntityRenderer;
 import net.minecraft.client.render.item.ItemRenderer;
 import net.minecraft.client.texture.TextureManager;
-import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityType;
 import net.minecraft.resource.ReloadableResourceManager;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
@@ -32,12 +34,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import java.util.Map;
 
 @Mixin(EntityRenderDispatcher.class)
-public class MixinEntityRenderManager {
+public class MixinEntityRenderDispatcher {
 	@Shadow
-	private Map<Class<? extends Entity>, EntityRenderer<? extends Entity>> renderers;
+	Map<EntityType<?>, EntityRenderer<?>> renderers;
 
-	@Inject(method = "<init>(Lnet/minecraft/client/texture/TextureManager;Lnet/minecraft/client/render/item/ItemRenderer;Lnet/minecraft/resource/ReloadableResourceManager;)V", at = @At("RETURN"), require = 0)
-	public void init(TextureManager textureManager, ItemRenderer itemRenderer, ReloadableResourceManager manager, CallbackInfo info) {
+	@Inject(method = "<init>(Lnet/minecraft/client/texture/TextureManager;Lnet/minecraft/client/render/item/ItemRenderer;Lnet/minecraft/resource/ReloadableResourceManager;Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/client/options/GameOptions;)V", at = @At("RETURN"), require = 0)
+	public void init(TextureManager textureManager, ItemRenderer itemRenderer, ReloadableResourceManager manager, TextRenderer textRenderer, GameOptions gameOptions, CallbackInfo info) {
 		EntityRendererRegistry.INSTANCE.initialize((EntityRenderDispatcher) (Object) this, textureManager, manager, itemRenderer, renderers);
 	}
 }
diff --git a/fabric-renderer-registries-v1/src/main/resources/assets/renderer-registries-v1/icon.png b/fabric-renderer-registries-v1/src/main/resources/assets/renderer-registries-v1/icon.png
new file mode 100644
index 000000000..2931efbf6
Binary files /dev/null and b/fabric-renderer-registries-v1/src/main/resources/assets/renderer-registries-v1/icon.png differ
diff --git a/fabric-renderer-registries-v1/src/main/resources/fabric-renderer-registries-v1.mixins.json b/fabric-renderer-registries-v1/src/main/resources/fabric-renderer-registries-v1.mixins.json
new file mode 100644
index 000000000..1ee8a876d
--- /dev/null
+++ b/fabric-renderer-registries-v1/src/main/resources/fabric-renderer-registries-v1.mixins.json
@@ -0,0 +1,12 @@
+{
+  "required": true,
+  "package": "net.fabricmc.fabric.mixin.client.rendereregistry",
+  "compatibilityLevel": "JAVA_8",
+  "client": [
+    "MixinBlockEntityRenderDispatcher",
+    "MixinEntityRenderDispatcher"
+  ],
+  "injectors": {
+    "defaultRequire": 1
+  }
+}
diff --git a/fabric-renderer-registries-v1/src/main/resources/fabric.mod.json b/fabric-renderer-registries-v1/src/main/resources/fabric.mod.json
new file mode 100644
index 000000000..16a0173c1
--- /dev/null
+++ b/fabric-renderer-registries-v1/src/main/resources/fabric.mod.json
@@ -0,0 +1,27 @@
+{
+  "schemaVersion": 1,
+  "id": "fabric-renderer-registries-v1",
+  "name": "Fabric Renderer Registries (v1)",
+  "version": "${version}",
+  "environment": "client",
+  "license": "Apache-2.0",
+  "icon": "assets/renderer-registries-v1/icon.png",
+  "contact": {
+    "homepage": "https://fabricmc.net",
+    "irc": "irc://irc.esper.net:6667/fabric",
+    "issues": "https://github.com/FabricMC/fabric/issues",
+    "sources": "https://github.com/FabricMC/fabric"
+  },
+  "authors": [
+    "FabricMC"
+  ],
+  "depends": {
+    "fabricloader": ">=0.4.0",
+    "minecraft": ">=1.15-alpha.19.39.a",
+    "fabric-api-base": "*"
+  },
+  "description": "Registries for entity and block renderers.",
+  "mixins": [
+    "fabric-renderer-registries-v1.mixins.json"
+  ]
+}
diff --git a/fabric-rendering-fluids-v1/build.gradle b/fabric-rendering-fluids-v1/build.gradle
index 6c2ef5727..01a60c209 100644
--- a/fabric-rendering-fluids-v1/build.gradle
+++ b/fabric-rendering-fluids-v1/build.gradle
@@ -1,5 +1,5 @@
 archivesBaseName = "fabric-rendering-fluids-v1"
-version = getSubprojectVersion(project, "0.1.2")
+version = getSubprojectVersion(project, "0.1.3")
 
 dependencies {
 	compile project(path: ':fabric-api-base', configuration: 'dev')
diff --git a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/mixin/client/render/fluid/MixinFluidRenderer.java b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/mixin/client/render/fluid/MixinFluidRenderer.java
index 6128c8653..6acb72e0c 100644
--- a/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/mixin/client/render/fluid/MixinFluidRenderer.java
+++ b/fabric-rendering-fluids-v1/src/main/java/net/fabricmc/fabric/mixin/client/render/fluid/MixinFluidRenderer.java
@@ -19,6 +19,7 @@ package net.fabricmc.fabric.mixin.client.render.fluid;
 import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandler;
 import net.fabricmc.fabric.impl.client.render.fluid.FluidRendererHookContainer;
 import net.fabricmc.fabric.impl.client.render.fluid.FluidRenderHandlerRegistryImpl;
+import net.minecraft.class_4588;
 import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.block.FluidRenderer;
 import net.minecraft.client.texture.Sprite;
@@ -49,7 +50,7 @@ public class MixinFluidRenderer {
     }
 
     @Inject(at = @At("HEAD"), method = "tesselate", cancellable = true)
-    public void tesselate(BlockRenderView view, BlockPos pos, BufferBuilder bufferBuilder, FluidState state, CallbackInfoReturnable<Boolean> info) {
+    public void tesselate(BlockRenderView view, BlockPos pos, class_4588 class_4588, FluidState state, CallbackInfoReturnable<Boolean> info) {
         FluidRendererHookContainer ctr = fabric_renderHandler.get();
         FluidRenderHandler handler = FluidRenderHandlerRegistryImpl.INSTANCE.getOverride(state.getFluid());
 
@@ -70,7 +71,7 @@ public class MixinFluidRenderer {
     }
 
     @Inject(at = @At("RETURN"), method = "tesselate")
-    public void tesselateReturn(BlockRenderView view, BlockPos pos, BufferBuilder bufferBuilder, FluidState state, CallbackInfoReturnable<Boolean> info) {
+    public void tesselateReturn(BlockRenderView view, BlockPos pos, class_4588 class_4588, FluidState state, CallbackInfoReturnable<Boolean> info) {
         fabric_renderHandler.get().clear();
     }
 
diff --git a/fabric-rendering-v0/build.gradle b/fabric-rendering-v0/build.gradle
index ec8434714..e82b8afaa 100644
--- a/fabric-rendering-v0/build.gradle
+++ b/fabric-rendering-v0/build.gradle
@@ -1,5 +1,5 @@
 archivesBaseName = "fabric-rendering-v0"
-version = getSubprojectVersion(project, "0.1.2")
+version = getSubprojectVersion(project, "1.0.0")
 
 dependencies {
 	compile project(path: ':fabric-api-base', configuration: 'dev')
diff --git a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/BlockEntityRendererRegistry.java b/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/BlockEntityRendererRegistry.java
deleted file mode 100644
index 463a8a7fa..000000000
--- a/fabric-rendering-v0/src/main/java/net/fabricmc/fabric/api/client/render/BlockEntityRendererRegistry.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2016, 2017, 2018, 2019 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.api.client.render;
-
-import net.minecraft.block.entity.BlockEntity;
-import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
-import net.minecraft.client.render.block.entity.BlockEntityRenderer;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Helper class for registering BlockEntityRenderers.
- */
-public class BlockEntityRendererRegistry {
-	public static final BlockEntityRendererRegistry INSTANCE = new BlockEntityRendererRegistry();
-	private Map<Class<? extends BlockEntity>, BlockEntityRenderer<? extends BlockEntity>> renderers = null;
-	private Map<Class<? extends BlockEntity>, BlockEntityRenderer<? extends BlockEntity>> renderersTmp = new HashMap<>();
-
-	private BlockEntityRendererRegistry() {
-
-	}
-
-	public void initialize(BlockEntityRenderDispatcher instance, Map<Class<? extends BlockEntity>, BlockEntityRenderer<? extends BlockEntity>> map) {
-		if (renderers != null && renderers != map) {
-			throw new RuntimeException("Tried to set renderers twice!");
-		}
-
-		if (renderers == map) {
-			return;
-		}
-
-		renderers = map;
-		for (BlockEntityRenderer renderer : renderersTmp.values()) {
-			renderer.setRenderManager(instance);
-		}
-		renderers.putAll(renderersTmp);
-		renderersTmp = null;
-	}
-
-	public void register(Class<? extends BlockEntity> blockEntityClass, BlockEntityRenderer<? extends BlockEntity> blockEntityRenderer) {
-		// TODO: warn on duplicate
-		if (renderers != null) {
-			renderers.put(blockEntityClass, blockEntityRenderer);
-			blockEntityRenderer.setRenderManager(BlockEntityRenderDispatcher.INSTANCE);
-		} else {
-			renderersTmp.put(blockEntityClass, blockEntityRenderer);
-		}
-	}
-}
diff --git a/fabric-rendering-v0/src/main/resources/fabric-rendering-v0.mixins.json b/fabric-rendering-v0/src/main/resources/fabric-rendering-v0.mixins.json
index bb9995c3f..d4c6f9ca3 100644
--- a/fabric-rendering-v0/src/main/resources/fabric-rendering-v0.mixins.json
+++ b/fabric-rendering-v0/src/main/resources/fabric-rendering-v0.mixins.json
@@ -4,8 +4,6 @@
   "compatibilityLevel": "JAVA_8",
   "client": [
     "MixinBlockColorMap",
-    "MixinBlockEntityRenderManager",
-    "MixinEntityRenderManager",
     "MixinItemColorMap",
     "MixinWorldRenderer"
   ],
diff --git a/fabric-rendering-v0/src/main/resources/fabric.mod.json b/fabric-rendering-v0/src/main/resources/fabric.mod.json
index 59d2d1710..bf1d475f0 100644
--- a/fabric-rendering-v0/src/main/resources/fabric.mod.json
+++ b/fabric-rendering-v0/src/main/resources/fabric.mod.json
@@ -17,6 +17,7 @@
   ],
   "depends": {
     "fabricloader": ">=0.4.0",
+    "minecraft": ">=1.15-alpha.19.39.a",
     "fabric-api-base": "*"
   },
   "description": "Hooks and registries for rendering-related things.",
diff --git a/fabric-textures-v0/build.gradle b/fabric-textures-v0/build.gradle
index 4347b5765..33169d25e 100644
--- a/fabric-textures-v0/build.gradle
+++ b/fabric-textures-v0/build.gradle
@@ -1,5 +1,5 @@
 archivesBaseName = "fabric-textures-v0"
-version = getSubprojectVersion(project, "0.1.4")
+version = getSubprojectVersion(project, "0.1.5")
 
 dependencies {
 	compile project(path: ':fabric-api-base', configuration: 'dev')
diff --git a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinTextureManager.java b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinTextureManager.java
index 86c965ba5..6e458cf4d 100644
--- a/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinTextureManager.java
+++ b/fabric-textures-v0/src/main/java/net/fabricmc/fabric/mixin/client/texture/MixinTextureManager.java
@@ -17,7 +17,7 @@
 package net.fabricmc.fabric.mixin.client.texture;
 
 import net.fabricmc.fabric.impl.client.texture.SpriteAtlasTextureHooks;
-import net.minecraft.client.texture.Texture;
+import net.minecraft.client.texture.AbstractTexture;
 import net.minecraft.client.texture.TextureManager;
 import net.minecraft.util.Identifier;
 import org.spongepowered.asm.mixin.Mixin;
@@ -28,7 +28,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 @Mixin(TextureManager.class)
 public class MixinTextureManager {
 	@Inject(at = @At("RETURN"), method = "registerTexture")
-	private void afterRegisterTexture(Identifier identifier, Texture texture, CallbackInfoReturnable<Boolean> info) {
+	private void afterRegisterTexture(Identifier identifier, AbstractTexture texture, CallbackInfoReturnable<Boolean> info) {
 		if (texture instanceof SpriteAtlasTextureHooks) {
 			((SpriteAtlasTextureHooks) texture).onRegisteredAs(identifier);
 		}
diff --git a/settings.gradle b/settings.gradle
index 017c592f5..176f9ba51 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -33,6 +33,7 @@ include 'fabric-object-builders-v0'
 include 'fabric-registry-sync-v0'
 include 'fabric-renderer-api-v1'
 include 'fabric-renderer-indigo'
+include 'fabric-renderer-registries-v1'
 include 'fabric-rendering-v0'
 include 'fabric-rendering-data-attachment-v1'
 include 'fabric-rendering-fluids-v1'
diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json
index 6683d0dca..0836acaad 100644
--- a/src/main/resources/fabric.mod.json
+++ b/src/main/resources/fabric.mod.json
@@ -17,7 +17,7 @@
   ],
   "depends": {
     "fabricloader": ">=0.6.2",
-    "minecraft": "~1.15-alpha.19.38.b"
+    "minecraft": "~1.15-alpha.19.39.a"
   },
   "description": "Core API module providing key hooks and intercompatibility features."
 }