diff --git a/fabric-api-lookup-api-v1/src/testmod/java/net/fabricmc/fabric/test/lookup/FabricApiLookupTest.java b/fabric-api-lookup-api-v1/src/testmod/java/net/fabricmc/fabric/test/lookup/FabricApiLookupTest.java
index e581d52c4..ef71b835d 100644
--- a/fabric-api-lookup-api-v1/src/testmod/java/net/fabricmc/fabric/test/lookup/FabricApiLookupTest.java
+++ b/fabric-api-lookup-api-v1/src/testmod/java/net/fabricmc/fabric/test/lookup/FabricApiLookupTest.java
@@ -42,17 +42,17 @@ public class FabricApiLookupTest implements ModInitializer {
 	public static final String MOD_ID = "fabric-lookup-api-v1-testmod";
 	// Chute - Block without model that transfers item from the container above to the container below.
 	// It's meant to work with unsided containers: chests, dispensers, droppers and hoppers.
-	public static final ChuteBlock CHUTE_BLOCK = new ChuteBlock(FabricBlockSettings.of(Material.field_44489));
+	public static final ChuteBlock CHUTE_BLOCK = new ChuteBlock(FabricBlockSettings.of(Material.GENERIC));
 	public static final BlockItem CHUTE_ITEM = new BlockItem(CHUTE_BLOCK, new Item.Settings());
 	public static BlockEntityType<ChuteBlockEntity> CHUTE_BLOCK_ENTITY_TYPE;
 	// Cobble gen - Block without model that can generate infinite cobblestone when placed above a chute.
 	// It's meant to test BlockApiLookup#registerSelf.
-	public static final CobbleGenBlock COBBLE_GEN_BLOCK = new CobbleGenBlock(FabricBlockSettings.of(Material.field_44489));
+	public static final CobbleGenBlock COBBLE_GEN_BLOCK = new CobbleGenBlock(FabricBlockSettings.of(Material.GENERIC));
 	public static final BlockItem COBBLE_GEN_ITEM = new BlockItem(COBBLE_GEN_BLOCK, new Item.Settings());
 	public static BlockEntityType<CobbleGenBlockEntity> COBBLE_GEN_BLOCK_ENTITY_TYPE;
 	// Testing for item api lookups is done in the `item` package.
 
-	public static final InspectorBlock INSPECTOR_BLOCK = new InspectorBlock(FabricBlockSettings.of(Material.field_44489));
+	public static final InspectorBlock INSPECTOR_BLOCK = new InspectorBlock(FabricBlockSettings.of(Material.GENERIC));
 	public static final BlockItem INSPECTOR_ITEM = new BlockItem(INSPECTOR_BLOCK, new Item.Settings());
 
 	@Override
diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/SculkSensorFrequencyRegistry.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/SculkSensorFrequencyRegistry.java
index b7ee2fa11..d927d73b2 100644
--- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/SculkSensorFrequencyRegistry.java
+++ b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/SculkSensorFrequencyRegistry.java
@@ -16,12 +16,13 @@
 
 package net.fabricmc.fabric.api.registry;
 
+import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import net.minecraft.class_8514;
 import net.minecraft.registry.tag.GameEventTags;
 import net.minecraft.world.event.GameEvent;
-import net.minecraft.world.event.listener.VibrationListener;
 
 /**
  * Provides a method for registering sculk sensor frequencies.
@@ -51,7 +52,8 @@ public final class SculkSensorFrequencyRegistry {
 			throw new IllegalArgumentException("Attempted to register Sculk Sensor frequency for event "+event.getId()+" with frequency "+frequency+". Sculk Sensor frequencies must be between 1 and 15 inclusive.");
 		}
 
-		int replaced = VibrationListener.FREQUENCIES.put(event, frequency);
+		final Object2IntOpenHashMap<GameEvent> map = (Object2IntOpenHashMap<GameEvent>) class_8514.field_44639;
+		int replaced = map.put(event, frequency);
 
 		if (replaced != 0) {
 			LOGGER.debug("Replaced old frequency mapping for {} - was {}, now {}", event.getId(), replaced, frequency);
diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/VillagerPlantableRegistry.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/VillagerPlantableRegistry.java
deleted file mode 100644
index 8b855e888..000000000
--- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/api/registry/VillagerPlantableRegistry.java
+++ /dev/null
@@ -1,113 +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.registry;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Objects;
-import java.util.Set;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import net.minecraft.block.BlockState;
-import net.minecraft.block.CropBlock;
-import net.minecraft.item.BlockItem;
-import net.minecraft.item.Item;
-import net.minecraft.item.ItemConvertible;
-import net.minecraft.item.Items;
-import net.minecraft.registry.Registries;
-
-/**
- * Registry of items that farmer villagers can plant on farmland.
- */
-public final class VillagerPlantableRegistry {
-	private static final Logger LOGGER = LoggerFactory.getLogger(VillagerPlantableRegistry.class);
-	private static final HashMap<Item, BlockState> PLANTABLES = new HashMap<>();
-	static {
-		register(Items.WHEAT_SEEDS);
-		register(Items.CARROT);
-		register(Items.POTATO);
-		register(Items.BEETROOT_SEEDS);
-	}
-
-	private VillagerPlantableRegistry() {
-	}
-
-	/**
-	 * Registers a BlockItem to be plantable by farmer villagers.
-	 * This will use the default state of the associated block.
-	 * For the crop to be harvestable, the block should extend CropBlock, so the
-	 * farmer can test the {@link CropBlock#isMature(BlockState)} method.
-	 * @param item the BlockItem to register
-	 */
-	public static void register(ItemConvertible item) {
-		Objects.requireNonNull(item.asItem(), "Item cannot be null!");
-
-		if (!(item.asItem() instanceof BlockItem)) {
-			throw new IllegalArgumentException("item is not a BlockItem");
-		}
-
-		register(item, ((BlockItem) item.asItem()).getBlock().getDefaultState());
-	}
-
-	/**
-	 * Register an item with an associated to be plantable by farmer villagers.
-	 * For the crop to be harvestable, the block should extend CropBlock, so the
-	 * farmer can test the {@link CropBlock#isMature(BlockState)} method.
-	 * @param item       the seed item
-	 * @param plantState the state that will be planted
-	 */
-	public static void register(ItemConvertible item, BlockState plantState) {
-		Objects.requireNonNull(item.asItem(), "Item cannot be null!");
-		Objects.requireNonNull(plantState, "Plant block state cannot be null!");
-
-		PLANTABLES.put(item.asItem(), plantState);
-
-		if (!(plantState.getBlock() instanceof CropBlock)) {
-			LOGGER.info("Registered a block ({}) that does not extend CropBlock, this block will not be villager harvestable by default.", Registries.BLOCK.getId(plantState.getBlock()));
-		}
-	}
-
-	/**
-	 * Tests if the item is a registered seed item.
-	 * @param item the item to test
-	 * @return true if the item is registered as a seed
-	 */
-	public static boolean contains(ItemConvertible item) {
-		Objects.requireNonNull(item.asItem(), "Item cannot be null!");
-		return PLANTABLES.containsKey(item.asItem());
-	}
-
-	/**
-	 * Get the state that is associated with the provided seed item.
-	 * @param item the seed item
-	 * @return the state associated with the seed item
-	 */
-	public static BlockState getPlantState(ItemConvertible item) {
-		Objects.requireNonNull(item.asItem(), "Item cannot be null!");
-		return PLANTABLES.get(item.asItem());
-	}
-
-	/**
-	 * Get all currently registered seed items.
-	 * @return all currently registered seed items.
-	 */
-	public static Set<Item> getItems() {
-		return Collections.unmodifiableSet(PLANTABLES.keySet());
-	}
-}
diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/FarmerVillagerTaskMixin.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/FarmerVillagerTaskMixin.java
deleted file mode 100644
index 85f3dbb80..000000000
--- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/FarmerVillagerTaskMixin.java
+++ /dev/null
@@ -1,63 +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.mixin.content.registry;
-
-import org.jetbrains.annotations.Nullable;
-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.ModifyArg;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-
-import net.minecraft.entity.ai.brain.task.FarmerVillagerTask;
-import net.minecraft.entity.passive.VillagerEntity;
-import net.minecraft.inventory.SimpleInventory;
-import net.minecraft.item.ItemStack;
-import net.minecraft.server.world.ServerWorld;
-import net.minecraft.util.math.BlockPos;
-
-import net.fabricmc.fabric.api.registry.VillagerPlantableRegistry;
-
-@Mixin(FarmerVillagerTask.class)
-public class FarmerVillagerTaskMixin {
-	@Nullable
-	@Shadow private BlockPos currentTarget;
-
-	private int fabric_currentInventorySlot = -1;
-
-	@ModifyArg(method = "keepRunning", at = @At(value = "INVOKE", target = "Lnet/minecraft/inventory/SimpleInventory;getStack(I)Lnet/minecraft/item/ItemStack;"), index = 0)
-	private int fabric_storeCurrentSlot(int slot) {
-		return this.fabric_currentInventorySlot = slot;
-	}
-
-	@ModifyVariable(method = "keepRunning", at = @At("LOAD"))
-	private boolean fabric_useRegistryForPlace(boolean current, ServerWorld serverWorld, VillagerEntity villagerEntity, long l) {
-		if (current) {
-			return true;
-		}
-
-		SimpleInventory simpleInventory = villagerEntity.getInventory();
-		ItemStack currentStack = simpleInventory.getStack(this.fabric_currentInventorySlot);
-
-		if (!currentStack.isEmpty() && VillagerPlantableRegistry.contains(currentStack.getItem())) {
-			serverWorld.setBlockState(this.currentTarget, VillagerPlantableRegistry.getPlantState(currentStack.getItem()), 3);
-			return true;
-		}
-
-		return false;
-	}
-}
diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/VibrationListenerMixin.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/VibrationListenerMixin.java
deleted file mode 100644
index a9433dfea..000000000
--- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/VibrationListenerMixin.java
+++ /dev/null
@@ -1,37 +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.mixin.content.registry;
-
-import it.unimi.dsi.fastutil.objects.Object2IntMap;
-import it.unimi.dsi.fastutil.objects.Object2IntMaps;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Redirect;
-
-import net.minecraft.block.SculkSensorBlock;
-import net.minecraft.world.event.listener.VibrationListener;
-
-@Mixin(VibrationListener.class)
-public class VibrationListenerMixin {
-	/**
-	 * Redirects the call to {@linkplain Object2IntMaps#unmodifiable(Object2IntMap)} in initialization of {@linkplain SculkSensorBlock#FREQUENCIES}.
-	 */
-	@Redirect(method = "<clinit>", at = @At(value = "INVOKE", target = "Lit/unimi/dsi/fastutil/objects/Object2IntMaps;unmodifiable(Lit/unimi/dsi/fastutil/objects/Object2IntMap;)Lit/unimi/dsi/fastutil/objects/Object2IntMap;", remap = false))
-	private static <K> Object2IntMap<K> makeFrequenciesMapModifiable(Object2IntMap<? extends K> m) {
-		return (Object2IntMap<K>) m;
-	}
-}
diff --git a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/VillagerEntityMixin.java b/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/VillagerEntityMixin.java
deleted file mode 100644
index eb24c3528..000000000
--- a/fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry/VillagerEntityMixin.java
+++ /dev/null
@@ -1,37 +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.mixin.content.registry;
-
-import java.util.Set;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Redirect;
-
-import net.minecraft.entity.passive.VillagerEntity;
-import net.minecraft.inventory.SimpleInventory;
-import net.minecraft.item.Item;
-
-import net.fabricmc.fabric.api.registry.VillagerPlantableRegistry;
-
-@Mixin(VillagerEntity.class)
-public class VillagerEntityMixin {
-	@Redirect(method = "hasSeedToPlant", at = @At(value = "INVOKE", target = "Lnet/minecraft/inventory/SimpleInventory;containsAny(Ljava/util/Set;)Z"))
-	private boolean fabric_useRegistry(SimpleInventory inventory, Set<Item> items) {
-		return inventory.containsAny(VillagerPlantableRegistry.getItems());
-	}
-}
diff --git a/fabric-content-registries-v0/src/main/resources/fabric-content-registries-v0.mixins.json b/fabric-content-registries-v0/src/main/resources/fabric-content-registries-v0.mixins.json
index f9eaf7dd0..65fc58d41 100644
--- a/fabric-content-registries-v0/src/main/resources/fabric-content-registries-v0.mixins.json
+++ b/fabric-content-registries-v0/src/main/resources/fabric-content-registries-v0.mixins.json
@@ -4,7 +4,6 @@
   "compatibilityLevel": "JAVA_16",
   "mixins": [
     "AxeItemAccessor",
-    "FarmerVillagerTaskMixin",
     "FarmerWorkTaskAccessor",
     "GiveGiftsToHeroTaskAccessor",
     "HoeItemAccessor",
@@ -13,10 +12,8 @@
     "AbstractFurnaceBlockEntityMixin",
     "FireBlockMixin",
     "OxidizableMixin",
-    "VibrationListenerMixin",
     "ShovelItemAccessor",
-    "VillagerEntityAccessor",
-    "VillagerEntityMixin"
+    "VillagerEntityAccessor"
   ],
   "injectors": {
     "defaultRequire": 1
diff --git a/fabric-content-registries-v0/src/testmod/java/net/fabricmc/fabric/test/content/registry/ContentRegistryTest.java b/fabric-content-registries-v0/src/testmod/java/net/fabricmc/fabric/test/content/registry/ContentRegistryTest.java
index 7e2554349..b4864b3e0 100644
--- a/fabric-content-registries-v0/src/testmod/java/net/fabricmc/fabric/test/content/registry/ContentRegistryTest.java
+++ b/fabric-content-registries-v0/src/testmod/java/net/fabricmc/fabric/test/content/registry/ContentRegistryTest.java
@@ -58,7 +58,6 @@ import net.fabricmc.fabric.api.registry.SculkSensorFrequencyRegistry;
 import net.fabricmc.fabric.api.registry.StrippableBlockRegistry;
 import net.fabricmc.fabric.api.registry.TillableBlockRegistry;
 import net.fabricmc.fabric.api.registry.VillagerInteractionRegistries;
-import net.fabricmc.fabric.api.registry.VillagerPlantableRegistry;
 import net.fabricmc.fabric.test.mixin.content.registry.BrewingRecipeRegistryAccessor;
 
 public final class ContentRegistryTest implements ModInitializer {
@@ -137,17 +136,6 @@ public final class ContentRegistryTest implements ModInitializer {
 		VillagerInteractionRegistries.registerCompostable(Items.APPLE);
 
 		VillagerInteractionRegistries.registerCollectable(Items.OAK_SAPLING);
-		VillagerPlantableRegistry.register(Items.OAK_SAPLING);
-
-		// assert that VillagerPlantablesRegistry throws when getting a non-BlockItem
-		try {
-			VillagerPlantableRegistry.register(Items.STICK);
-
-			throw new AssertionError("VillagerPlantablesRegistry didn't throw when item is not BlockItem!");
-		} catch (Exception e) {
-			// expected behavior
-			LOGGER.info("VillagerPlantablesRegistry test passed!");
-		}
 
 		VillagerInteractionRegistries.registerGiftLootTable(VillagerProfession.NITWIT, new Identifier("fake_loot_table"));
 
diff --git a/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricLanguageProvider.java b/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricLanguageProvider.java
index 1eb0011e1..5454389a4 100644
--- a/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricLanguageProvider.java
+++ b/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricLanguageProvider.java
@@ -39,6 +39,8 @@ import net.minecraft.entity.attribute.EntityAttribute;
 import net.minecraft.entity.effect.StatusEffect;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemGroup;
+import net.minecraft.registry.Registries;
+import net.minecraft.registry.RegistryKey;
 import net.minecraft.stat.StatType;
 import net.minecraft.text.TextContent;
 import net.minecraft.text.TranslatableTextContent;
@@ -145,10 +147,11 @@ public abstract class FabricLanguageProvider implements DataProvider {
 		/**
 		 * Adds a translation for an {@link ItemGroup}.
 		 *
-		 * @param group The {@link ItemGroup} to get the translation key from.
+		 * @param registryKey The {@link RegistryKey} to get the translation key from.
 		 * @param value The value of the entry.
 		 */
-		default void add(ItemGroup group, String value) {
+		default void add(RegistryKey<ItemGroup> registryKey, String value) {
+			final ItemGroup group = Registries.ITEM_GROUP.getOrThrow(registryKey);
 			final TextContent content = group.getDisplayName().getContent();
 
 			if (content instanceof TranslatableTextContent translatableTextContent) {
diff --git a/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricLootTableProvider.java b/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricLootTableProvider.java
index 358f33554..cf362cbf2 100644
--- a/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricLootTableProvider.java
+++ b/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricLootTableProvider.java
@@ -30,7 +30,7 @@ import com.google.common.collect.Maps;
 import com.google.gson.JsonObject;
 import org.jetbrains.annotations.ApiStatus;
 
-import net.minecraft.class_8490;
+import net.minecraft.loot.LootDataType;
 import net.minecraft.data.DataOutput;
 import net.minecraft.data.DataProvider;
 import net.minecraft.data.DataWriter;
@@ -87,7 +87,7 @@ public interface FabricLootTableProvider extends Consumer<BiConsumer<Identifier,
 		final List<CompletableFuture<?>> futures = new ArrayList<>();
 
 		for (Map.Entry<Identifier, LootTable> entry : builders.entrySet()) {
-			JsonObject tableJson = (JsonObject) class_8490.LOOT_TABLES.method_51203().toJsonTree(entry.getValue());
+			JsonObject tableJson = (JsonObject) LootDataType.LOOT_TABLES.getGson().toJsonTree(entry.getValue());
 			ConditionJsonProvider.write(tableJson, conditionMap.remove(entry.getKey()));
 
 			futures.add(DataProvider.writeToPath(writer, tableJson, getOutputPath(entry.getKey())));
diff --git a/fabric-data-generation-api-v1/src/main/resources/fabric-data-generation-api-v1.accesswidener b/fabric-data-generation-api-v1/src/main/resources/fabric-data-generation-api-v1.accesswidener
index fca5b7dcf..aade7bb94 100644
--- a/fabric-data-generation-api-v1/src/main/resources/fabric-data-generation-api-v1.accesswidener
+++ b/fabric-data-generation-api-v1/src/main/resources/fabric-data-generation-api-v1.accesswidener
@@ -163,15 +163,12 @@ transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	createUvLockedColumnBlockState	(Lnet/minecraft/block/Block;Lnet/minecraft/data/client/TextureMap;Ljava/util/function/BiConsumer;)Lnet/minecraft/data/client/BlockStateSupplier;
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	createAxisRotatedBlockState	(Lnet/minecraft/block/Block;Lnet/minecraft/util/Identifier;)Lnet/minecraft/data/client/BlockStateSupplier;
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	registerAxisRotated	(Lnet/minecraft/block/Block;Lnet/minecraft/util/Identifier;)V
-transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	registerAxisRotated	(Lnet/minecraft/block/Block;Lnet/minecraft/data/client/TexturedModel$Factory;)V
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	registerNorthDefaultHorizontalRotated	(Lnet/minecraft/block/Block;Lnet/minecraft/data/client/TexturedModel$Factory;)V
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	createAxisRotatedBlockState	(Lnet/minecraft/block/Block;Lnet/minecraft/util/Identifier;Lnet/minecraft/util/Identifier;)Lnet/minecraft/data/client/BlockStateSupplier;
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	registerAxisRotated	(Lnet/minecraft/block/Block;Lnet/minecraft/data/client/TexturedModel$Factory;Lnet/minecraft/data/client/TexturedModel$Factory;)V
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	createSubModel	(Lnet/minecraft/block/Block;Ljava/lang/String;Lnet/minecraft/data/client/Model;Ljava/util/function/Function;)Lnet/minecraft/util/Identifier;
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	createPressurePlateBlockState	(Lnet/minecraft/block/Block;Lnet/minecraft/util/Identifier;Lnet/minecraft/util/Identifier;)Lnet/minecraft/data/client/BlockStateSupplier;
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	createSlabBlockState	(Lnet/minecraft/block/Block;Lnet/minecraft/util/Identifier;Lnet/minecraft/util/Identifier;Lnet/minecraft/util/Identifier;)Lnet/minecraft/data/client/BlockStateSupplier;
-transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	registerSimpleCubeAll	(Lnet/minecraft/block/Block;)V
-transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	registerSingleton	(Lnet/minecraft/block/Block;Lnet/minecraft/data/client/TexturedModel$Factory;)V
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	registerSingleton	(Lnet/minecraft/block/Block;Lnet/minecraft/data/client/TextureMap;Lnet/minecraft/data/client/Model;)V
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	registerCubeAllModelTexturePool	(Lnet/minecraft/block/Block;)Lnet/minecraft/data/client/BlockStateModelGenerator$BlockTexturePool;
 transitive-accessible	method	net/minecraft/data/client/BlockStateModelGenerator	registerDoor	(Lnet/minecraft/block/Block;)V
diff --git a/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestContent.java b/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestContent.java
index 3e3c37db2..11d7dd20d 100644
--- a/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestContent.java
+++ b/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestContent.java
@@ -25,10 +25,12 @@ import net.minecraft.item.Item;
 import net.minecraft.item.ItemGroup;
 import net.minecraft.item.ItemStack;
 import net.minecraft.item.Items;
-import net.minecraft.text.Text;
-import net.minecraft.util.Identifier;
 import net.minecraft.registry.Registries;
 import net.minecraft.registry.Registry;
+import net.minecraft.registry.RegistryKey;
+import net.minecraft.registry.RegistryKeys;
+import net.minecraft.text.Text;
+import net.minecraft.util.Identifier;
 
 import net.fabricmc.api.ModInitializer;
 import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
@@ -43,20 +45,22 @@ public class DataGeneratorTestContent implements ModInitializer {
 	public static Block BLOCK_WITH_VANILLA_LOOT_TABLE;
 	public static Block BLOCK_THAT_DROPS_NOTHING;
 
-	public static final ItemGroup SIMPLE_ITEM_GROUP = FabricItemGroup.builder(new Identifier(MOD_ID, "simple"))
-			.icon(() -> new ItemStack(Items.DIAMOND_PICKAXE))
-			.displayName(Text.translatable("fabric-data-gen-api-v1-testmod.simple_item_group"))
-			.build();
+	public static final RegistryKey<ItemGroup> SIMPLE_ITEM_GROUP = RegistryKey.of(RegistryKeys.ITEM_GROUP, new Identifier(MOD_ID, "simple"));
 
 	@Override
 	public void onInitialize() {
-		SIMPLE_BLOCK = createBlock("simple_block", true, AbstractBlock.Settings.of(Material.STONE));
-		BLOCK_WITHOUT_ITEM = createBlock("block_without_item", false, AbstractBlock.Settings.of(Material.STONE));
-		BLOCK_WITHOUT_LOOT_TABLE = createBlock("block_without_loot_table", false, AbstractBlock.Settings.of(Material.STONE));
-		BLOCK_WITH_VANILLA_LOOT_TABLE = createBlock("block_with_vanilla_loot_table", false, AbstractBlock.Settings.of(Material.STONE).dropsLike(Blocks.STONE));
-		BLOCK_THAT_DROPS_NOTHING = createBlock("block_that_drops_nothing", false, AbstractBlock.Settings.of(Material.STONE).dropsNothing());
+		SIMPLE_BLOCK = createBlock("simple_block", true, AbstractBlock.Settings.of(Material.GENERIC));
+		BLOCK_WITHOUT_ITEM = createBlock("block_without_item", false, AbstractBlock.Settings.of(Material.GENERIC));
+		BLOCK_WITHOUT_LOOT_TABLE = createBlock("block_without_loot_table", false, AbstractBlock.Settings.of(Material.GENERIC));
+		BLOCK_WITH_VANILLA_LOOT_TABLE = createBlock("block_with_vanilla_loot_table", false, AbstractBlock.Settings.of(Material.GENERIC).dropsLike(Blocks.STONE));
+		BLOCK_THAT_DROPS_NOTHING = createBlock("block_that_drops_nothing", false, AbstractBlock.Settings.of(Material.GENERIC).dropsNothing());
 
 		ItemGroupEvents.modifyEntriesEvent(SIMPLE_ITEM_GROUP).register(entries -> entries.add(SIMPLE_BLOCK));
+
+		Registry.register(Registries.ITEM_GROUP, SIMPLE_ITEM_GROUP, FabricItemGroup.builder()
+				.icon(() -> new ItemStack(Items.DIAMOND_PICKAXE))
+				.displayName(Text.translatable("fabric-data-gen-api-v1-testmod.simple_item_group"))
+				.build());
 	}
 
 	private static Block createBlock(String name, boolean hasItem, AbstractBlock.Settings settings) {
diff --git a/fabric-entity-events-v1/src/testmod/java/net/fabricmc/fabric/test/entity/event/EntityEventTests.java b/fabric-entity-events-v1/src/testmod/java/net/fabricmc/fabric/test/entity/event/EntityEventTests.java
index a75fe383e..f12f3bf32 100644
--- a/fabric-entity-events-v1/src/testmod/java/net/fabricmc/fabric/test/entity/event/EntityEventTests.java
+++ b/fabric-entity-events-v1/src/testmod/java/net/fabricmc/fabric/test/entity/event/EntityEventTests.java
@@ -51,7 +51,7 @@ import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents;
 
 public final class EntityEventTests implements ModInitializer {
 	private static final Logger LOGGER = LoggerFactory.getLogger(EntityEventTests.class);
-	public static final Block TEST_BED = new TestBedBlock(AbstractBlock.Settings.of(Material.field_44489).strength(1, 1));
+	public static final Block TEST_BED = new TestBedBlock(AbstractBlock.Settings.of(Material.GENERIC).strength(1, 1));
 	public static final Item DIAMOND_ELYTRA = new DiamondElytraItem();
 
 	@Override
diff --git a/fabric-game-rule-api-v1/src/client/java/net/fabricmc/fabric/impl/gamerule/widget/DoubleRuleWidget.java b/fabric-game-rule-api-v1/src/client/java/net/fabricmc/fabric/impl/gamerule/widget/DoubleRuleWidget.java
index dc22bdbc7..6295beacd 100644
--- a/fabric-game-rule-api-v1/src/client/java/net/fabricmc/fabric/impl/gamerule/widget/DoubleRuleWidget.java
+++ b/fabric-game-rule-api-v1/src/client/java/net/fabricmc/fabric/impl/gamerule/widget/DoubleRuleWidget.java
@@ -19,9 +19,9 @@ package net.fabricmc.fabric.impl.gamerule.widget;
 import java.util.List;
 
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.screen.world.EditGameRulesScreen;
 import net.minecraft.client.gui.widget.TextFieldWidget;
-import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.text.OrderedText;
 import net.minecraft.text.Text;
 
@@ -57,11 +57,11 @@ public final class DoubleRuleWidget extends EditGameRulesScreen.NamedRuleWidget
 	}
 
 	@Override
-	public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
+	public void render(DrawableHelper drawableHelper, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
 		// FIXME: Param names nightmare
-		this.drawName(matrices, y, x);
+		this.drawName(drawableHelper, y, x);
 
 		this.textFieldWidget.setPosition(x + entryWidth - 44, y);
-		this.textFieldWidget.render(matrices, mouseX, mouseY, tickDelta);
+		this.textFieldWidget.render(drawableHelper, mouseX, mouseY, tickDelta);
 	}
 }
diff --git a/fabric-game-rule-api-v1/src/client/java/net/fabricmc/fabric/impl/gamerule/widget/EnumRuleWidget.java b/fabric-game-rule-api-v1/src/client/java/net/fabricmc/fabric/impl/gamerule/widget/EnumRuleWidget.java
index 0a215aed4..0832d55ea 100644
--- a/fabric-game-rule-api-v1/src/client/java/net/fabricmc/fabric/impl/gamerule/widget/EnumRuleWidget.java
+++ b/fabric-game-rule-api-v1/src/client/java/net/fabricmc/fabric/impl/gamerule/widget/EnumRuleWidget.java
@@ -20,10 +20,10 @@ import java.util.List;
 import java.util.Locale;
 
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.screen.world.EditGameRulesScreen;
 import net.minecraft.client.gui.widget.ButtonWidget;
 import net.minecraft.client.resource.language.I18n;
-import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.text.OrderedText;
 import net.minecraft.text.Text;
 
@@ -59,11 +59,12 @@ public final class EnumRuleWidget<E extends Enum<E>> extends EditGameRulesScreen
 		return Text.literal(value.toString());
 	}
 
-	public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
+	@Override
+	public void render(DrawableHelper drawableHelper, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
 		// FIXME: Param names nightmare
-		this.drawName(matrices, y, x);
+		this.drawName(drawableHelper, y, x);
 
 		this.buttonWidget.setPosition(x + entryWidth - 89, y);
-		this.buttonWidget.render(matrices, mouseX, mouseY, tickDelta);
+		this.buttonWidget.render(drawableHelper, mouseX, mouseY, tickDelta);
 	}
 }
diff --git a/fabric-item-api-v1/src/main/java/net/fabricmc/fabric/mixin/item/RecipeMixin.java b/fabric-item-api-v1/src/main/java/net/fabricmc/fabric/mixin/item/RecipeMixin.java
index 95a73b109..b7da96eec 100644
--- a/fabric-item-api-v1/src/main/java/net/fabricmc/fabric/mixin/item/RecipeMixin.java
+++ b/fabric-item-api-v1/src/main/java/net/fabricmc/fabric/mixin/item/RecipeMixin.java
@@ -26,6 +26,7 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
 import net.minecraft.inventory.Inventory;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
 import net.minecraft.recipe.Recipe;
 import net.minecraft.util.collection.DefaultedList;
 
@@ -43,6 +44,11 @@ public interface RecipeMixin<C extends Inventory> {
 		return !RecipeRemainderHandler.REMAINDER_STACK.get().isEmpty();
 	}
 
+	@Redirect(method = "getRemainder", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/Item;getRecipeRemainder()Lnet/minecraft/item/Item;"))
+	private Item replaceGetRecipeRemainder(Item instance) {
+		return Items.AIR;
+	}
+
 	@Redirect(method = "getRemainder", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/collection/DefaultedList;set(ILjava/lang/Object;)Ljava/lang/Object;"))
 	private Object getStackRemainder(DefaultedList<ItemStack> inventory, int index, Object element) {
 		Object remainder = inventory.set(index, RecipeRemainderHandler.REMAINDER_STACK.get());
diff --git a/fabric-item-group-api-v1/src/client/java/net/fabricmc/fabric/impl/client/itemgroup/FabricCreativeGuiComponents.java b/fabric-item-group-api-v1/src/client/java/net/fabricmc/fabric/impl/client/itemgroup/FabricCreativeGuiComponents.java
index 61299b515..9c93f4a67 100644
--- a/fabric-item-group-api-v1/src/client/java/net/fabricmc/fabric/impl/client/itemgroup/FabricCreativeGuiComponents.java
+++ b/fabric-item-group-api-v1/src/client/java/net/fabricmc/fabric/impl/client/itemgroup/FabricCreativeGuiComponents.java
@@ -18,20 +18,23 @@ package net.fabricmc.fabric.impl.client.itemgroup;
 
 import java.util.Set;
 import java.util.function.Consumer;
+import java.util.stream.Collectors;
 
-import com.mojang.blaze3d.systems.RenderSystem;
-
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
 import net.minecraft.client.gui.widget.ButtonWidget;
-import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.item.ItemGroup;
 import net.minecraft.item.ItemGroups;
+import net.minecraft.registry.Registries;
 import net.minecraft.text.Text;
 import net.minecraft.util.Identifier;
 
 public class FabricCreativeGuiComponents {
 	private static final Identifier BUTTON_TEX = new Identifier("fabric", "textures/gui/creative_buttons.png");
-	public static final Set<ItemGroup> COMMON_GROUPS = Set.of(ItemGroups.SEARCH, ItemGroups.INVENTORY, ItemGroups.HOTBAR);
+	public static final Set<ItemGroup> COMMON_GROUPS = Set.of(ItemGroups.SEARCH, ItemGroups.INVENTORY, ItemGroups.HOTBAR).stream()
+			.map(Registries.ITEM_GROUP::getOrThrow)
+			.collect(Collectors.toSet());
 
 	public static class ItemGroupButtonWidget extends ButtonWidget {
 		final CreativeGuiExtensions extensions;
@@ -46,7 +49,7 @@ public class FabricCreativeGuiComponents {
 		}
 
 		@Override
-		public void render(MatrixStack matrixStack, int mouseX, int mouseY, float float_1) {
+		public void render(DrawableHelper drawableHelper, int mouseX, int mouseY, float float_1) {
 			this.hovered = mouseX >= this.getX() && mouseY >= this.getY() && mouseX < this.getX() + this.width && mouseY < this.getY() + this.height;
 			this.visible = extensions.fabric_isButtonVisible(type);
 			this.active = extensions.fabric_isButtonEnabled(type);
@@ -55,13 +58,11 @@ public class FabricCreativeGuiComponents {
 				int u = active && this.isHovered() ? 22 : 0;
 				int v = active ? 0 : 12;
 
-				RenderSystem.setShaderTexture(0, BUTTON_TEX);
-				RenderSystem.setShaderColor(1F, 1F, 1F, 1F);
-				this.drawTexture(matrixStack, this.getX(), this.getY(), u + (type == Type.NEXT ? 11 : 0), v, 11, 12);
+				drawableHelper.drawTexture(BUTTON_TEX, this.getX(), this.getY(), u + (type == Type.NEXT ? 11 : 0), v, 11, 12);
 
 				if (this.hovered) {
 					int pageCount = (int) Math.ceil((ItemGroups.getGroupsToDisplay().size() - COMMON_GROUPS.size()) / 9D);
-					gui.renderTooltip(matrixStack, Text.translatable("fabric.gui.creativeTabPage", extensions.fabric_currentPage() + 1, pageCount), mouseX, mouseY);
+					drawableHelper.method_51438(MinecraftClient.getInstance().textRenderer, Text.translatable("fabric.gui.creativeTabPage", extensions.fabric_currentPage() + 1, pageCount), mouseX, mouseY);
 				}
 			}
 		}
diff --git a/fabric-item-group-api-v1/src/client/java/net/fabricmc/fabric/mixin/itemgroup/client/CreativeInventoryScreenMixin.java b/fabric-item-group-api-v1/src/client/java/net/fabricmc/fabric/mixin/itemgroup/client/CreativeInventoryScreenMixin.java
index f5db710e7..d0826d1dc 100644
--- a/fabric-item-group-api-v1/src/client/java/net/fabricmc/fabric/mixin/itemgroup/client/CreativeInventoryScreenMixin.java
+++ b/fabric-item-group-api-v1/src/client/java/net/fabricmc/fabric/mixin/itemgroup/client/CreativeInventoryScreenMixin.java
@@ -25,9 +25,9 @@ import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen;
 import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen;
-import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.item.ItemGroup;
 import net.minecraft.item.ItemGroups;
@@ -37,7 +37,6 @@ import net.minecraft.text.Text;
 import net.fabricmc.fabric.impl.client.itemgroup.CreativeGuiExtensions;
 import net.fabricmc.fabric.impl.client.itemgroup.FabricCreativeGuiComponents;
 import net.fabricmc.fabric.impl.itemgroup.FabricItemGroup;
-import net.fabricmc.fabric.impl.itemgroup.ItemGroupHelper;
 
 @Mixin(CreativeInventoryScreen.class)
 public abstract class CreativeInventoryScreenMixin<T extends ScreenHandler> extends AbstractInventoryScreen<T> implements CreativeGuiExtensions {
@@ -94,9 +93,13 @@ public abstract class CreativeInventoryScreenMixin<T extends ScreenHandler> exte
 
 	private void fabric_updateSelection() {
 		if (!fabric_isGroupVisible(selectedTab)) {
-			ItemGroupHelper.sortedGroups.stream()
+			ItemGroups.getGroups().stream()
 					.filter(this::fabric_isGroupVisible)
-					.findFirst()
+					.min((a, b) -> {
+						if (a.isSpecial() && !b.isSpecial()) return 1;
+						if (!a.isSpecial() && b.isSpecial()) return -1;
+						return 0;
+					})
 					.ifPresent(this::setSelectedTab);
 		}
 	}
@@ -120,7 +123,7 @@ public abstract class CreativeInventoryScreenMixin<T extends ScreenHandler> exte
 	}
 
 	@Inject(method = "renderTabTooltipIfHovered", at = @At("HEAD"), cancellable = true)
-	private void renderTabTooltipIfHovered(MatrixStack matrixStack, ItemGroup itemGroup, int mx, int my, CallbackInfoReturnable<Boolean> info) {
+	private void renderTabTooltipIfHovered(DrawableHelper drawableHelper, ItemGroup itemGroup, int mx, int my, CallbackInfoReturnable<Boolean> info) {
 		if (!fabric_isGroupVisible(itemGroup)) {
 			info.setReturnValue(false);
 		}
@@ -134,7 +137,7 @@ public abstract class CreativeInventoryScreenMixin<T extends ScreenHandler> exte
 	}
 
 	@Inject(method = "renderTabIcon", at = @At("HEAD"), cancellable = true)
-	private void renderTabIcon(MatrixStack matrixStack, ItemGroup itemGroup, CallbackInfo info) {
+	private void renderTabIcon(DrawableHelper drawableHelper, ItemGroup itemGroup, CallbackInfo info) {
 		if (!fabric_isGroupVisible(itemGroup)) {
 			info.cancel();
 		}
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/FabricItemGroup.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/FabricItemGroup.java
index 2ceba91a6..739a92679 100644
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/FabricItemGroup.java
+++ b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/FabricItemGroup.java
@@ -17,9 +17,8 @@
 package net.fabricmc.fabric.api.itemgroup.v1;
 
 import net.minecraft.item.ItemGroup;
-import net.minecraft.item.ItemGroups;
+import net.minecraft.registry.Registries;
 import net.minecraft.text.Text;
-import net.minecraft.util.Identifier;
 
 import net.fabricmc.fabric.impl.itemgroup.FabricItemGroupBuilderImpl;
 
@@ -34,25 +33,31 @@ public final class FabricItemGroup {
 	 * Creates a new builder for {@link ItemGroup}. Item groups are used to group items in the creative
 	 * inventory.
 	 *
-	 * <p>Each new {@link ItemGroup} instance of this class is automatically appended to {@link ItemGroups#getGroups()} when
-	 * {@link ItemGroup.Builder#build()} is invoked.
+	 * <p>You must register the newly created {@link ItemGroup} to the {@link Registries#ITEM_GROUP} registry.
+	 *
+	 * <p>You must also set a display name by calling {@link ItemGroup.Builder#displayName(Text)}
 	 *
 	 * <p>Example:
 	 *
 	 * <pre>{@code
-	 * private static final ItemGroup ITEM_GROUP = FabricItemGroup.builder(new Identifier(MOD_ID, "test_group"))
-	 *    .icon(() -> new ItemStack(Items.DIAMOND))
-	 *    .entries((enabledFeatures, entries, operatorEnabled) -> {
-	 *       entries.add(TEST_ITEM);
-	 *    })
-	 *    .build();
+	 * private static final RegistryKey<ItemGroup> ITEM_GROUP = RegistryKey.of(RegistryKeys.ITEM_GROUP, new Identifier(MOD_ID, "test_group"));
+	 *
+	 * @Override
+	 * public void onInitialize() {
+	 *    Registry.register(Registries.ITEM_GROUP, ITEM_GROUP, FabricItemGroup.builder()
+	 *       .displayName(Text.translatable("modid.test_group"))
+	 *       .icon(() -> new ItemStack(Items.DIAMOND))
+	 *       .entries((context, entries) -> {
+	 *          entries.add(TEST_ITEM);
+	 *       })
+	 *       .build()
+	 *    );
+	 * }
 	 * }</pre>
 	 *
-	 * @param identifier the id of the ItemGroup, to be used as the default translation key
-	 * @return a new {@link ItemGroup} instance
+	 * @return a new {@link ItemGroup.Builder} instance
 	 */
-	public static ItemGroup.Builder builder(Identifier identifier) {
-		return new FabricItemGroupBuilderImpl(identifier)
-				.displayName(Text.translatable("itemGroup.%s.%s".formatted(identifier.getNamespace(), identifier.getPath())));
+	public static ItemGroup.Builder builder() {
+		return new FabricItemGroupBuilderImpl();
 	}
 }
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/IdentifiableItemGroup.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/IdentifiableItemGroup.java
deleted file mode 100644
index 13aabe23b..000000000
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/IdentifiableItemGroup.java
+++ /dev/null
@@ -1,32 +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.itemgroup.v1;
-
-import net.minecraft.item.ItemGroup;
-import net.minecraft.util.Identifier;
-
-/**
- * This interface is automatically injected to {@link ItemGroup}.
- */
-public interface IdentifiableItemGroup {
-	/**
-	 * {@return the unique identifier of this {@link ItemGroup}}.
-	 */
-	default Identifier getId() {
-		throw new AssertionError("Not implemented");
-	}
-}
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/ItemGroupEvents.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/ItemGroupEvents.java
index 9bebab395..e1a6a1199 100644
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/ItemGroupEvents.java
+++ b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1/ItemGroupEvents.java
@@ -18,7 +18,7 @@ package net.fabricmc.fabric.api.itemgroup.v1;
 
 import net.minecraft.item.ItemGroup;
 import net.minecraft.item.ItemGroups;
-import net.minecraft.util.Identifier;
+import net.minecraft.registry.RegistryKey;
 
 import net.fabricmc.fabric.api.event.Event;
 import net.fabricmc.fabric.api.event.EventFactory;
@@ -26,8 +26,6 @@ import net.fabricmc.fabric.impl.itemgroup.ItemGroupEventsImpl;
 
 /**
  * Holds events related to {@link ItemGroups}.
- *
- * @see FabricItemGroup
  */
 public final class ItemGroupEvents {
 	private ItemGroupEvents() {
@@ -36,8 +34,7 @@ public final class ItemGroupEvents {
 	/**
 	 * This event allows the entries of any item group to be modified.
 	 * <p/>
-	 * If you know beforehand which item group you'd like to modify, use {@link #modifyEntriesEvent(ItemGroup)}
-	 * or {@link #modifyEntriesEvent(Identifier)} instead.
+	 * Use {@link #modifyEntriesEvent(RegistryKey)} to get the event for a specific item group.
 	 * <p/>
 	 * This event is invoked after those two more specific events.
 	 */
@@ -47,23 +44,14 @@ public final class ItemGroupEvents {
 		}
 	});
 
-	/**
-	 * Returns the modify entries event for a specific item group.
-	 * @param itemGroup the item group to modify
-	 * @return the event
-	 */
-	public static Event<ModifyEntries> modifyEntriesEvent(ItemGroup itemGroup) {
-		return modifyEntriesEvent(itemGroup.getId());
-	}
-
 	/**
 	 * Returns the modify entries event for a specific item group. This uses the group ID and
 	 * is suitable for modifying a modded item group that might not exist.
-	 * @param groupId the ID of the item group to modify
+	 * @param registryKey the {@link RegistryKey} of the item group to modify
 	 * @return the event
 	 */
-	public static Event<ModifyEntries> modifyEntriesEvent(Identifier groupId) {
-		return ItemGroupEventsImpl.getOrCreateModifyEntriesEvent(groupId);
+	public static Event<ModifyEntries> modifyEntriesEvent(RegistryKey<ItemGroup> registryKey) {
+		return ItemGroupEventsImpl.getOrCreateModifyEntriesEvent(registryKey);
 	}
 
 	@FunctionalInterface
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricItemGroup.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricItemGroup.java
index 0bda89940..acfb84044 100644
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricItemGroup.java
+++ b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricItemGroup.java
@@ -16,12 +16,8 @@
 
 package net.fabricmc.fabric.impl.itemgroup;
 
-import net.minecraft.util.Identifier;
-
 public interface FabricItemGroup {
 	int getPage();
 
 	void setPage(int page);
-
-	void setId(Identifier identifier);
 }
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricItemGroupBuilderImpl.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricItemGroupBuilderImpl.java
index 86d36bc08..0b9233ced 100644
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricItemGroupBuilderImpl.java
+++ b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/FabricItemGroupBuilderImpl.java
@@ -16,26 +16,29 @@
 
 package net.fabricmc.fabric.impl.itemgroup;
 
-import java.util.Objects;
-
 import net.minecraft.item.ItemGroup;
-import net.minecraft.util.Identifier;
+import net.minecraft.text.Text;
 
 public final class FabricItemGroupBuilderImpl extends ItemGroup.Builder {
-	private final Identifier identifier;
+	private boolean hasDisplayName = false;
 
-	public FabricItemGroupBuilderImpl(Identifier identifier) {
+	public FabricItemGroupBuilderImpl() {
 		// Set when building.
 		super(null, -1);
-		this.identifier = Objects.requireNonNull(identifier);
+	}
+
+	@Override
+	public ItemGroup.Builder displayName(Text displayName) {
+		hasDisplayName = true;
+		return super.displayName(displayName);
 	}
 
 	@Override
 	public ItemGroup build() {
-		final ItemGroup itemGroup = super.build();
-		final FabricItemGroup fabricItemGroup = (FabricItemGroup) itemGroup;
-		fabricItemGroup.setId(identifier);
-		ItemGroupHelper.appendItemGroup(itemGroup);
-		return itemGroup;
+		if (!hasDisplayName) {
+			throw new IllegalStateException("No display name set for ItemGroup");
+		}
+
+		return super.build();
 	}
 }
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/ItemGroupEventsImpl.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/ItemGroupEventsImpl.java
index e4d976d89..bbf1f48d6 100644
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/ItemGroupEventsImpl.java
+++ b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/ItemGroupEventsImpl.java
@@ -21,22 +21,23 @@ import java.util.Map;
 
 import org.jetbrains.annotations.Nullable;
 
-import net.minecraft.util.Identifier;
+import net.minecraft.item.ItemGroup;
+import net.minecraft.registry.RegistryKey;
 
 import net.fabricmc.fabric.api.event.Event;
 import net.fabricmc.fabric.api.event.EventFactory;
 import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
 
 public class ItemGroupEventsImpl {
-	private static final Map<Identifier, Event<ItemGroupEvents.ModifyEntries>> IDENTIFIER_EVENT_MAP = new HashMap<>();
+	private static final Map<RegistryKey<ItemGroup>, Event<ItemGroupEvents.ModifyEntries>> ITEM_GROUP_EVENT_MAP = new HashMap<>();
 
-	public static Event<ItemGroupEvents.ModifyEntries> getOrCreateModifyEntriesEvent(Identifier identifier) {
-		return IDENTIFIER_EVENT_MAP.computeIfAbsent(identifier, (g -> createModifyEvent()));
+	public static Event<ItemGroupEvents.ModifyEntries> getOrCreateModifyEntriesEvent(RegistryKey<ItemGroup> registryKey) {
+		return ITEM_GROUP_EVENT_MAP.computeIfAbsent(registryKey, (g -> createModifyEvent()));
 	}
 
 	@Nullable
-	public static Event<ItemGroupEvents.ModifyEntries> getModifyEntriesEvent(Identifier identifier) {
-		return IDENTIFIER_EVENT_MAP.get(identifier);
+	public static Event<ItemGroupEvents.ModifyEntries> getModifyEntriesEvent(RegistryKey<ItemGroup> registryKey) {
+		return ITEM_GROUP_EVENT_MAP.get(registryKey);
 	}
 
 	private static Event<ItemGroupEvents.ModifyEntries> createModifyEvent() {
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/ItemGroupHelper.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/ItemGroupHelper.java
deleted file mode 100644
index ea2423efc..000000000
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/ItemGroupHelper.java
+++ /dev/null
@@ -1,54 +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.impl.itemgroup;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.minecraft.item.ItemGroup;
-import net.minecraft.item.ItemGroups;
-
-import net.fabricmc.fabric.mixin.itemgroup.ItemGroupsAccessor;
-
-public final class ItemGroupHelper {
-	private ItemGroupHelper() {
-	}
-
-	/**
-	 * A list of item groups, but with special groups grouped at the end.
-	 */
-	public static List<ItemGroup> sortedGroups = ItemGroups.getGroups();
-
-	public static void appendItemGroup(ItemGroup itemGroup) {
-		for (ItemGroup existingGroup : ItemGroups.getGroups()) {
-			if (existingGroup.getId().equals(itemGroup.getId())) {
-				throw new IllegalStateException("Duplicate item group: " + itemGroup.getId());
-			}
-		}
-
-		var itemGroups = new ArrayList<>(ItemGroups.getGroups());
-		itemGroups.add(itemGroup);
-
-		List<ItemGroup> validated = ItemGroupsAccessor.invokeCollect(itemGroups.toArray(ItemGroup[]::new));
-		ItemGroupsAccessor.setGroups(validated);
-		sortedGroups = validated.stream().sorted((a, b) -> {
-			if (a.isSpecial() && !b.isSpecial()) return 1;
-			if (!a.isSpecial() && b.isSpecial()) return -1;
-			return 0;
-		}).toList();
-	}
-}
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/MinecraftItemGroups.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/MinecraftItemGroups.java
deleted file mode 100644
index 8f2213c6e..000000000
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/impl/itemgroup/MinecraftItemGroups.java
+++ /dev/null
@@ -1,62 +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.impl.itemgroup;
-
-import java.util.Map;
-
-import com.google.common.collect.ImmutableMap;
-
-import net.minecraft.item.ItemGroup;
-import net.minecraft.item.ItemGroups;
-import net.minecraft.util.Identifier;
-
-public final class MinecraftItemGroups {
-	public static final Identifier BUILDING_BLOCKS_ID = new Identifier("minecraft:building_blocks");
-	public static final Identifier COLOURED_BLOCKS_ID = new Identifier("minecraft:colored_blocks");
-	public static final Identifier NATURAL_ID = new Identifier("minecraft:natural");
-	public static final Identifier FUNCTIONAL_ID = new Identifier("minecraft:functional");
-	public static final Identifier REDSTONE_ID = new Identifier("minecraft:redstone");
-	public static final Identifier HOTBAR_ID = new Identifier("minecraft:hotbar");
-	public static final Identifier SEARCH_ID = new Identifier("minecraft:search");
-	public static final Identifier TOOLS_ID = new Identifier("minecraft:tools");
-	public static final Identifier COMBAT_ID = new Identifier("minecraft:combat");
-	public static final Identifier FOOD_AND_DRINK_ID = new Identifier("minecraft:food_and_drink");
-	public static final Identifier INGREDIENTS_ID = new Identifier("minecraft:ingredients");
-	public static final Identifier SPAWN_EGGS_ID = new Identifier("minecraft:spawn_eggs");
-	public static final Identifier OP_ID = new Identifier("minecraft:op");
-	public static final Identifier INVENTORY_ID = new Identifier("minecraft:inventory");
-
-	public static final Map<ItemGroup, Identifier> GROUP_ID_MAP = new ImmutableMap.Builder<ItemGroup, Identifier>()
-			.put(ItemGroups.BUILDING_BLOCKS, MinecraftItemGroups.BUILDING_BLOCKS_ID)
-			.put(ItemGroups.COLORED_BLOCKS, MinecraftItemGroups.COLOURED_BLOCKS_ID)
-			.put(ItemGroups.NATURAL, MinecraftItemGroups.NATURAL_ID)
-			.put(ItemGroups.FUNCTIONAL, MinecraftItemGroups.FUNCTIONAL_ID)
-			.put(ItemGroups.REDSTONE, MinecraftItemGroups.REDSTONE_ID)
-			.put(ItemGroups.HOTBAR, MinecraftItemGroups.HOTBAR_ID)
-			.put(ItemGroups.SEARCH, MinecraftItemGroups.SEARCH_ID)
-			.put(ItemGroups.TOOLS, MinecraftItemGroups.TOOLS_ID)
-			.put(ItemGroups.COMBAT, MinecraftItemGroups.COMBAT_ID)
-			.put(ItemGroups.FOOD_AND_DRINK, MinecraftItemGroups.FOOD_AND_DRINK_ID)
-			.put(ItemGroups.INGREDIENTS, MinecraftItemGroups.INGREDIENTS_ID)
-			.put(ItemGroups.SPAWN_EGGS, MinecraftItemGroups.SPAWN_EGGS_ID)
-			.put(ItemGroups.OPERATOR, MinecraftItemGroups.OP_ID)
-			.put(ItemGroups.INVENTORY, MinecraftItemGroups.INVENTORY_ID)
-			.build();
-
-	private MinecraftItemGroups() {
-	}
-}
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/mixin/itemgroup/ItemGroupMixin.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/mixin/itemgroup/ItemGroupMixin.java
index 6c9140a87..0418ac7f4 100644
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/mixin/itemgroup/ItemGroupMixin.java
+++ b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/mixin/itemgroup/ItemGroupMixin.java
@@ -20,9 +20,7 @@ import java.util.Collection;
 import java.util.LinkedList;
 import java.util.Objects;
 import java.util.Set;
-import java.util.UUID;
 
-import org.jetbrains.annotations.Nullable;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.Unique;
@@ -33,18 +31,17 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import net.minecraft.item.ItemGroup;
 import net.minecraft.item.ItemGroups;
 import net.minecraft.item.ItemStack;
-import net.minecraft.util.Identifier;
+import net.minecraft.registry.Registries;
+import net.minecraft.registry.RegistryKey;
 
 import net.fabricmc.fabric.api.event.Event;
 import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroupEntries;
-import net.fabricmc.fabric.api.itemgroup.v1.IdentifiableItemGroup;
 import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
 import net.fabricmc.fabric.impl.itemgroup.FabricItemGroup;
 import net.fabricmc.fabric.impl.itemgroup.ItemGroupEventsImpl;
-import net.fabricmc.fabric.impl.itemgroup.MinecraftItemGroups;
 
 @Mixin(ItemGroup.class)
-abstract class ItemGroupMixin implements IdentifiableItemGroup, FabricItemGroup {
+abstract class ItemGroupMixin implements FabricItemGroup {
 	@Shadow
 	private Collection<ItemStack> displayStacks;
 
@@ -54,22 +51,16 @@ abstract class ItemGroupMixin implements IdentifiableItemGroup, FabricItemGroup
 	@Unique
 	private int fabric_page = -1;
 
-	@Unique
-	private Identifier identifier;
-
-	@Unique
-	@Nullable
-	private UUID fabric_fallbackUUID;
-
 	@SuppressWarnings("ConstantConditions")
 	@Inject(method = "updateEntries", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemGroup;reloadSearchProvider()V"))
 	public void getStacks(ItemGroup.DisplayContext context, CallbackInfo ci) {
-		ItemGroup self = (ItemGroup) (Object) this;
+		final ItemGroup self = (ItemGroup) (Object) this;
+		final RegistryKey<ItemGroup> registryKey = Registries.ITEM_GROUP.getKey(self).orElseThrow(() -> new IllegalStateException("Unregistered item group : " + self));
 
 		// Do not modify special item groups (except Operator Blocks) at all.
 		// Special item groups include Saved Hotbars, Search, and Survival Inventory.
 		// Note, search gets modified as part of the parent item group.
-		if (self.isSpecial() && self != ItemGroups.OPERATOR) return;
+		if (self.isSpecial() && registryKey != ItemGroups.OPERATOR) return;
 
 		// Sanity check for the injection point. It should be after these fields are set.
 		Objects.requireNonNull(displayStacks, "displayStacks");
@@ -80,14 +71,14 @@ abstract class ItemGroupMixin implements IdentifiableItemGroup, FabricItemGroup
 		var mutableSearchTabStacks = new LinkedList<>(searchTabStacks);
 		var entries = new FabricItemGroupEntries(context, mutableDisplayStacks, mutableSearchTabStacks);
 
-		final Event<ItemGroupEvents.ModifyEntries> modifyEntriesEvent = ItemGroupEventsImpl.getModifyEntriesEvent(getId());
+		final Event<ItemGroupEvents.ModifyEntries> modifyEntriesEvent = ItemGroupEventsImpl.getModifyEntriesEvent(registryKey);
 
 		if (modifyEntriesEvent != null) {
 			modifyEntriesEvent.invoker().modifyEntries(entries);
 		}
 
 		// Now trigger the global event
-		if (self != ItemGroups.OPERATOR || context.hasPermissions()) {
+		if (registryKey != ItemGroups.OPERATOR || context.hasPermissions()) {
 			ItemGroupEvents.MODIFY_ENTRIES_ALL.invoker().modifyEntries(self, entries);
 		}
 
@@ -99,26 +90,6 @@ abstract class ItemGroupMixin implements IdentifiableItemGroup, FabricItemGroup
 		searchTabStacks.addAll(mutableSearchTabStacks);
 	}
 
-	@Override
-	public Identifier getId() {
-		if (this.identifier != null) {
-			return identifier;
-		}
-
-		final Identifier vanillaId = MinecraftItemGroups.GROUP_ID_MAP.get((ItemGroup) (Object) this);
-
-		if (vanillaId != null) {
-			return vanillaId;
-		}
-
-		// No id known, generate a random one
-		if (identifier == null) {
-			setId(new Identifier("minecraft", "unidentified_" + UUID.randomUUID()));
-		}
-
-		return identifier;
-	}
-
 	@Override
 	public int getPage() {
 		if (fabric_page < 0) {
@@ -132,13 +103,4 @@ abstract class ItemGroupMixin implements IdentifiableItemGroup, FabricItemGroup
 	public void setPage(int page) {
 		this.fabric_page = page;
 	}
-
-	@Override
-	public void setId(Identifier identifier) {
-		if (this.identifier != null) {
-			throw new IllegalStateException("Cannot set id to (%s) as item group already has id (%s)".formatted(identifier, this.identifier));
-		}
-
-		this.identifier = identifier;
-	}
 }
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/mixin/itemgroup/ItemGroupsAccessor.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/mixin/itemgroup/ItemGroupsAccessor.java
deleted file mode 100644
index 1e4b13f1b..000000000
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/mixin/itemgroup/ItemGroupsAccessor.java
+++ /dev/null
@@ -1,43 +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.mixin.itemgroup;
-
-import java.util.List;
-
-import org.spongepowered.asm.mixin.Final;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Mutable;
-import org.spongepowered.asm.mixin.gen.Accessor;
-import org.spongepowered.asm.mixin.gen.Invoker;
-
-import net.minecraft.item.ItemGroup;
-import net.minecraft.item.ItemGroups;
-
-@Mixin(ItemGroups.class)
-public interface ItemGroupsAccessor {
-	@Accessor("GROUPS")
-	@Final
-	@Mutable
-	static void setGroups(List<ItemGroup> groups) {
-		throw new AssertionError();
-	}
-
-	@Invoker("collect")
-	static List<ItemGroup> invokeCollect(ItemGroup[] groups) {
-		throw new AssertionError();
-	}
-}
diff --git a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/mixin/itemgroup/ItemGroupsMixin.java b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/mixin/itemgroup/ItemGroupsMixin.java
index 88187e46a..3caa9a660 100644
--- a/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/mixin/itemgroup/ItemGroupsMixin.java
+++ b/fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/mixin/itemgroup/ItemGroupsMixin.java
@@ -16,85 +16,53 @@
 
 package net.fabricmc.fabric.mixin.itemgroup;
 
+import static net.minecraft.item.ItemGroups.BUILDING_BLOCKS;
+import static net.minecraft.item.ItemGroups.COLORED_BLOCKS;
+import static net.minecraft.item.ItemGroups.COMBAT;
+import static net.minecraft.item.ItemGroups.FOOD_AND_DRINK;
+import static net.minecraft.item.ItemGroups.FUNCTIONAL;
+import static net.minecraft.item.ItemGroups.HOTBAR;
+import static net.minecraft.item.ItemGroups.INGREDIENTS;
+import static net.minecraft.item.ItemGroups.INVENTORY;
+import static net.minecraft.item.ItemGroups.NATURAL;
+import static net.minecraft.item.ItemGroups.OPERATOR;
+import static net.minecraft.item.ItemGroups.REDSTONE;
+import static net.minecraft.item.ItemGroups.SEARCH;
+import static net.minecraft.item.ItemGroups.SPAWN_EGGS;
+import static net.minecraft.item.ItemGroups.TOOLS;
+
 import java.util.HashMap;
 import java.util.List;
-import java.util.Objects;
 
-import org.spongepowered.asm.mixin.Final;
 import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
 import org.spongepowered.asm.mixin.Unique;
 import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
 import net.minecraft.item.ItemGroup;
 import net.minecraft.item.ItemGroups;
+import net.minecraft.registry.Registries;
+import net.minecraft.registry.RegistryKey;
 
 import net.fabricmc.fabric.impl.itemgroup.FabricItemGroup;
 
 @Mixin(ItemGroups.class)
 public class ItemGroupsMixin {
-	@Shadow
-	@Final
-	private static ItemGroup BUILDING_BLOCKS;
-	@Shadow
-	@Final
-	private static ItemGroup COLORED_BLOCKS;
-	@Shadow
-	@Final
-	private static ItemGroup NATURAL;
-	@Shadow
-	@Final
-	private static ItemGroup FUNCTIONAL;
-	@Shadow
-	@Final
-	private static ItemGroup REDSTONE;
-	@Shadow
-	@Final
-	private static ItemGroup HOTBAR;
-	@Shadow
-	@Final
-	private static ItemGroup SEARCH;
-	@Shadow
-	@Final
-	private static ItemGroup TOOLS;
-	@Shadow
-	@Final
-	private static ItemGroup COMBAT;
-	@Shadow
-	@Final
-	private static ItemGroup FOOD_AND_DRINK;
-	@Shadow
-	@Final
-	private static ItemGroup INGREDIENTS;
-	@Shadow
-	@Final
-	private static ItemGroup SPAWN_EGGS;
-	@Shadow
-	@Final
-	private static ItemGroup OPERATOR;
-	@Shadow
-	@Final
-	private static ItemGroup INVENTORY;
-
 	@Unique
 	private static final int TABS_PER_PAGE = 10;
 
 	@Inject(method = "collect", at = @At("HEAD"), cancellable = true)
-	private static void collect(ItemGroup[] groups, CallbackInfoReturnable<List<ItemGroup>> cir) {
-		final List<ItemGroup> vanillaGroups = List.of(BUILDING_BLOCKS, COLORED_BLOCKS, NATURAL, FUNCTIONAL, REDSTONE, HOTBAR, SEARCH, TOOLS, COMBAT, FOOD_AND_DRINK, INGREDIENTS, SPAWN_EGGS, OPERATOR, INVENTORY);
-
-		for (ItemGroup vanillaGroup : vanillaGroups) {
-			Objects.requireNonNull(vanillaGroup);
-		}
+	private static void collect(CallbackInfo ci) {
+		final List<RegistryKey<ItemGroup>> vanillaGroups = List.of(BUILDING_BLOCKS, COLORED_BLOCKS, NATURAL, FUNCTIONAL, REDSTONE, HOTBAR, SEARCH, TOOLS, COMBAT, FOOD_AND_DRINK, INGREDIENTS, SPAWN_EGGS, OPERATOR, INVENTORY);
 
 		int count = 0;
 
-		for (ItemGroup itemGroup : groups) {
+		for (RegistryKey<ItemGroup> registryKey : Registries.ITEM_GROUP.getKeys()) {
+			final ItemGroup itemGroup = Registries.ITEM_GROUP.getOrThrow(registryKey);
 			final FabricItemGroup fabricItemGroup = (FabricItemGroup) itemGroup;
 
-			if (vanillaGroups.contains(itemGroup)) {
+			if (vanillaGroups.contains(registryKey)) {
 				// Vanilla group goes on the first page.
 				fabricItemGroup.setPage(0);
 				continue;
@@ -114,7 +82,8 @@ public class ItemGroupsMixin {
 		record ItemGroupPosition(ItemGroup.Row row, int column, int page) { }
 		var map = new HashMap<ItemGroupPosition, String>();
 
-		for (ItemGroup itemGroup : groups) {
+		for (RegistryKey<ItemGroup> registryKey : Registries.ITEM_GROUP.getKeys()) {
+			final ItemGroup itemGroup = Registries.ITEM_GROUP.getOrThrow(registryKey);
 			final FabricItemGroup fabricItemGroup = (FabricItemGroup) itemGroup;
 			final String displayName = itemGroup.getDisplayName().getString();
 			final var position = new ItemGroupPosition(itemGroup.getRow(), itemGroup.getColumn(), fabricItemGroup.getPage());
@@ -125,6 +94,6 @@ public class ItemGroupsMixin {
 			}
 		}
 
-		cir.setReturnValue(List.of(groups));
+		ci.cancel();
 	}
 }
diff --git a/fabric-item-group-api-v1/src/main/resources/fabric-item-group-api-v1.accesswidener b/fabric-item-group-api-v1/src/main/resources/fabric-item-group-api-v1.accesswidener
index b99ebd956..37fb42263 100644
--- a/fabric-item-group-api-v1/src/main/resources/fabric-item-group-api-v1.accesswidener
+++ b/fabric-item-group-api-v1/src/main/resources/fabric-item-group-api-v1.accesswidener
@@ -1,19 +1,19 @@
 accessWidener v2 named
 
-transitive-accessible field net/minecraft/item/ItemGroups BUILDING_BLOCKS Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups COLORED_BLOCKS Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups NATURAL Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups FUNCTIONAL Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups REDSTONE Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups HOTBAR Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups SEARCH Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups TOOLS Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups COMBAT Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups FOOD_AND_DRINK Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups INGREDIENTS Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups SPAWN_EGGS Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups OPERATOR Lnet/minecraft/item/ItemGroup;
-transitive-accessible field net/minecraft/item/ItemGroups INVENTORY Lnet/minecraft/item/ItemGroup;
+transitive-accessible field net/minecraft/item/ItemGroups BUILDING_BLOCKS Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups COLORED_BLOCKS Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups NATURAL Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups FUNCTIONAL Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups REDSTONE Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups HOTBAR Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups SEARCH Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups TOOLS Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups COMBAT Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups FOOD_AND_DRINK Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups INGREDIENTS Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups SPAWN_EGGS Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups OPERATOR Lnet/minecraft/registry/RegistryKey;
+transitive-accessible field net/minecraft/item/ItemGroups INVENTORY Lnet/minecraft/registry/RegistryKey;
 accessible field net/minecraft/item/ItemGroups displayContext Lnet/minecraft/item/ItemGroup$DisplayContext;
 transitive-accessible class net/minecraft/item/ItemGroup$StackVisibility
 
diff --git a/fabric-item-group-api-v1/src/main/resources/fabric-item-group-api-v1.mixins.json b/fabric-item-group-api-v1/src/main/resources/fabric-item-group-api-v1.mixins.json
index d366eeb13..7f0ffba3c 100644
--- a/fabric-item-group-api-v1/src/main/resources/fabric-item-group-api-v1.mixins.json
+++ b/fabric-item-group-api-v1/src/main/resources/fabric-item-group-api-v1.mixins.json
@@ -4,7 +4,6 @@
   "compatibilityLevel": "JAVA_17",
   "mixins": [
     "ItemGroupAccessor",
-    "ItemGroupsAccessor",
     "ItemGroupMixin",
     "ItemGroupsMixin"
   ],
diff --git a/fabric-item-group-api-v1/src/main/resources/fabric.mod.json b/fabric-item-group-api-v1/src/main/resources/fabric.mod.json
index dbcba828d..429c8b58c 100644
--- a/fabric-item-group-api-v1/src/main/resources/fabric.mod.json
+++ b/fabric-item-group-api-v1/src/main/resources/fabric.mod.json
@@ -30,9 +30,6 @@
   ],
   "accessWidener": "fabric-item-group-api-v1.accesswidener",
   "custom": {
-    "fabric-api:module-lifecycle": "stable",
-    "loom:injected_interfaces": {
-      "net/minecraft/class_1761": ["net/fabricmc/fabric/api/itemgroup/v1/IdentifiableItemGroup"]
-    }
+    "fabric-api:module-lifecycle": "stable"
   }
 }
diff --git a/fabric-item-group-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/group/ItemGroupTest.java b/fabric-item-group-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/group/ItemGroupTest.java
index 298814709..338bf03d2 100644
--- a/fabric-item-group-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/group/ItemGroupTest.java
+++ b/fabric-item-group-api-v1/src/testmod/java/net/fabricmc/fabric/test/item/group/ItemGroupTest.java
@@ -16,8 +16,6 @@
 
 package net.fabricmc.fabric.test.item.group;
 
-import java.util.Objects;
-
 import com.google.common.base.Supplier;
 
 import net.minecraft.block.Blocks;
@@ -28,6 +26,8 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.item.Items;
 import net.minecraft.registry.Registries;
 import net.minecraft.registry.Registry;
+import net.minecraft.registry.RegistryKey;
+import net.minecraft.registry.RegistryKeys;
 import net.minecraft.text.Text;
 import net.minecraft.util.Identifier;
 
@@ -39,22 +39,23 @@ public class ItemGroupTest implements ModInitializer {
 	private static final String MOD_ID = "fabric-item-group-api-v1-testmod";
 	private static Item TEST_ITEM;
 
-	//Adds an item group with all items in it
-	private static final ItemGroup ITEM_GROUP = FabricItemGroup.builder(new Identifier(MOD_ID, "test_group"))
-			.displayName(Text.literal("Test Item Group"))
-			.icon(() -> new ItemStack(Items.DIAMOND))
-			.entries((context, entries) -> {
-				entries.addAll(Registries.ITEM.stream()
-						.map(ItemStack::new)
-						.filter(input -> !input.isEmpty())
-						.toList());
-			})
-			.build();
+	private static final RegistryKey<ItemGroup> ITEM_GROUP = RegistryKey.of(RegistryKeys.ITEM_GROUP, new Identifier(MOD_ID, "test_group"));
 
 	@Override
 	public void onInitialize() {
 		TEST_ITEM = Registry.register(Registries.ITEM, new Identifier("fabric-item-groups-v0-testmod", "item_test_group"), new Item(new Item.Settings()));
 
+		Registry.register(Registries.ITEM_GROUP, ITEM_GROUP, FabricItemGroup.builder()
+				.displayName(Text.literal("Test Item Group"))
+				.icon(() -> new ItemStack(Items.DIAMOND))
+				.entries((context, entries) -> {
+					entries.addAll(Registries.ITEM.stream()
+							.map(ItemStack::new)
+							.filter(input -> !input.isEmpty())
+							.toList());
+				})
+				.build());
+
 		ItemGroupEvents.modifyEntriesEvent(ItemGroups.BUILDING_BLOCKS).register((content) -> {
 			content.add(TEST_ITEM);
 
@@ -79,7 +80,8 @@ public class ItemGroupTest implements ModInitializer {
 
 		for (int i = 0; i < 100; i++) {
 			final int index = i;
-			FabricItemGroup.builder(new Identifier(MOD_ID, "test_group_" + i))
+
+			Registry.register(Registries.ITEM_GROUP, new Identifier(MOD_ID, "test_group_" + i), FabricItemGroup.builder()
 					.displayName(Text.literal("Test Item Group: " + i))
 					.icon((Supplier<ItemStack>) () -> new ItemStack(Registries.BLOCK.get(index)))
 					.entries((context, entries) -> {
@@ -89,10 +91,15 @@ public class ItemGroupTest implements ModInitializer {
 							entries.add(itemStack);
 						}
 					})
-					.build();
+					.build());
 		}
 
-		assert Objects.equals(ItemGroups.HOTBAR.getId().toString(), "minecraft:hotbar");
-		assert Objects.equals(ITEM_GROUP.getId().toString(), "fabric-item-group-api-v1-testmod:test_group");
+		try {
+			// Test to make sure that item groups must have a display name.
+			FabricItemGroup.builder().build();
+			throw new AssertionError();
+		} catch (IllegalStateException ignored) {
+			// Ignored
+		}
 	}
 }
diff --git a/fabric-loot-api-v2/src/main/java/net/fabricmc/fabric/mixin/loot/LootManagerMixin.java b/fabric-loot-api-v2/src/main/java/net/fabricmc/fabric/mixin/loot/LootManagerMixin.java
index 0796e09b1..aa684722b 100644
--- a/fabric-loot-api-v2/src/main/java/net/fabricmc/fabric/mixin/loot/LootManagerMixin.java
+++ b/fabric-loot-api-v2/src/main/java/net/fabricmc/fabric/mixin/loot/LootManagerMixin.java
@@ -28,7 +28,7 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 
-import net.minecraft.class_8488;
+import net.minecraft.loot.LootDataKey;
 import net.minecraft.loot.LootManager;
 import net.minecraft.loot.LootTable;
 import net.minecraft.resource.ResourceManager;
@@ -46,7 +46,7 @@ import net.fabricmc.fabric.impl.loot.LootUtil;
 @Mixin(LootManager.class)
 abstract class LootManagerMixin {
 	@Shadow
-	private Map<class_8488<?>, ?> field_44492;
+	private Map<LootDataKey<?>, ?> keyToValue;
 
 	@Inject(method = "reload", at = @At("RETURN"), cancellable = true)
 	private void reload(ResourceReloader.Synchronizer synchronizer, ResourceManager manager, Profiler prepareProfiler, Profiler applyProfiler, Executor prepareExecutor, Executor applyExecutor, CallbackInfoReturnable<CompletableFuture<Void>> cir) {
@@ -59,25 +59,25 @@ abstract class LootManagerMixin {
 	private void applyLootTableEvents(ResourceManager resourceManager, LootManager lootManager) {
 		// The builder for the new LootManager.tables map with modified loot tables.
 		// We're using an immutable map to match vanilla.
-		ImmutableMap.Builder<class_8488<?>, Object> newTables = ImmutableMap.builder();
+		ImmutableMap.Builder<LootDataKey<?>, Object> newTables = ImmutableMap.builder();
 
-		this.field_44492.forEach((id, entry) -> {
-			if (id == LootManager.field_44491) {
+		this.keyToValue.forEach((dataKey, entry) -> {
+			if (dataKey == LootManager.EMPTY_LOOT_TABLE) {
 				// This is a special table and cannot be modified.
 				// Vanilla also warns about that.
-				newTables.put(id, entry);
+				newTables.put(dataKey, entry);
 				return;
 			}
 
 			if (!(entry instanceof LootTable table)) {
 				// We only want to modify loot tables
-				newTables.put(id, entry);
+				newTables.put(dataKey, entry);
 				return;
 			}
 
-			LootTableSource source = LootUtil.determineSource(id.location(), resourceManager);
+			LootTableSource source = LootUtil.determineSource(dataKey.id(), resourceManager);
 			// Invoke the REPLACE event for the current loot table.
-			LootTable replacement = LootTableEvents.REPLACE.invoker().replaceLootTable(resourceManager, lootManager, id.location(), table, source);
+			LootTable replacement = LootTableEvents.REPLACE.invoker().replaceLootTable(resourceManager, lootManager, dataKey.id(), table, source);
 
 			if (replacement != null) {
 				// Set the loot table to MODIFY to be the replacement loot table.
@@ -88,12 +88,12 @@ abstract class LootManagerMixin {
 
 			// Turn the current table into a modifiable builder and invoke the MODIFY event.
 			LootTable.Builder builder = FabricLootTableBuilder.copyOf(table);
-			LootTableEvents.MODIFY.invoker().modifyLootTable(resourceManager, lootManager, id.location(), builder, source);
+			LootTableEvents.MODIFY.invoker().modifyLootTable(resourceManager, lootManager, dataKey.id(), builder, source);
 
 			// Turn the builder back into a loot table and store it in the new table.
-			newTables.put(id, builder.build());
+			newTables.put(dataKey, builder.build());
 		});
 
-		this.field_44492 = newTables.build();
+		this.keyToValue = newTables.build();
 	}
 }
diff --git a/fabric-mining-level-api-v1/src/testmod/java/net/fabricmc/fabric/test/mininglevel/MiningLevelTest.java b/fabric-mining-level-api-v1/src/testmod/java/net/fabricmc/fabric/test/mininglevel/MiningLevelTest.java
index d7f5677b3..472dff571 100644
--- a/fabric-mining-level-api-v1/src/testmod/java/net/fabricmc/fabric/test/mininglevel/MiningLevelTest.java
+++ b/fabric-mining-level-api-v1/src/testmod/java/net/fabricmc/fabric/test/mininglevel/MiningLevelTest.java
@@ -47,21 +47,21 @@ public final class MiningLevelTest implements ModInitializer {
 
 	/// Tagged blocks
 	// sword + dynamic mining level tag
-	public static final Block NEEDS_NETHERITE_SWORD = new Block(AbstractBlock.Settings.of(Material.STONE).strength(2, 3).requiresTool());
+	public static final Block NEEDS_NETHERITE_SWORD = new Block(AbstractBlock.Settings.of(Material.GENERIC).strength(2, 3).requiresTool());
 	// sword + vanilla mining level tag
-	public static final Block NEEDS_STONE_SWORD = new Block(AbstractBlock.Settings.of(Material.STONE).strength(2, 3).requiresTool());
+	public static final Block NEEDS_STONE_SWORD = new Block(AbstractBlock.Settings.of(Material.GENERIC).strength(2, 3).requiresTool());
 	// any sword
-	public static final Block NEEDS_ANY_SWORD = new Block(AbstractBlock.Settings.of(Material.STONE).strength(2, 3).requiresTool());
+	public static final Block NEEDS_ANY_SWORD = new Block(AbstractBlock.Settings.of(Material.GENERIC).strength(2, 3).requiresTool());
 	// shears
-	public static final Block NEEDS_SHEARS = new Block(AbstractBlock.Settings.of(Material.STONE).strength(2, 3).requiresTool());
+	public static final Block NEEDS_SHEARS = new Block(AbstractBlock.Settings.of(Material.GENERIC).strength(2, 3).requiresTool());
 	// vanilla mineable tag + dynamic mining level tag
-	public static final Block NEEDS_NETHERITE_PICKAXE = new Block(AbstractBlock.Settings.of(Material.STONE).strength(2, 3).requiresTool());
+	public static final Block NEEDS_NETHERITE_PICKAXE = new Block(AbstractBlock.Settings.of(Material.GENERIC).strength(2, 3).requiresTool());
 	// vanilla mineable tag, requires tool (this type of block doesn't exist in vanilla)
-	public static final Block NEEDS_AXE = new Block(AbstractBlock.Settings.of(Material.STONE).strength(2, 3).requiresTool());
+	public static final Block NEEDS_AXE = new Block(AbstractBlock.Settings.of(Material.GENERIC).strength(2, 3).requiresTool());
 	// vanilla mineable tag, requires tool (this type of block doesn't exist in vanilla)
-	public static final Block NEEDS_HOE = new Block(AbstractBlock.Settings.of(Material.STONE).strength(2, 3).requiresTool());
+	public static final Block NEEDS_HOE = new Block(AbstractBlock.Settings.of(Material.GENERIC).strength(2, 3).requiresTool());
 	// vanilla mineable tag, requires tool (this type of block doesn't exist in vanilla)
-	public static final Block NEEDS_SHOVEL = new Block(AbstractBlock.Settings.of(Material.STONE).strength(2, 3).requiresTool());
+	public static final Block NEEDS_SHOVEL = new Block(AbstractBlock.Settings.of(Material.GENERIC).strength(2, 3).requiresTool());
 
 	@Override
 	public void onInitialize() {
diff --git a/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelList.java b/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelList.java
index 838a7308c..1a5cca6cd 100644
--- a/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelList.java
+++ b/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelList.java
@@ -17,9 +17,9 @@
 package net.fabricmc.fabric.test.networking.channeltest;
 
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
 import net.minecraft.client.gui.widget.EntryListWidget;
-import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.text.Text;
 import net.minecraft.util.Formatting;
 import net.minecraft.util.Identifier;
@@ -51,8 +51,8 @@ final class ChannelList extends EntryListWidget<ChannelList.Entry> {
 		}
 
 		@Override
-		public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
-			ChannelList.this.client.textRenderer.draw(matrices, Text.literal(this.channel.toString()), x, y, Formatting.WHITE.getColorValue());
+		public void render(DrawableHelper drawableHelper, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
+			drawableHelper.method_51438(ChannelList.this.client.textRenderer, Text.literal(this.channel.toString()).formatted(Formatting.WHITE), x, y);
 		}
 	}
 }
diff --git a/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelScreen.java b/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelScreen.java
index a82741b84..1627a9b63 100644
--- a/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelScreen.java
+++ b/fabric-networking-api-v1/src/testmod/java/net/fabricmc/fabric/test/networking/channeltest/ChannelScreen.java
@@ -16,10 +16,10 @@
 
 package net.fabricmc.fabric.test.networking.channeltest;
 
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.tooltip.Tooltip;
 import net.minecraft.client.gui.widget.ButtonWidget;
-import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.text.Text;
 import net.minecraft.util.Formatting;
 import net.minecraft.util.Identifier;
@@ -58,22 +58,20 @@ final class ChannelScreen extends Screen {
 	}
 
 	@Override
-	public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
-		this.renderBackgroundTexture(matrices);
-		this.channelList.render(matrices, mouseX, mouseY, delta);
-		super.render(matrices, mouseX, mouseY, delta);
+	public void render(DrawableHelper drawableHelper, int mouseX, int mouseY, float delta) {
+		this.renderBackgroundTexture(drawableHelper);
+		this.channelList.render(drawableHelper, mouseX, mouseY, delta);
+		super.render(drawableHelper, mouseX, mouseY, delta);
 
 		if (this.s2cButton.active && this.c2sButton.active) {
-			final Text clickMe = Text.literal("Click S2C or C2S to view supported channels");
+			final Text clickMe = Text.literal("Click S2C or C2S to view supported channels").formatted(Formatting.YELLOW);
 
 			final int textWidth = this.textRenderer.getWidth(clickMe);
-			//noinspection ConstantConditions
-			this.textRenderer.draw(
-					matrices,
+			drawableHelper.method_51438(
+					this.textRenderer,
 					clickMe,
-					this.width / 2.0F - (textWidth / 2.0F),
-					60,
-					Formatting.YELLOW.getColorValue()
+					(int) (this.width / 2.0F - (textWidth / 2.0F)),
+					60
 			);
 		}
 	}
diff --git a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/api/object/builder/v1/block/FabricMaterialBuilder.java b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/api/object/builder/v1/block/FabricMaterialBuilder.java
deleted file mode 100644
index 5b969b8f4..000000000
--- a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/api/object/builder/v1/block/FabricMaterialBuilder.java
+++ /dev/null
@@ -1,56 +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.object.builder.v1.block;
-
-import net.minecraft.block.MapColor;
-import net.minecraft.block.Material;
-import net.minecraft.util.DyeColor;
-
-import net.fabricmc.fabric.mixin.object.builder.MaterialBuilderAccessor;
-
-public class FabricMaterialBuilder extends Material.Builder {
-	public FabricMaterialBuilder(MapColor color) {
-		super(color);
-	}
-
-	public FabricMaterialBuilder(DyeColor color) {
-		this(color.getMapColor());
-	}
-
-	public FabricMaterialBuilder lightPassesThrough() {
-		((MaterialBuilderAccessor) this).invokeLightPassesThrough();
-		return this;
-	}
-
-	@Override
-	public FabricMaterialBuilder allowsMovement() {
-		super.allowsMovement();
-		return this;
-	}
-
-	@Override
-	public FabricMaterialBuilder notSolid() {
-		super.notSolid();
-		return this;
-	}
-
-	@Override
-	public FabricMaterialBuilder replaceable() {
-		super.replaceable();
-		return this;
-	}
-}
diff --git a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/MaterialBuilderAccessor.java b/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/MaterialBuilderAccessor.java
deleted file mode 100644
index 1fac90c2a..000000000
--- a/fabric-object-builder-api-v1/src/main/java/net/fabricmc/fabric/mixin/object/builder/MaterialBuilderAccessor.java
+++ /dev/null
@@ -1,28 +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.mixin.object.builder;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Invoker;
-
-import net.minecraft.block.Material;
-
-@Mixin(Material.Builder.class)
-public interface MaterialBuilderAccessor {
-	@Invoker
-	Material.Builder invokeLightPassesThrough();
-}
diff --git a/fabric-object-builder-api-v1/src/main/resources/fabric-object-builder-v1.mixins.json b/fabric-object-builder-api-v1/src/main/resources/fabric-object-builder-v1.mixins.json
index 597c657ef..1f92b1196 100644
--- a/fabric-object-builder-api-v1/src/main/resources/fabric-object-builder-v1.mixins.json
+++ b/fabric-object-builder-api-v1/src/main/resources/fabric-object-builder-v1.mixins.json
@@ -9,7 +9,6 @@
     "DefaultAttributeRegistryAccessor",
     "DefaultAttributeRegistryMixin",
     "DetectorRailBlockMixin",
-    "MaterialBuilderAccessor",
     "TradeOffersTypeAwareBuyForOneEmeraldFactoryMixin"
   ],
   "injectors": {
diff --git a/fabric-registry-sync-v0/src/client/java/net/fabricmc/fabric/mixin/registry/sync/client/MinecraftClientMixin.java b/fabric-registry-sync-v0/src/client/java/net/fabricmc/fabric/mixin/registry/sync/client/MinecraftClientMixin.java
index b3a621f6c..5d3de75d2 100644
--- a/fabric-registry-sync-v0/src/client/java/net/fabricmc/fabric/mixin/registry/sync/client/MinecraftClientMixin.java
+++ b/fabric-registry-sync-v0/src/client/java/net/fabricmc/fabric/mixin/registry/sync/client/MinecraftClientMixin.java
@@ -26,6 +26,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.item.ItemGroups;
 import net.minecraft.registry.Registries;
 
 import net.fabricmc.fabric.impl.registry.sync.RegistrySyncManager;
@@ -53,5 +54,6 @@ public class MinecraftClientMixin {
 		FABRIC_LOGGER.debug("Freezing registries");
 		Registries.bootstrap();
 		BlockInitTracker.postFreeze();
+		ItemGroups.collect();
 	}
 }
diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MinecraftServerMixin.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MinecraftServerMixin.java
index f7c9604bb..f48f9e5a2 100644
--- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MinecraftServerMixin.java
+++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MinecraftServerMixin.java
@@ -24,8 +24,9 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
-import net.minecraft.server.MinecraftServer;
+import net.minecraft.item.ItemGroups;
 import net.minecraft.registry.Registries;
+import net.minecraft.server.MinecraftServer;
 
 import net.fabricmc.api.EnvType;
 import net.fabricmc.fabric.impl.registry.sync.trackers.vanilla.BlockInitTracker;
@@ -44,6 +45,7 @@ public class MinecraftServerMixin {
 
 			Registries.bootstrap();
 			BlockInitTracker.postFreeze();
+			ItemGroups.collect();
 		}
 	}
 }
diff --git a/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java b/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java
index ce61d08da..b0f13861a 100644
--- a/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java
+++ b/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java
@@ -132,7 +132,7 @@ public class RegistrySyncTest implements ModInitializer {
 
 	private static void registerBlocks(String namespace, int amount, int startingId) {
 		for (int i = 0; i < amount; i++) {
-			Block block = new Block(AbstractBlock.Settings.of(Material.STONE));
+			Block block = new Block(AbstractBlock.Settings.of(Material.GENERIC));
 			Registry.register(Registries.BLOCK, new Identifier(namespace, "block_" + (i + startingId)), block);
 
 			if (REGISTER_ITEMS) {
diff --git a/fabric-renderer-api-v1/src/testmod/java/net/fabricmc/fabric/test/renderer/simple/RendererTest.java b/fabric-renderer-api-v1/src/testmod/java/net/fabricmc/fabric/test/renderer/simple/RendererTest.java
index c772022a9..13a2e7aa5 100644
--- a/fabric-renderer-api-v1/src/testmod/java/net/fabricmc/fabric/test/renderer/simple/RendererTest.java
+++ b/fabric-renderer-api-v1/src/testmod/java/net/fabricmc/fabric/test/renderer/simple/RendererTest.java
@@ -45,7 +45,7 @@ public final class RendererTest implements ModInitializer {
 	public static final BlockEntityType<FrameBlockEntity> FRAME_BLOCK_ENTITY = FabricBlockEntityTypeBuilder.create(FrameBlockEntity::new, FRAMES).build(null);
 
 	public static final Identifier PILLAR_ID = id("pillar");
-	public static final Block PILLAR = new Block(FabricBlockSettings.of(Material.STONE));
+	public static final Block PILLAR = new Block(FabricBlockSettings.of(Material.GENERIC));
 
 	@Override
 	public void onInitialize() {
diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/HudRenderCallback.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/HudRenderCallback.java
index 2770c6c44..743fec173 100644
--- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/HudRenderCallback.java
+++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/HudRenderCallback.java
@@ -16,7 +16,7 @@
 
 package net.fabricmc.fabric.api.client.rendering.v1;
 
-import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.client.gui.DrawableHelper;
 
 import net.fabricmc.fabric.api.event.Event;
 import net.fabricmc.fabric.api.event.EventFactory;
@@ -31,8 +31,8 @@ public interface HudRenderCallback {
 	/**
 	 * Called after rendering the whole hud, which is displayed in game, in a world.
 	 *
-	 * @param matrixStack the matrixStack
+	 * @param drawableHelper the {@link DrawableHelper} instance
 	 * @param tickDelta Progress for linearly interpolating between the previous and current game state
 	 */
-	void onHudRender(MatrixStack matrixStack, float tickDelta);
+	void onHudRender(DrawableHelper drawableHelper, float tickDelta);
 }
diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/ScreenMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/DrawableHelperMixin.java
similarity index 89%
rename from fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/ScreenMixin.java
rename to fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/DrawableHelperMixin.java
index 3666df150..90fbf0a2e 100644
--- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/ScreenMixin.java
+++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/DrawableHelperMixin.java
@@ -23,16 +23,16 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
-import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.tooltip.TooltipComponent;
 import net.minecraft.client.item.TooltipData;
 
 import net.fabricmc.fabric.api.client.rendering.v1.TooltipComponentCallback;
 
-@Mixin(Screen.class)
-public class ScreenMixin {
+@Mixin(DrawableHelper.class)
+public class DrawableHelperMixin {
 	// Synthetic lambda body in renderTooltip
-	@Inject(at = @At("HEAD"), method = "method_32635(Ljava/util/List;Lnet/minecraft/client/item/TooltipData;)V", cancellable = true)
+	@Inject(at = @At("HEAD"), method = "method_51442(Ljava/util/List;Lnet/minecraft/client/item/TooltipData;)V", cancellable = true)
 	private static void injectRenderTooltipLambda(List<TooltipComponent> components, TooltipData data, CallbackInfo ci) {
 		TooltipComponent component = TooltipComponentCallback.EVENT.invoker().getComponent(data);
 
diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/InGameHudMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/InGameHudMixin.java
index 6f96f660b..7225ef33b 100644
--- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/InGameHudMixin.java
+++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/InGameHudMixin.java
@@ -22,15 +22,15 @@ import org.spongepowered.asm.mixin.injection.Inject;
 import org.spongepowered.asm.mixin.injection.Slice;
 import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 
-import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.hud.InGameHud;
 
 import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
 
 @Mixin(InGameHud.class)
 public class InGameHudMixin {
-	@Inject(method = "render", at = @At(value = "TAIL"), slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/PlayerListHud;render(Lnet/minecraft/client/util/math/MatrixStack;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V")))
-	public void render(MatrixStack matrixStack, float tickDelta, CallbackInfo callbackInfo) {
-		HudRenderCallback.EVENT.invoker().onHudRender(matrixStack, tickDelta);
+	@Inject(method = "render", at = @At(value = "TAIL"), slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/PlayerListHud;render(Lnet/minecraft/client/gui/DrawableHelper;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreboardObjective;)V")))
+	public void render(DrawableHelper drawableHelper, float tickDelta, CallbackInfo callbackInfo) {
+		HudRenderCallback.EVENT.invoker().onHudRender(drawableHelper, tickDelta);
 	}
 }
diff --git a/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.mixins.json b/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.mixins.json
index 9e3fa01d7..b6c1e08f9 100644
--- a/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.mixins.json
+++ b/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.mixins.json
@@ -15,7 +15,7 @@
     "LivingEntityRendererAccessor",
     "BlockEntityRendererFactoriesMixin",
     "EntityRenderersMixin",
-    "ScreenMixin",
+    "DrawableHelperMixin",
     "DimensionEffectsAccessor",
     "shader.GameRendererMixin",
     "shader.ShaderProgramImportProcessorMixin",
diff --git a/fabric-rendering-v1/src/testmod/java/net/fabricmc/fabric/test/rendering/client/HudAndShaderTest.java b/fabric-rendering-v1/src/testmod/java/net/fabricmc/fabric/test/rendering/client/HudAndShaderTest.java
index 986d664e1..c7448dd91 100644
--- a/fabric-rendering-v1/src/testmod/java/net/fabricmc/fabric/test/rendering/client/HudAndShaderTest.java
+++ b/fabric-rendering-v1/src/testmod/java/net/fabricmc/fabric/test/rendering/client/HudAndShaderTest.java
@@ -48,14 +48,14 @@ public class HudAndShaderTest implements ClientModInitializer {
 			context.register(id, VertexFormats.POSITION, program -> testShader = program);
 		});
 
-		HudRenderCallback.EVENT.register((matrices, tickDelta) -> {
+		HudRenderCallback.EVENT.register((drawableHelper, tickDelta) -> {
 			MinecraftClient client = MinecraftClient.getInstance();
 			Window window = client.getWindow();
 			int x = window.getScaledWidth() - 15;
 			int y = window.getScaledHeight() - 15;
 			RenderSystem.setShader(() -> testShader);
 			RenderSystem.setShaderColor(0f, 1f, 0f, 1f);
-			Matrix4f positionMatrix = matrices.peek().getPositionMatrix();
+			Matrix4f positionMatrix = drawableHelper.method_51448().peek().getPositionMatrix();
 			BufferBuilder buffer = Tessellator.getInstance().getBuffer();
 			buffer.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION);
 			buffer.vertex(positionMatrix, x, y, 50).next();
diff --git a/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/api/client/screen/v1/ScreenEvents.java b/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/api/client/screen/v1/ScreenEvents.java
index 33be5e91c..927efb24c 100644
--- a/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/api/client/screen/v1/ScreenEvents.java
+++ b/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/api/client/screen/v1/ScreenEvents.java
@@ -19,8 +19,8 @@ package net.fabricmc.fabric.api.client.screen.v1;
 import java.util.Objects;
 
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.util.math.MatrixStack;
 
 import net.fabricmc.fabric.api.event.Event;
 import net.fabricmc.fabric.api.event.EventFactory;
@@ -91,7 +91,7 @@ public final class ScreenEvents {
 	 * }</pre>
 	 *
 	 * <p>Note that by adding an element to a screen, the element is not automatically {@link net.minecraft.client.gui.Drawable drawn}.
-	 * Unless the element is button, you need to call the specific {@link net.minecraft.client.gui.Drawable#render(MatrixStack, int, int, float) render} methods in the corresponding screen events.
+	 * Unless the element is button, you need to call the specific {@link net.minecraft.client.gui.Drawable#render(DrawableHelper, int, int, float) render} methods in the corresponding screen events.
 	 *
 	 * <p>This event can also indicate that the previous screen has been closed.
 	 * @see ScreenEvents#BEFORE_INIT
@@ -176,12 +176,12 @@ public final class ScreenEvents {
 
 	@FunctionalInterface
 	public interface BeforeRender {
-		void beforeRender(Screen screen, MatrixStack matrices, int mouseX, int mouseY, float tickDelta);
+		void beforeRender(Screen screen, DrawableHelper drawableHelper, int mouseX, int mouseY, float tickDelta);
 	}
 
 	@FunctionalInterface
 	public interface AfterRender {
-		void afterRender(Screen screen, MatrixStack matrices, int mouseX, int mouseY, float tickDelta);
+		void afterRender(Screen screen, DrawableHelper drawableHelper, int mouseX, int mouseY, float tickDelta);
 	}
 
 	@FunctionalInterface
diff --git a/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/api/client/screen/v1/Screens.java b/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/api/client/screen/v1/Screens.java
index ed878d520..07155cd93 100644
--- a/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/api/client/screen/v1/Screens.java
+++ b/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/api/client/screen/v1/Screens.java
@@ -23,7 +23,6 @@ import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.widget.ClickableWidget;
-import net.minecraft.client.render.item.ItemRenderer;
 
 import net.fabricmc.fabric.impl.client.screen.ScreenExtensions;
 import net.fabricmc.fabric.mixin.screen.ScreenAccessor;
@@ -47,17 +46,6 @@ public final class Screens {
 		return ScreenExtensions.getExtensions(screen).fabric_getButtons();
 	}
 
-	/**
-	 * Gets a screen's item renderer.
-	 *
-	 * @return the screen's item renderer
-	 */
-	public static ItemRenderer getItemRenderer(Screen screen) {
-		Objects.requireNonNull(screen, "Screen cannot be null");
-
-		return ((ScreenAccessor) screen).getItemRenderer();
-	}
-
 	/**
 	 * Gets a screen's text renderer.
 	 *
diff --git a/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/mixin/screen/GameRendererMixin.java b/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/mixin/screen/GameRendererMixin.java
index d21bd662f..1a1d1983b 100644
--- a/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/mixin/screen/GameRendererMixin.java
+++ b/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/mixin/screen/GameRendererMixin.java
@@ -26,6 +26,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
 
 import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.render.GameRenderer;
 import net.minecraft.client.util.math.MatrixStack;
@@ -41,18 +42,18 @@ abstract class GameRendererMixin {
 	@Unique
 	private Screen renderingScreen;
 
-	@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;renderWithTooltip(Lnet/minecraft/client/util/math/MatrixStack;IIF)V"), locals = LocalCapture.CAPTURE_FAILEXCEPTION)
-	private void onBeforeRenderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, MatrixStack matrices) {
+	@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;renderWithTooltip(Lnet/minecraft/client/gui/DrawableHelper;IIF)V"), locals = LocalCapture.CAPTURE_FAILEXCEPTION)
+	private void onBeforeRenderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, MatrixStack matrixStack, DrawableHelper drawableHelper) {
 		// Store the screen in a variable in case someone tries to change the screen during this before render event.
 		// If someone changes the screen, the after render event will likely have class cast exceptions or an NPE.
 		this.renderingScreen = this.client.currentScreen;
-		ScreenEvents.beforeRender(this.renderingScreen).invoker().beforeRender(this.renderingScreen, matrices, mouseX, mouseY, tickDelta);
+		ScreenEvents.beforeRender(this.renderingScreen).invoker().beforeRender(this.renderingScreen, drawableHelper, mouseX, mouseY, tickDelta);
 	}
 
 	// This injection should end up in the try block so exceptions are caught
-	@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;renderWithTooltip(Lnet/minecraft/client/util/math/MatrixStack;IIF)V", shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILEXCEPTION)
-	private void onAfterRenderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, MatrixStack matrices) {
-		ScreenEvents.afterRender(this.renderingScreen).invoker().afterRender(this.renderingScreen, matrices, mouseX, mouseY, tickDelta);
+	@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;renderWithTooltip(Lnet/minecraft/client/gui/DrawableHelper;IIF)V", shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILEXCEPTION)
+	private void onAfterRenderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, MatrixStack matrixStack, DrawableHelper drawableHelper) {
+		ScreenEvents.afterRender(this.renderingScreen).invoker().afterRender(this.renderingScreen, drawableHelper, mouseX, mouseY, tickDelta);
 		// Finally set the currently rendering screen to null
 		this.renderingScreen = null;
 	}
diff --git a/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/mixin/screen/ScreenAccessor.java b/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/mixin/screen/ScreenAccessor.java
index 6f4de1e9f..c029e754d 100644
--- a/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/mixin/screen/ScreenAccessor.java
+++ b/fabric-screen-api-v1/src/client/java/net/fabricmc/fabric/mixin/screen/ScreenAccessor.java
@@ -22,13 +22,9 @@ import org.spongepowered.asm.mixin.gen.Accessor;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
 import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.render.item.ItemRenderer;
 
 @Mixin(Screen.class)
 public interface ScreenAccessor {
-	@Accessor
-	ItemRenderer getItemRenderer();
-
 	@Accessor
 	TextRenderer getTextRenderer();
 
diff --git a/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/ScreenTests.java b/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/ScreenTests.java
index 85cd77733..0e65cec8f 100644
--- a/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/ScreenTests.java
+++ b/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/ScreenTests.java
@@ -18,16 +18,14 @@ package net.fabricmc.fabric.test.screen;
 
 import java.util.List;
 
-import com.mojang.blaze3d.systems.RenderSystem;
-import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.DrawableHelper;
-import net.minecraft.client.gui.hud.InGameHud;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.screen.TitleScreen;
 import net.minecraft.client.gui.widget.ClickableWidget;
+import net.minecraft.util.Identifier;
 
 import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.api.EnvType;
@@ -38,6 +36,7 @@ import net.fabricmc.fabric.api.client.screen.v1.Screens;
 
 @Environment(EnvType.CLIENT)
 public final class ScreenTests implements ClientModInitializer {
+	public static final Identifier GUI_ICONS_TEXTURE = new Identifier("textures/gui/icons.png");
 	private static final Logger LOGGER = LoggerFactory.getLogger("FabricScreenApiTests");
 
 	@Override
@@ -78,10 +77,9 @@ public final class ScreenTests implements ClientModInitializer {
 					.orElseThrow(() -> new AssertionError("Failed to find the \"Stop Sound\" button in the screen's elements"));
 
 			// Register render event to draw an icon on the screen
-			ScreenEvents.afterRender(screen).register((_screen, matrices, mouseX, mouseY, tickDelta) -> {
+			ScreenEvents.afterRender(screen).register((_screen, drawableHelper, mouseX, mouseY, tickDelta) -> {
 				// Render an armor icon to test
-				RenderSystem.setShaderTexture(0, InGameHud.GUI_ICONS_TEXTURE);
-				DrawableHelper.drawTexture(matrices, (screen.width / 2) - 124, (screen.height / 4) + 96, 20, 20, 34, 9, 9, 9, 256, 256);
+				drawableHelper.drawTexture(ScreenTests.GUI_ICONS_TEXTURE, (screen.width / 2) - 124, (screen.height / 4) + 96, 20, 20, 34, 9, 9, 9, 256, 256);
 			});
 
 			ScreenKeyboardEvents.allowKeyPress(screen).register((_screen, key, scancode, modifiers) -> {
diff --git a/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/StopSoundButton.java b/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/StopSoundButton.java
index 34ce142b6..d8390f203 100644
--- a/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/StopSoundButton.java
+++ b/fabric-screen-api-v1/src/testmod/java/net/fabricmc/fabric/test/screen/StopSoundButton.java
@@ -16,17 +16,15 @@
 
 package net.fabricmc.fabric.test.screen;
 
-import com.mojang.blaze3d.systems.RenderSystem;
-
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.DrawableHelper;
-import net.minecraft.client.gui.hud.InGameHud;
 import net.minecraft.client.gui.screen.Screen;
 import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
 import net.minecraft.client.gui.widget.PressableWidget;
-import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.text.Text;
 
+import net.fabricmc.fabric.api.client.screen.v1.Screens;
+
 class StopSoundButton extends PressableWidget {
 	private final Screen screen;
 
@@ -36,13 +34,12 @@ class StopSoundButton extends PressableWidget {
 	}
 
 	@Override
-	public void render(MatrixStack matrices, int mouseX, int mouseY, float tickDelta) {
+	public void render(DrawableHelper drawableHelper, int mouseX, int mouseY, float tickDelta) {
 		// Render the armor icon to test
-		RenderSystem.setShaderTexture(0, InGameHud.GUI_ICONS_TEXTURE);
-		DrawableHelper.drawTexture(matrices, this.getX(), this.getY(), this.width, this.height, 43, 27, 9, 9, 256, 256);
+		drawableHelper.drawTexture(ScreenTests.GUI_ICONS_TEXTURE, this.getX(), this.getY(), this.width, this.height, 43, 27, 9, 9, 256, 256);
 
 		if (this.isMouseOver(mouseX, mouseY)) {
-			this.screen.renderTooltip(matrices, Text.literal("Click to stop all sounds"), this.getX(), this.getY());
+			drawableHelper.method_51438(Screens.getTextRenderer(this.screen), Text.literal("Click to stop all sounds"), this.getX(), this.getY());
 		}
 	}
 
diff --git a/fabric-screen-handler-api-v1/src/testmod/java/net/fabricmc/fabric/test/screenhandler/client/PositionedScreen.java b/fabric-screen-handler-api-v1/src/testmod/java/net/fabricmc/fabric/test/screenhandler/client/PositionedScreen.java
index ec3b361a2..c24b0aa32 100644
--- a/fabric-screen-handler-api-v1/src/testmod/java/net/fabricmc/fabric/test/screenhandler/client/PositionedScreen.java
+++ b/fabric-screen-handler-api-v1/src/testmod/java/net/fabricmc/fabric/test/screenhandler/client/PositionedScreen.java
@@ -20,8 +20,8 @@ import java.util.Optional;
 
 import com.mojang.blaze3d.systems.RenderSystem;
 
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.gui.screen.ingame.HandledScreen;
-import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.screen.ScreenHandler;
 import net.minecraft.text.Text;
@@ -47,10 +47,10 @@ public class PositionedScreen extends HandledScreen<ScreenHandler> {
 	}
 
 	@Override
-	public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
-		renderBackground(matrices);
-		super.render(matrices, mouseX, mouseY, delta);
-		drawMouseoverTooltip(matrices, mouseX, mouseY);
+	public void render(DrawableHelper drawableHelper, int mouseX, int mouseY, float delta) {
+		renderBackground(drawableHelper);
+		super.render(drawableHelper, mouseX, mouseY, delta);
+		drawMouseoverTooltip(drawableHelper, mouseX, mouseY);
 	}
 
 	@Override
@@ -61,11 +61,10 @@ public class PositionedScreen extends HandledScreen<ScreenHandler> {
 	}
 
 	@Override
-	protected void drawBackground(MatrixStack matrices, float delta, int mouseX, int mouseY) {
+	protected void drawBackground(DrawableHelper drawableHelper, float delta, int mouseX, int mouseY) {
 		RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
-		RenderSystem.setShaderTexture(0, TEXTURE);
 		int x = (width - backgroundWidth) / 2;
 		int y = (height - backgroundHeight) / 2;
-		drawTexture(matrices, x, y, 0, 0, backgroundWidth, backgroundHeight);
+		drawableHelper.drawTexture(TEXTURE, x, y, 0, 0, backgroundWidth, backgroundHeight);
 	}
 }
diff --git a/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/FluidChuteBlock.java b/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/FluidChuteBlock.java
index 0a061a35d..9e473b2db 100644
--- a/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/FluidChuteBlock.java
+++ b/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/FluidChuteBlock.java
@@ -42,7 +42,7 @@ import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariantAttributes;
 
 public class FluidChuteBlock extends Block implements BlockEntityProvider {
 	public FluidChuteBlock() {
-		super(Settings.of(Material.field_44489));
+		super(Settings.of(Material.GENERIC));
 	}
 
 	private static final VoxelShape SHAPE = VoxelShapes.cuboid(
diff --git a/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/TransferTestInitializer.java b/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/TransferTestInitializer.java
index 0c4635511..1fa1e3b61 100644
--- a/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/TransferTestInitializer.java
+++ b/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/TransferTestInitializer.java
@@ -35,8 +35,8 @@ import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage;
 public class TransferTestInitializer implements ModInitializer {
 	public static final String MOD_ID = "fabric-transfer-api-v1-testmod";
 
-	private static final Block INFINITE_WATER_SOURCE = new Block(AbstractBlock.Settings.of(Material.field_44483));
-	private static final Block INFINITE_LAVA_SOURCE = new Block(AbstractBlock.Settings.of(Material.field_44483));
+	private static final Block INFINITE_WATER_SOURCE = new Block(AbstractBlock.Settings.of(Material.GENERIC));
+	private static final Block INFINITE_LAVA_SOURCE = new Block(AbstractBlock.Settings.of(Material.GENERIC));
 	private static final Block FLUID_CHUTE = new FluidChuteBlock();
 	private static final Item EXTRACT_STICK = new ExtractStickItem();
 	public static BlockEntityType<FluidChuteBlockEntity> FLUID_CHUTE_TYPE;
diff --git a/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/client/FluidVariantRenderTest.java b/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/client/FluidVariantRenderTest.java
index ddf72b9e3..cb69350b8 100644
--- a/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/client/FluidVariantRenderTest.java
+++ b/fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/client/FluidVariantRenderTest.java
@@ -23,6 +23,7 @@ import org.joml.Matrix4f;
 
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.gui.DrawableHelper;
 import net.minecraft.client.render.BufferBuilder;
 import net.minecraft.client.render.BufferRenderer;
 import net.minecraft.client.render.GameRenderer;
@@ -31,7 +32,6 @@ import net.minecraft.client.render.VertexFormat;
 import net.minecraft.client.render.VertexFormats;
 import net.minecraft.client.texture.Sprite;
 import net.minecraft.client.texture.SpriteAtlasTexture;
-import net.minecraft.client.util.math.MatrixStack;
 import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.fluid.Fluids;
 import net.minecraft.text.Text;
@@ -50,7 +50,7 @@ public class FluidVariantRenderTest implements ClientModInitializer {
 	public void onInitializeClient() {
 		FluidVariantAttributes.enableColoredVanillaFluidNames();
 
-		HudRenderCallback.EVENT.register((matrices, tickDelta) -> {
+		HudRenderCallback.EVENT.register((drawableHelper, tickDelta) -> {
 			PlayerEntity player = MinecraftClient.getInstance().player;
 			if (player == null) return;
 
@@ -64,9 +64,9 @@ public class FluidVariantRenderTest implements ClientModInitializer {
 				int color = FluidVariantRendering.getColor(variant, player.world, player.getBlockPos());
 
 				if (sprites != null) {
-					drawFluidInGui(matrices, sprites[0], color, 0, renderY);
+					drawFluidInGui(drawableHelper, sprites[0], color, 0, renderY);
 					renderY += 16;
-					drawFluidInGui(matrices, sprites[1], color, 0, renderY);
+					drawFluidInGui(drawableHelper, sprites[1], color, 0, renderY);
 					renderY += 16;
 				}
 
@@ -76,14 +76,14 @@ public class FluidVariantRenderTest implements ClientModInitializer {
 				renderY += 2;
 
 				for (Text line : tooltip) {
-					textRenderer.draw(matrices, line, 4, renderY, -1);
 					renderY += 10;
+					drawableHelper.method_51438(textRenderer, line, -8, renderY);
 				}
 			}
 		});
 	}
 
-	private static void drawFluidInGui(MatrixStack ms, Sprite sprite, int color, int i, int j) {
+	private static void drawFluidInGui(DrawableHelper drawableHelper, Sprite sprite, int color, int i, int j) {
 		if (sprite == null) return;
 
 		RenderSystem.setShaderTexture(0, SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE);
@@ -105,7 +105,7 @@ public class FluidVariantRenderTest implements ClientModInitializer {
 		float v0 = sprite.getMinV();
 		float u1 = sprite.getMaxU();
 		float v1 = sprite.getMaxV();
-		Matrix4f model = ms.peek().getPositionMatrix();
+		Matrix4f model = drawableHelper.method_51448().peek().getPositionMatrix();
 		bufferBuilder.vertex(model, x0, y1, z).color(r, g, b, 1).texture(u0, v1).next();
 		bufferBuilder.vertex(model, x1, y1, z).color(r, g, b, 1).texture(u1, v1).next();
 		bufferBuilder.vertex(model, x1, y0, z).color(r, g, b, 1).texture(u1, v0).next();
diff --git a/gradle.properties b/gradle.properties
index e43075956..2c4e2b48f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -2,9 +2,9 @@ org.gradle.jvmargs=-Xmx2560M
 org.gradle.parallel=true
 fabric.loom.multiProjectOptimisation=true
 
-version=0.78.0
-minecraft_version=23w14a
-yarn_version=+build.1
+version=0.78.1
+minecraft_version=23w16a
+yarn_version=+build.4
 loader_version=0.14.18
 installer_version=0.11.1
 
@@ -12,52 +12,52 @@ prerelease=true
 
 # Do not manually update, use the bumpversions task:
 fabric-api-base-version=0.4.23
-fabric-api-lookup-api-v1-version=1.6.25
+fabric-api-lookup-api-v1-version=1.6.26
 fabric-biome-api-v1-version=13.0.6
 fabric-block-api-v1-version=1.0.5
 fabric-blockrenderlayer-v1-version=1.1.33
 fabric-command-api-v1-version=1.2.26
 fabric-command-api-v2-version=2.2.5
 fabric-commands-v0-version=0.2.43
-fabric-containers-v0-version=0.1.54
-fabric-content-registries-v0-version=3.5.8
+fabric-containers-v0-version=0.1.55
+fabric-content-registries-v0-version=4.0.0
 fabric-crash-report-info-v1-version=0.2.14
-fabric-data-generation-api-v1-version=11.3.10
+fabric-data-generation-api-v1-version=12.0.0
 fabric-dimensions-v1-version=2.1.44
-fabric-entity-events-v1-version=1.5.13
+fabric-entity-events-v1-version=1.5.14
 fabric-events-interaction-v0-version=0.4.42
-fabric-events-lifecycle-v0-version=0.2.52
-fabric-game-rule-api-v1-version=1.0.32
+fabric-events-lifecycle-v0-version=0.2.53
+fabric-game-rule-api-v1-version=1.0.33
 fabric-gametest-api-v1-version=1.2.3
-fabric-item-api-v1-version=2.1.17
-fabric-item-group-api-v1-version=3.0.4
+fabric-item-api-v1-version=2.1.18
+fabric-item-group-api-v1-version=4.0.0
 fabric-key-binding-api-v1-version=1.0.32
 fabric-keybindings-v0-version=0.2.30
 fabric-lifecycle-events-v1-version=2.2.14
-fabric-loot-api-v2-version=1.1.28
-fabric-loot-tables-v1-version=1.1.32
+fabric-loot-api-v2-version=1.1.29
+fabric-loot-tables-v1-version=1.1.33
 fabric-message-api-v1-version=5.1.0
-fabric-mining-level-api-v1-version=2.1.38
+fabric-mining-level-api-v1-version=2.1.39
 fabric-models-v0-version=0.3.29
-fabric-networking-api-v1-version=1.3.1
-fabric-networking-v0-version=0.3.41
-fabric-object-builder-api-v1-version=9.0.1
+fabric-networking-api-v1-version=1.3.2
+fabric-networking-v0-version=0.3.42
+fabric-object-builder-api-v1-version=10.0.0
 fabric-particles-v1-version=1.0.22
-fabric-recipe-api-v1-version=1.0.8
-fabric-registry-sync-v0-version=2.1.4
-fabric-renderer-api-v1-version=2.2.4
-fabric-renderer-indigo-version=1.1.0
-fabric-renderer-registries-v1-version=3.2.37
+fabric-recipe-api-v1-version=1.0.9
+fabric-registry-sync-v0-version=2.1.5
+fabric-renderer-api-v1-version=2.2.5
+fabric-renderer-indigo-version=1.1.1
+fabric-renderer-registries-v1-version=3.2.38
 fabric-rendering-data-attachment-v1-version=0.3.27
 fabric-rendering-fluids-v1-version=3.0.20
-fabric-rendering-v0-version=1.1.40
-fabric-rendering-v1-version=2.1.0
+fabric-rendering-v0-version=1.1.41
+fabric-rendering-v1-version=3.0.0
 fabric-resource-conditions-api-v1-version=2.3.0
 fabric-resource-loader-v0-version=0.11.1
-fabric-screen-api-v1-version=1.0.44
-fabric-screen-handler-api-v1-version=1.3.20
+fabric-screen-api-v1-version=2.0.0
+fabric-screen-handler-api-v1-version=1.3.21
 fabric-sound-api-v1-version=1.0.8
-fabric-transfer-api-v1-version=3.1.0
-fabric-transitive-access-wideners-v1-version=4.0.0
+fabric-transfer-api-v1-version=3.1.1
+fabric-transitive-access-wideners-v1-version=4.0.1
 fabric-convention-tags-v1-version=1.4.0
 fabric-client-tags-api-v1-version=1.0.14