diff --git a/game/client/build.gradle.kts b/game/client/build.gradle.kts
index cde808703..126576088 100644
--- a/game/client/build.gradle.kts
+++ b/game/client/build.gradle.kts
@@ -7,7 +7,7 @@ plugins {
 
 group = providers.gradleProperty("bta.group").get()
 version = providers.gradleProperty("bta.version").get()
-val texturePackFormat = providers.gradleProperty("bta.texturePackFormat").get()
+val assetPackFormat = providers.gradleProperty("bta.assetPackFormat").get()
 
 val include: Configuration by configurations.creating
 
@@ -88,7 +88,7 @@ val manifestGenerator by tasks.registering {
                             "line1": "The default look of Minecraft.",
                             "line2": "",
                             "packVersion": "$version",
-                            "format": $texturePackFormat
+                            "format": $assetPackFormat
                         }
                     }
                 """.trimIndent()
diff --git a/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocalMultiplayer.java b/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocalMultiplayer.java
index d96ea6cb2..fd45c7366 100644
--- a/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocalMultiplayer.java
+++ b/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocalMultiplayer.java
@@ -246,7 +246,7 @@ public class PlayerLocalMultiplayer extends PlayerLocal implements Player.Player
         if(stat == null) {
             return;
         }
-        if(stat.clientside)
+        if(!stat.clientside)
         {
             super.addStat(stat, i);
         }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java
index 35554f56f..75f028ae1 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java
@@ -165,7 +165,7 @@ public class ScreenMainMenu extends Screen
         int i = height / 4 + 48;
         buttons.add(new ButtonElement(1, width / 2 - 100, i, i18n.translateKey("gui.main_menu.button.singleplayer")));
         buttons.add(multiplayerButton = new ButtonElement(2, width / 2 - 100, i + 24, i18n.translateKey("gui.main_menu.button.multiplayer")));
-        buttons.add(new ButtonElement(3, width / 2 - 100, i + 48, i18n.translateKey("gui.main_menu.button.texture_packs")));
+        buttons.add(new ButtonElement(3, width / 2 - 100, i + 48, i18n.translateKey("gui.main_menu.button.asset_packs")));
         if(mc.hideQuitButton)
         {
             buttons.add(new ButtonElement(0, width / 2 - 100, i + 72, i18n.translateKey("gui.main_menu.button.options")));
@@ -212,7 +212,7 @@ public class ScreenMainMenu extends Screen
         }
         if(button.id == 3)
         {
-            mc.displayScreen(new ScreenOptions(this, OptionsPages.TEXTURE_PACKS));
+            mc.displayScreen(new ScreenOptions(this, OptionsPages.ASSET_PACKS));
         }
         if(button.id == 4)
         {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/components/AvailableTexturePackListComponent.java b/game/client/src/main/java/net/minecraft/client/gui/options/components/AvailableTexturePackListComponent.java
index f77a8b087..5006b910c 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/components/AvailableTexturePackListComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/components/AvailableTexturePackListComponent.java
@@ -72,7 +72,7 @@ public class AvailableTexturePackListComponent
     @Override
     public void render(int x, int y, int width, int relativeMouseX, int relativeMouseY) {
         if (availablePacks.isEmpty()) {
-            mc.font.renderCentered(Tessellator.instance, I18n.getInstance().translateKey("gui.options.page.texture_packs.label.no_packs"), x + width / 2, y + 4).setShadow().setColor(0x5F7F7F7F).call();
+            mc.font.renderCentered(Tessellator.instance, I18n.getInstance().translateKey("gui.options.page.asset_packs.label.no_packs"), x + width / 2, y + 4).setShadow().setColor(0x5F7F7F7F).call();
         }
         for (int i = 0; i < availablePacks.size(); i++) {
             TexturePackButton button = availablePacks.get(i);
@@ -166,7 +166,7 @@ public class AvailableTexturePackListComponent
             int rgbVersion = 0x808080;
             int format = texturePack.manifest.getFormat();
 
-			if(format == Global.TEXTURE_PACK_FORMAT) {
+			if(format == Global.ASSET_PACK_FORMAT) {
 				// Correct version
                 mc.font.render(Tessellator.instance, this.texturePack.manifest.getName(), x + this.height + 2, y + 1).call();
                 mc.font.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine1(), x + this.height + 2, y + 12).setColor(0x808080).call();
@@ -181,8 +181,8 @@ public class AvailableTexturePackListComponent
 				// Wrong texture pack version
 				I18n i18n = I18n.getInstance();
                 mc.font.render(Tessellator.instance, TextFormatting.RED + this.texturePack.manifest.getName(), x + this.height + 2, y + 1).call();
-                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.1"), x + this.height + 2, y + 12).setColor(0x808080).call();
-                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.2"), x + this.height + 2, y + 22).setColor(0x808080).call();
+                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.asset_packs.label.outdated_pack.1"), x + this.height + 2, y + 12).setColor(0x808080).call();
+                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.asset_packs.label.outdated_pack.2"), x + this.height + 2, y + 22).setColor(0x808080).call();
 				rgbVersion = Colors.allChatColors[TextFormatting.RED.id].getARGB();
 			}
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/components/SelectedTexturePackListComponent.java b/game/client/src/main/java/net/minecraft/client/gui/options/components/SelectedTexturePackListComponent.java
index 9a65d728f..92d63a059 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/components/SelectedTexturePackListComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/components/SelectedTexturePackListComponent.java
@@ -63,7 +63,7 @@ public class SelectedTexturePackListComponent implements OptionsComponent {
     @Override
     public void render(int x, int y, int width, int relativeMouseX, int relativeMouseY) {
         if (selectedPacks.isEmpty()) {
-            mc.font.renderCentered(Tessellator.instance, I18n.getInstance().translateKey("gui.options.page.texture_packs.label.no_packs"), x + width / 2, y + 4)
+            mc.font.renderCentered(Tessellator.instance, I18n.getInstance().translateKey("gui.options.page.asset_packs.label.no_packs"), x + width / 2, y + 4)
                 .setShadow()
                 .setColor(0x5F7F7F7F)
                 .call();
@@ -261,7 +261,7 @@ public class SelectedTexturePackListComponent implements OptionsComponent {
             int rgbVersion = 0x808080;
             int format = texturePack.manifest.getFormat();
 
-            if(format == Global.TEXTURE_PACK_FORMAT) {
+            if(format == Global.ASSET_PACK_FORMAT) {
                 // Correct version
                 mc.font.render(Tessellator.instance, this.texturePack.manifest.getName(), x + this.xPos + this.height + 2, y + this.yPos + 1).call();
                 mc.font.render(Tessellator.instance, this.texturePack.manifest.getDescriptionLine1(), x + this.xPos + this.height + 2, y + this.yPos + 12).setColor(0x808080).call();
@@ -276,8 +276,8 @@ public class SelectedTexturePackListComponent implements OptionsComponent {
                 // Wrong texture pack version
                 I18n i18n = I18n.getInstance();
                 mc.font.render(Tessellator.instance, TextFormatting.RED + this.texturePack.manifest.getName(), x + this.xPos + this.height + 2, y + this.yPos + 1).call();
-                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.1"), x + this.xPos + this.height + 2, y + this.yPos + 12).setColor(0x808080).call();
-                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.texture_packs.label.outdated_pack.2"), x + this.xPos + this.height + 2, y + this.yPos + 22).setColor(0x808080).call();
+                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.asset_packs.label.outdated_pack.1"), x + this.xPos + this.height + 2, y + this.yPos + 12).setColor(0x808080).call();
+                mc.font.render(Tessellator.instance, i18n.translateKey("gui.options.page.asset_packs.label.outdated_pack.2"), x + this.xPos + this.height + 2, y + this.yPos + 22).setColor(0x808080).call();
                 rgbVersion = Colors.allChatColors[TextFormatting.RED.id].getARGB();
             }
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
index 08bc1cede..0f326ad6b 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
@@ -40,7 +40,7 @@ public abstract class OptionsPages
     public static OptionsPage VIDEO;
     public static OptionsPage CONTROLS;
     public static OptionsPage ACCESSIBILITY;
-    public static OptionsPage TEXTURE_PACKS;
+    public static OptionsPage ASSET_PACKS;
     public static OptionsPage LANGUAGE;
     public static OptionsPage SEARCH;
     public static OptionsPage DEBUG;
@@ -277,20 +277,20 @@ public abstract class OptionsPages
             )
         );
 
-        TEXTURE_PACKS = register(new OptionsPage("gui.options.page.texture_packs.title", new ItemStack(Items.PAINTING))
-            .withComponent(new ShortcutComponent("gui.options.page.texture_packs.button.open_folder", () -> FileOpener.open(new File(mc.getMinecraftDir(), "texturepacks"))))
-            .withComponent(new OptionsCategory("gui.options.page.texture_packs.category.textures")
+        ASSET_PACKS = register(new OptionsPage("gui.options.page.asset_packs.title", new ItemStack(Items.PAINTING))
+            .withComponent(new ShortcutComponent("gui.options.page.asset_packs.button.open_folder", () -> FileOpener.open(new File(mc.getMinecraftDir(), "texturepacks"))))
+            .withComponent(new OptionsCategory("gui.options.page.asset_packs.category.textures")
                 .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.animations))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.customAnimations))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.mobVariants))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.customLightmap))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.enableHolidayTextures))
             )
-            .withComponent(new ShortcutComponent("gui.options.page.texture_packs.button.apply", () -> mc.texturePackList.refreshIfReady()))
-            .withComponent(new OptionsCategory("gui.options.page.texture_packs.category.texture_packs.selected")
+            .withComponent(new ShortcutComponent("gui.options.page.asset_packs.button.apply", () -> mc.texturePackList.refreshIfReady()))
+            .withComponent(new OptionsCategory("gui.options.page.asset_packs.category.asset_packs.selected")
                 .withComponent(new SelectedTexturePackListComponent())
             )
-            .withComponent(new OptionsCategory("gui.options.page.texture_packs.category.texture_packs.available")
+            .withComponent(new OptionsCategory("gui.options.page.asset_packs.category.asset_packs.available")
                 .withComponent(new AvailableTexturePackListComponent())
             )
         );
diff --git a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
index 20f0168ff..3fc6bdc94 100644
--- a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -201,8 +201,8 @@ public class GameSettings {
 	public KeyBinding keyDrop = new KeyBinding("key.drop").setDefault(InputDevice.keyboard, KEY_Q);
 	public KeyBinding keyChat = new KeyBinding("key.chat").setDefault(InputDevice.keyboard, KEY_T);
 	public KeyBinding keyCommand = new KeyBinding("key.command").setDefault(InputDevice.keyboard, KEY_SLASH);
-	public KeyBinding keyToggleFog = new KeyBinding("key.fog").setDefault(InputDevice.keyboard, KEY_F);
-	public KeyBinding keyToggleGamma = new KeyBinding("key.gamma").setDefault(InputDevice.keyboard, KEY_G);
+	public KeyBinding keyToggleFog = new KeyBinding("key.fog");
+	public KeyBinding keyToggleGamma = new KeyBinding("key.gamma");
 	public KeyBinding keySneak = new KeyBinding("key.sneak").setDefault(InputDevice.keyboard, KEY_LSHIFT);
 	public KeyBinding keyFly = new KeyBinding("key.fly").setDefault(InputDevice.keyboard, KEY_LCONTROL);
 	public KeyBinding keyGuidebook = new KeyBinding("key.guidebook").setDefault(InputDevice.keyboard, KEY_R);
diff --git a/game/client/src/main/java/net/minecraft/client/render/colorizer/Colorizer.java b/game/client/src/main/java/net/minecraft/client/render/colorizer/Colorizer.java
index 374119450..7af3e56d2 100644
--- a/game/client/src/main/java/net/minecraft/client/render/colorizer/Colorizer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/colorizer/Colorizer.java
@@ -68,7 +68,7 @@ public class Colorizer {
 		this.defaultColor = Colorizers.loadColorData(texturePack, path);
 		if(defaultColor == null) {
 			// If a colormap is found by the first code, but it can't get loaded, throw an Exception
-			throw new NullPointerException("Could not load colormap '" + path + "' from texture pack '" + texturePack.fileName + "'!");
+			throw new NullPointerException("Could not load colormap '" + path + "' from asset pack '" + texturePack.fileName + "'!");
 		}
 	}
 	
diff --git a/game/client/src/main/java/net/minecraft/client/render/colorizer/Colorizers.java b/game/client/src/main/java/net/minecraft/client/render/colorizer/Colorizers.java
index 1d8363eeb..4bdbe814a 100644
--- a/game/client/src/main/java/net/minecraft/client/render/colorizer/Colorizers.java
+++ b/game/client/src/main/java/net/minecraft/client/render/colorizer/Colorizers.java
@@ -62,7 +62,7 @@ public class Colorizers {
 			colorizer.setup(mc, seasons);
 			TexturePack texturePack = colorizer.getTexturePack();
 			if(texturePack != null) {
-                LOGGER.info("Using {} color from texture pack {}", colorizer.name, texturePack.fileName);
+                LOGGER.info("Using {} color from asset pack {}", colorizer.name, texturePack.fileName);
 			}
 		}
 	}
diff --git a/game/client/src/main/java/net/minecraft/client/render/customatlas/Atlas.java b/game/client/src/main/java/net/minecraft/client/render/customatlas/Atlas.java
index 3334d6485..81e5bded3 100644
--- a/game/client/src/main/java/net/minecraft/client/render/customatlas/Atlas.java
+++ b/game/client/src/main/java/net/minecraft/client/render/customatlas/Atlas.java
@@ -1,49 +1,52 @@
 package net.minecraft.client.render.customatlas;
 
+import org.jetbrains.annotations.NotNull;
+
 import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 public class Atlas {
 	
-	public final List<AtlasTile> tileList = new ArrayList<>();
+	public final @NotNull List<@NotNull AtlasTile> tileList = new ArrayList<>();
 	
-	public int width;
-	public int height;
+	public int width = 0;
+	public int height = 0;
 	
 	public Atlas() {
 		
 	}
 	
 	public int size() {
-		return tileList.size();
+		return this.tileList.size();
 	}
 	
 	public void setSizeAuto() {
-		width = 1;
-		height = 1;
+        this.width = 1;
+        this.height = 1;
 		
-		for(int i=0; i < tileList.size(); i++) {
-			AtlasTile tile = tileList.get(i);
-			
-			width = Math.max(width, tile.x + 1);
-			height = Math.max(height, tile.y + 1);
+		for(int i = 0; i < this.tileList.size(); i++) {
+			final AtlasTile tile = this.tileList.get(i);
+
+            this.width = Math.max(this.width, tile.x + tile.sizeX);
+            this.height = Math.max(this.height, tile.y + tile.sizeY);
 		}
 	}
 	
 	@Override
 	public String toString() {
-		return "Atlas[" + tileList.size() + " tiles, " + width + "x" + height + "]";
+		return "Atlas[" + this.tileList.size() + " tiles, " + this.width + "x" + this.height + "]";
 	}
 	
-	public static Atlas read(InputStream in) {
-		Atlas atlas = new Atlas();
+	public static Atlas read(final InputStream in) {
+		final Atlas atlas = new Atlas();
 		
-		Map<Integer, AtlasTile> map = new HashMap<>();
+		final Map<Integer, AtlasTile> map = new HashMap<>();
 		
 		BufferedReader br = null;
 		try {
@@ -56,51 +59,71 @@ public class Atlas {
 				}
 				
 				line = line.trim();
-				if(line.length() == 0 || line.startsWith("#")) {
+				if(line.isEmpty() || line.startsWith("#")) {
 					continue;
 				}
 				
 				try {
-					int seperatorIndex = line.indexOf('=');
+					final int seperatorIndex = line.indexOf('=');
 					if(seperatorIndex < 0) {
 						throw new RuntimeException("No separator! Expected '='!");
 					}
 					
-					String key = line.substring(0, seperatorIndex);
+					final String key = line.substring(0, seperatorIndex);
 					String value = line.substring(seperatorIndex + 1);
 					
 					if(key.equals("size")) {
-						String[] size = value.split("x");
+						final String[] size = value.split("x");
 						if(size.length != 2) {
-							throw new RuntimeException("Invalid size '" + size + "'! Expected <width>x<height>!");
+							throw new RuntimeException("Invalid size '" + Arrays.toString(size) + "'! Expected <width>x<height>!");
 						}
 						
 						atlas.width = Integer.parseInt(size[0]);
 						atlas.height = Integer.parseInt(size[1]);
 					}else {
-						String[] pos = line.substring(0, seperatorIndex).split(",");
+						final String[] pos = line.substring(0, seperatorIndex).split(",");
 						if(pos.length != 2) {
 							throw new RuntimeException("Invalid position '" + key + "'! Expected <x>,<y>!");
 						}
 						
-						int x = Integer.parseInt(pos[0]);
-						int y = Integer.parseInt(pos[1]);
-						
-						map.put(AtlasTile.getIndex(x, y), new AtlasTile(value, x, y));
+						final int x = Integer.parseInt(pos[0]);
+						final int y = Integer.parseInt(pos[1]);
+
+						value = value.trim();
+
+						if (value.contains(" ")) {
+							final String[] split = value.split(" ");
+							if (split.length != 2) {
+								throw new RuntimeException("Failed to find dimensions in '" + key + "'! expected 'x,y=name <width, height>'!");
+							}
+
+							final String[] dims = split[1].replace("<", "").replace(">", "").split(",");
+
+							if (dims.length != 2) {
+								throw new RuntimeException("Invalid dimensions '" + key + "'! Expected <width,height>!");
+							}
+
+							final int width = Integer.parseInt(dims[0].trim());
+							final int height = Integer.parseInt(dims[1].trim());
+							map.put(AtlasTile.getIndex(x, y), new AtlasTile(split[0].trim(), x, y, width, height));
+						} else {
+							map.put(AtlasTile.getIndex(x, y), new AtlasTile(value, x, y, 1, 1));
+						}
+
 					}
-				}catch (Exception e) {
+				}catch (final Exception e) {
 					throw new RuntimeException("Reading line '" + line + "'", e);
 				}
 			}
-		}catch (Exception e) {
+		}catch (final Exception e) {
 			throw new RuntimeException("Loading atlas tiles", e);
 		}finally {
 			try {
-				br.close();
-			}catch (Exception e) {}
+				if (br != null) br.close();
+			}catch (final Exception ignored) {}
 			try {
 				in.close();
-			}catch (Exception e) {}
+			}catch (final Exception ignored) {}
 		}
 		
 		atlas.tileList.addAll(map.values());
diff --git a/game/client/src/main/java/net/minecraft/client/render/customatlas/AtlasTile.java b/game/client/src/main/java/net/minecraft/client/render/customatlas/AtlasTile.java
index a4d76908f..32951bb64 100644
--- a/game/client/src/main/java/net/minecraft/client/render/customatlas/AtlasTile.java
+++ b/game/client/src/main/java/net/minecraft/client/render/customatlas/AtlasTile.java
@@ -1,16 +1,20 @@
 package net.minecraft.client.render.customatlas;
 
+import org.jetbrains.annotations.NotNull;
+
 import java.util.Comparator;
 
 public class AtlasTile {
 	
 	public static final Comparator<AtlasTile> sorter = (o1, o2) -> o1.x == o2.x ? o1.y - o2.y : o1.x - o2.x;
 	
-	public final String name;
+	public final @NotNull String name;
 	public final int x;
 	public final int y;
-	
-	public AtlasTile(String name, int x, int y) {
+	public final int sizeX;
+	public final int sizeY;
+
+	public AtlasTile(final @NotNull String name, final int x, final int y, final int sizeX, final int sizeY) {
 		if(x < 0 || x > 0xFFFF) {
 			throw new RuntimeException("x out of bounds: " + x);
 		}
@@ -21,9 +25,11 @@ public class AtlasTile {
 		this.name = name;
 		this.x = x;
 		this.y = y;
+		this.sizeX = sizeX;
+		this.sizeY = sizeY;
 	}
 	
-	public static int getIndex(int x, int y) {
+	public static int getIndex(final int x, final int y) {
 		return (x & 0xFFFF) << 16 | (y & 0xFFFF);
 	}
 	
diff --git a/game/client/src/main/java/net/minecraft/client/render/customatlas/CustomAtlasHandler.java b/game/client/src/main/java/net/minecraft/client/render/customatlas/CustomAtlasHandler.java
index 098af7ceb..e587aacd1 100644
--- a/game/client/src/main/java/net/minecraft/client/render/customatlas/CustomAtlasHandler.java
+++ b/game/client/src/main/java/net/minecraft/client/render/customatlas/CustomAtlasHandler.java
@@ -16,72 +16,58 @@ import net.minecraft.client.render.texturepack.TexturePack;
 import net.minecraft.client.render.texturepack.TexturePackCustom;
 import net.minecraft.client.render.texturepack.TexturePackList;
 import net.minecraft.client.util.helper.Textures;
+import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 
 public class CustomAtlasHandler {
 	private static final Logger LOGGER = LogUtils.getLogger();
-	private static Atlas legacyTerrainAtlas = null;
-	private static Atlas legacyItemsAtlas = null;
 	
 	public static Minecraft mc = Minecraft.getMinecraft();
-	private static Map<String, BufferedImage> textureOverrides = new HashMap<>();
-	
-	private static void loadLegacyTiles() {
-		if(legacyTerrainAtlas != null && legacyItemsAtlas != null) {
-			return;
-		}
-		
-		log("Loading legacy tiles");
+	private static final Map<String, BufferedImage> textureOverrides = new HashMap<>();
 
-		legacyTerrainAtlas = Atlas.read(CustomAtlasHandler.class.getResourceAsStream("/terrain.tiles"));
-		legacyItemsAtlas = Atlas.read(CustomAtlasHandler.class.getResourceAsStream("/items.tiles"));
-		
-		log(legacyTerrainAtlas.size() + " terrain tiles, " + legacyItemsAtlas.size() + " item tiles");
-	}
-	
 	public static void beforeRefreshTextures() {
 		textureOverrides.clear();
 		
-		List<TexturePack> texturePacks = mc.texturePackList.selectedPacks;
-		List<String> overrides = new ArrayList<>();
+		final List<TexturePack> texturePacks = mc.texturePackList.selectedPacks;
+		final List<String> overrides = new ArrayList<>();
 
-		log("Active Texture Packs: ");
+		log("Active Asset Packs: ");
 		for(int texturePackIndex=0; texturePackIndex < texturePacks.size(); texturePackIndex++) {
-			TexturePack texturePack = texturePacks.get(texturePackIndex);
+			final TexturePack texturePack = texturePacks.get(texturePackIndex);
 			log("  " + texturePack.manifest.getName());
 
 			if(texturePack.hasFile("/terrain.png")) {
 				log("    has terrain.png");
-				loadLegacyTiles();
-				loadAtlas(texturePack, legacyTerrainAtlas, "/terrain.png", "/assets/minecraft/textures/block/");
+				final Atlas atlas = Atlas.read(texturePack.hasFile("/terrain.tiles") ? texturePack.getResourceAsStream("/terrain.tiles") : CustomAtlasHandler.class.getResourceAsStream("/terrain.tiles"));
+				loadAtlas(texturePack, atlas, "/terrain.png", "/assets/minecraft/textures/block/");
 			}
 			
 			if(texturePack.hasFile("/gui/items.png")) {
 				log("    has items.png");
-				loadLegacyTiles();
-				loadAtlas(texturePack, legacyItemsAtlas, "/gui/items.png", "/assets/minecraft/textures/item/");
+				final Atlas atlas = Atlas.read(texturePack.hasFile("/items.tiles") ? texturePack.getResourceAsStream("/items.tiles") : CustomAtlasHandler.class.getResourceAsStream("/items.tiles"));
+				loadAtlas(texturePack, atlas, "/gui/items.png", "/assets/minecraft/textures/item/");
 			}
 			
-			List<String> namespaces = findEntries(texturePack, "/assets/", (s) -> s.endsWith("/"));
+			final List<String> namespaces = findEntries(texturePack, "/assets/", (s) -> s.endsWith("/"));
 			if(namespaces != null) {
 				for(int namespaceIndex=0; namespaceIndex < namespaces.size(); namespaceIndex++) {
-					String namespace = namespaces.get(namespaceIndex);
+					final String namespace = namespaces.get(namespaceIndex);
 					
 					log("    namespace: " + namespace);
 					
-					List<String> customBlockAtlases = findEntries(texturePack, namespace + "textures/block/", (s) -> s.endsWith(".tiles"));
+					final List<String> customBlockAtlases = findEntries(texturePack, namespace + "textures/block/", (s) -> s.endsWith(".tiles"));
 					if(customBlockAtlases != null) {
 						for(int i=0; i < customBlockAtlases.size(); i++) {
-							String customAtlasPath = customBlockAtlases.get(i);
+							final String customAtlasPath = customBlockAtlases.get(i);
 							log("      found custom atlas: " + customAtlasPath);
 							loadAtlas(texturePack, Atlas.read(texturePack.getResourceAsStream(customAtlasPath)), customAtlasPath.replace(".tiles", ".png"), namespace + "textures/block/");
 						}
 					}
 					
-					List<String> customItemAtlases = findEntries(texturePack, namespace + "textures/item/", (s) -> s.endsWith(".tiles"));
+					final List<String> customItemAtlases = findEntries(texturePack, namespace + "textures/item/", (s) -> s.endsWith(".tiles"));
 					if(customItemAtlases != null) {
 						for(int i=0; i < customItemAtlases.size(); i++) {
-							String customAtlasPath = customItemAtlases.get(i);
+							final String customAtlasPath = customItemAtlases.get(i);
 							log("      found custom atlas: " + customAtlasPath);
 							loadAtlas(texturePack, Atlas.read(texturePack.getResourceAsStream(customAtlasPath)), customAtlasPath.replace(".tiles", ".png"), namespace + "textures/item/");
 						}
@@ -93,7 +79,7 @@ public class CustomAtlasHandler {
 			overrides.clear();
 			overrides.addAll(textureOverrides.keySet());
 			for(int i=0; i < overrides.size(); i++) {
-				String override = overrides.get(i);
+				final String override = overrides.get(i);
 				if(texturePack.hasFile(override)) {
 					textureOverrides.remove(override);
 				}
@@ -101,49 +87,49 @@ public class CustomAtlasHandler {
 		}
 	}
 	
-	public static void loadAtlas(TexturePack texturePack, Atlas atlas, String atlasTexturePath, String pathPrefix) {
+	public static void loadAtlas(final @NotNull TexturePack texturePack, @NotNull final Atlas atlas, @NotNull final String atlasTexturePath, @NotNull final String pathPrefix) {
 		if(atlas.width <= 0 || atlas.height <= 0) {
 			throw new IllegalArgumentException("Invalid atlas size: " + atlas.width + "x" + atlas.height);
 		}
 		
-		BufferedImage image = Textures.readImage(texturePack.getResourceAsStream(atlasTexturePath));
+		final BufferedImage image = Textures.readImage(texturePack.getResourceAsStream(atlasTexturePath));
 		if(image == null) {
 			throw new RuntimeException("Atlas image does not exist: " + atlasTexturePath);
 		}
 		
-		int tileWidth = image.getWidth() / atlas.width;
-		int tileHeight = image.getHeight() / atlas.height;
+		final int tileWidth = image.getWidth() / atlas.width;
+		final int tileHeight = image.getHeight() / atlas.height;
 		
-		List<AtlasTile> atlasTiles = atlas.tileList;
+		final List<AtlasTile> atlasTiles = atlas.tileList;
 		for(int tileIndex = 0; tileIndex < atlasTiles.size(); tileIndex++) {
-			AtlasTile atlasTile = atlasTiles.get(tileIndex);
+			final AtlasTile atlasTile = atlasTiles.get(tileIndex);
 			
-			BufferedImage tileImage = image.getSubimage(tileWidth * atlasTile.x, tileHeight * atlasTile.y, tileWidth, tileHeight);
+			final BufferedImage tileImage = image.getSubimage(tileWidth * atlasTile.x, tileHeight * atlasTile.y, tileWidth * atlasTile.sizeX, tileHeight * atlasTile.sizeY);
 
-			String path = pathPrefix + atlasTile.name + ".png";
+			final String path = pathPrefix + atlasTile.name + ".png";
 			textureOverrides.put(path, tileImage);
 		}
 	}
 	
-	public static List<String> findEntries(TexturePack texturePack, String path, Filter filter) {
+	public static List<String> findEntries(final TexturePack texturePack, String path, final Filter filter) {
 		if(!path.startsWith("/")) {
 			throw new IllegalArgumentException(path);
 		}
 		
 		if(texturePack instanceof TexturePackCustom) {
-			TexturePackCustom texturePackCustom = (TexturePackCustom) texturePack;
+			final TexturePackCustom texturePackCustom = (TexturePackCustom) texturePack;
 			
 			if(texturePackCustom.file.isDirectory()) {
-				List<String> result = new ArrayList<>();
+				final List<String> result = new ArrayList<>();
 				
-				File searchDirectory = new File(texturePackCustom.file, path.substring(1));
-				File[] files = searchDirectory.listFiles();
+				final File searchDirectory = new File(texturePackCustom.file, path.substring(1));
+				final File[] files = searchDirectory.listFiles();
 				if(files == null) {
 					return null;
 				}
 				
 				for(int i=0; i < files.length; i++) {
-					File file = files[i];
+					final File file = files[i];
 					String relativePath = files[i].getAbsolutePath().substring(texturePackCustom.file.getAbsolutePath().length());
 					relativePath = relativePath.replace('\\', '/');
 					if(file.isDirectory()) {
@@ -158,13 +144,13 @@ public class CustomAtlasHandler {
 			if(texturePackCustom.file.isFile()) {
 				path = path.substring(1);
 				
-				List<String> result = new ArrayList<>();
+				final List<String> result = new ArrayList<>();
 				
 				ZipFile zipFile = null;
 				try {
 					zipFile = new ZipFile(texturePackCustom.file);
 					
-					Enumeration<? extends ZipEntry> entries = zipFile.entries();
+					final Enumeration<? extends ZipEntry> entries = zipFile.entries();
 					while(entries.hasMoreElements()) {
 						String entry = entries.nextElement().toString();
 						if(!entry.startsWith(path)) {
@@ -186,12 +172,12 @@ public class CustomAtlasHandler {
 							result.add(entry);
 						}
 					}
-				}catch (Exception e) {
+				}catch (final Exception e) {
 					throw new RuntimeException(e);
 				}finally {
 					try {
 						zipFile.close();
-					}catch (Exception e) {}
+					}catch (final Exception e) {}
 				}
 				return result;
 			}
@@ -200,17 +186,17 @@ public class CustomAtlasHandler {
 		return null;
 	}
 	
-	public static BufferedImage getTextureOverride(TexturePackList texturePackList, String path) {
+	public static BufferedImage getTextureOverride(final TexturePackList texturePackList, final String path) {
 		return textureOverrides.get(path);
 	}
 	
-	public static void log(String str) {
+	public static void log(final String str) {
 		LOGGER.info(str);
 	}
 	
-	static interface Filter {
+	interface Filter {
 		
-		public boolean accept(String string);
+		boolean accept(String string);
 		
 	}
 	
diff --git a/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/AtlasStitcher.java b/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/AtlasStitcher.java
index 7caf870bd..2a4977d1e 100644
--- a/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/AtlasStitcher.java
+++ b/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/AtlasStitcher.java
@@ -3,6 +3,7 @@ package net.minecraft.client.render.texture.stitcher;
 import java.awt.AlphaComposite;
 import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
+import java.io.File;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collections;
diff --git a/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/TextureRegistry.java b/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/TextureRegistry.java
index 58c39dfbb..442f0444d 100644
--- a/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/TextureRegistry.java
+++ b/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/TextureRegistry.java
@@ -3,11 +3,15 @@ package net.minecraft.client.render.texture.stitcher;
 
 
 import com.mojang.logging.LogUtils;
+import net.minecraft.core.Global;
 import net.minecraft.core.util.HardIllegalArgumentException;
 import net.minecraft.core.util.collection.NamespaceID;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -16,11 +20,17 @@ import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Stream;
 
@@ -162,4 +172,37 @@ public class TextureRegistry {
 
         return paths.toArray(new String[0]);
     }
+
+    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
+    private static final Map<String, String> atlasNameRemappings = new HashMap<>();
+    static {
+        atlasNameRemappings.put("block", "terrain");
+        atlasNameRemappings.put("item", "items");
+    }
+    public static void dumpTilesToFolder(final @NotNull File folder) {
+        for (final Map.Entry<String, AtlasStitcher> stitcherEntry : stitcherMap.entrySet()) {
+            try {
+                final AtlasStitcher stitcher = stitcherEntry.getValue();
+                final File tileFile = new File(folder, atlasNameRemappings.getOrDefault(stitcherEntry.getKey(), stitcherEntry.getKey()) + ".tiles");
+                tileFile.createNewFile();
+                try (final FileWriter writer = new FileWriter(tileFile)) {
+                    writer.append("# Auto generated tiles mapping for atlas '").append(stitcherEntry.getKey()).append("'\n");
+                    writer.append("# generated for version '").append(Global.VERSION).append("' at '").append(dateFormat.format(new Date())).append("'\n");
+                    writer.append("size=").append(Integer.toString(stitcher.atlas.getWidth())).append("x").append(Integer.toString(stitcher.atlas.getHeight())).append("\n");
+                    for (final Map.Entry<NamespaceID, IconCoordinate> entry : stitcher.textureMap.entrySet()) {
+                        final IconCoordinate coordinate = entry.getValue();
+                        writer.append(Integer.toString(coordinate.iconX)).append(",").append(Integer.toString(coordinate.iconY));
+                        writer.append("=");
+                        writer.append(entry.getKey().value);
+                        writer.append(" <").append(Integer.toString(coordinate.width)).append(",").append(Integer.toString(coordinate.height)).append(">");
+                        writer.append("\n");
+                    }
+                } catch (final IOException e) {
+                    LOGGER.error("Failed to write tile map to file '{}'!", tileFile.getPath(), e);
+                }
+            } catch (final IOException e) {
+                LOGGER.error("Failed to create tile map for atlas '{}'!", stitcherEntry.getKey(), e);
+            }
+        }
+    }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/sound/NamedSoundRepository.java b/game/client/src/main/java/net/minecraft/client/sound/NamedSoundRepository.java
index f52b78d88..401c47fe8 100644
--- a/game/client/src/main/java/net/minecraft/client/sound/NamedSoundRepository.java
+++ b/game/client/src/main/java/net/minecraft/client/sound/NamedSoundRepository.java
@@ -23,7 +23,7 @@ import java.util.Map;
 public class NamedSoundRepository extends Registry<SoundEvent> {
     public static final String JAR_SOUNDS_LOCATION_FORMAT = "/assets/%s/sounds/";
     public static final String FOLDER_SOUNDS_LOCATION_FORMAT = "/resources/%s/sounds/";
-    public static final String TEXTURE_PACK_FOLDER_SOUNDS_LOCATION_FORMAT = "/packResources/%s/sounds/";
+    public static final String ASSET_PACK_FOLDER_SOUNDS_LOCATION_FORMAT = "/packResources/%s/sounds/";
 
     public final String namespace;
     public final File rootFile;
@@ -45,7 +45,7 @@ public class NamedSoundRepository extends Registry<SoundEvent> {
             loadFromPack(path, p, eventMap, thrown);
         }
 
-        File outRoot = new File(SoundRepository.mc.getMinecraftDir(), String.format(TEXTURE_PACK_FOLDER_SOUNDS_LOCATION_FORMAT, namespace));
+        File outRoot = new File(SoundRepository.mc.getMinecraftDir(), String.format(ASSET_PACK_FOLDER_SOUNDS_LOCATION_FORMAT, namespace));
         outRoot.mkdirs();
         for (Map.Entry<String, SoundEvent> e : eventMap.entrySet()) {
 
diff --git a/game/client/src/main/java/net/minecraft/client/util/helper/Textures.java b/game/client/src/main/java/net/minecraft/client/util/helper/Textures.java
index 1cfa4db2a..0772c6fcf 100644
--- a/game/client/src/main/java/net/minecraft/client/util/helper/Textures.java
+++ b/game/client/src/main/java/net/minecraft/client/util/helper/Textures.java
@@ -17,6 +17,8 @@ import java.util.List;
 import javax.imageio.ImageIO;
 
 import com.mojang.logging.LogUtils;
+import net.minecraft.client.render.texture.stitcher.AtlasStitcher;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.util.helper.Buffer;
 import org.lwjgl.opengl.GL12;
 
@@ -162,6 +164,8 @@ public class Textures {
 			}
 		}
 
+		TextureRegistry.dumpTilesToFolder(folder);
+
         LOGGER.info("Dumped textures into {}", folder.getAbsolutePath());
 		OpenGLHelper.checkError("texture dump");
 	}
diff --git a/game/client/src/main/resources/manifest-schema.json b/game/client/src/main/resources/manifest-schema.json
index e87c21e67..81a730a77 100644
--- a/game/client/src/main/resources/manifest-schema.json
+++ b/game/client/src/main/resources/manifest-schema.json
@@ -1,34 +1,34 @@
 {
     "$schema": "https://json-schema.org/draft/2020-12/schema",
     "$id": "manifest-schema.json",
-    "title": "BTA Texture Pack Manifest",
-    "description": "The manifest for a BTA texture pack.",
+    "title": "BTA Asset Pack Manifest",
+    "description": "The manifest for a BTA asset pack.",
     "type": "object",
     "additionalProperties": false,
     "properties": {
         "description": {
-            "description": "Fields that describe the texture pack.",
+            "description": "Fields that describe the asset pack.",
             "type": "object",
             "additionalProperties": false,
             "properties": {
                 "name": {
-                    "description": "The name of the texture pack.",
+                    "description": "The name of the asset pack.",
                     "type": "string"
                 },
                 "line1": {
-                    "description": "The first line of the texture pack description.",
+                    "description": "The first line of the asset pack description.",
                     "type": "string"
                 },
                 "line2": {
-                    "description": "The second line of the texture pack description.",
+                    "description": "The second line of the asset pack description.",
                     "type": "string"
                 },
                 "packVersion": {
-                    "description": "The version of the texture pack.",
+                    "description": "The version of the asset pack.",
                     "type": "string"
                 },
                 "format": {
-                    "description": "The format of the texture pack.",
+                    "description": "The format of the asset pack.",
                     "type": "number"
                 },
                 "numBackgrounds": {
@@ -41,21 +41,6 @@
                 "packVersion",
                 "format"
             ]
-        },
-        "variants": {
-            "description": "The mob skin variants the pack provides.",
-            "type": "object",
-            "additionalProperties": {
-                "description": "The variants for a given entity.",
-                "type": "object",
-                "additionalProperties": false,
-                "properties": {
-                    "numSkins": {
-                        "description": "The number of skins the entity has.",
-                        "type": "number"
-                    }
-                }
-            }
         }
     },
     "required": [
diff --git a/game/core/build.gradle.kts b/game/core/build.gradle.kts
index 3b8b424c3..f764ce40f 100644
--- a/game/core/build.gradle.kts
+++ b/game/core/build.gradle.kts
@@ -6,7 +6,7 @@ plugins {
 
 group = providers.gradleProperty("bta.group").get()
 version = providers.gradleProperty("bta.version").get()
-val texturePackFormat = providers.gradleProperty("bta.texturePackFormat").get()
+val assetPackFormat = providers.gradleProperty("bta.assetPackFormat").get()
 val buildChannel = providers.gradleProperty("bta.buildChannel").get()
 val mpProtocolVersion = providers.gradleProperty("bta.mpProtocolVersion").get()
 
@@ -61,7 +61,7 @@ val versionGenerator by tasks.registering {
                     public final class Version {
                         public static final String VERSION = "$version";
                         public static final long BUILD_TIME = ${Date().time}L;
-                        public static final int TEXTURE_PACK_FORMAT = $texturePackFormat;
+                        public static final int ASSET_PACK_FORMAT = $assetPackFormat;
                         public static final BuildChannel BUILD_CHANNEL = $buildChannel;
                         public static final int MP_PROTOCOL_VERSION = $mpProtocolVersion;
                     }
diff --git a/game/core/src/main/java/net/minecraft/core/Global.java b/game/core/src/main/java/net/minecraft/core/Global.java
index 967f056e9..7223bf108 100644
--- a/game/core/src/main/java/net/minecraft/core/Global.java
+++ b/game/core/src/main/java/net/minecraft/core/Global.java
@@ -11,7 +11,7 @@ public class Global
 	public static final int CURRENT_CHUNK_VERSION = 2;
 	public static boolean isServer = false;
 	public static final boolean DISABLE_OLD_WORLDS = false;
-	public static final int TEXTURE_PACK_FORMAT = Version.TEXTURE_PACK_FORMAT;
+	public static final int ASSET_PACK_FORMAT = Version.ASSET_PACK_FORMAT;
 	public static final boolean NET_DEBUG = false;
 	public static final boolean ASSERTIONS_ENABLED;
 	static {
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogic.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogic.java
index b617efc66..dded8a700 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogic.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogic.java
@@ -95,12 +95,12 @@ public class BlockLogic implements BlockInterface, IItemConvertible {
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity) {
+    public ItemStack @Nullable [] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity) {
         return getBreakResult(world, dropCause, meta, tileEntity);
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int meta, TileEntity tileEntity) {
+    public ItemStack @Nullable [] getBreakResult(World world, EnumDropCause dropCause, int meta, TileEntity tileEntity) {
         if (dropCause != EnumDropCause.IMPROPER_TOOL) {
             return new ItemStack[] { new ItemStack(block) };
         }
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicCobble.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicCobble.java
index 11fed0797..012ffb43f 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicCobble.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicCobble.java
@@ -5,23 +5,25 @@ import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.IItemConvertible;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.function.Supplier;
 
 public class BlockLogicCobble extends BlockLogic {
-    private final @Nullable Supplier<IItemConvertible> crushDrop;
-    public BlockLogicCobble(Block<?> block, Material material, @Nullable Supplier<IItemConvertible> crushResult) {
+    private final @Nullable Supplier<? extends IItemConvertible> crushDrop;
+    public BlockLogicCobble(final Block<?> block, final Material material, final @Nullable Supplier<? extends IItemConvertible> crushResult) {
         super(block, material);
         this.crushDrop = crushResult;
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int meta, TileEntity tileEntity) {
-        if (crushDrop != null && dropCause == EnumDropCause.PISTON_CRUSH) {
-            return new ItemStack[] {new ItemStack(crushDrop.get())};
+    public ItemStack @Nullable [] getBreakResult(final World world, final EnumDropCause dropCause, final int meta, final TileEntity tileEntity) {
+        if (this.crushDrop != null && dropCause == EnumDropCause.PISTON_CRUSH) {
+            return new ItemStack[] {new ItemStack(this.crushDrop.get())};
         }
+        
         return super.getBreakResult(world, dropCause, meta, tileEntity);
     }
 }
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicSlab.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicSlab.java
index 9a4983b1d..d7bcbc3b0 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicSlab.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicSlab.java
@@ -16,6 +16,7 @@ import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
@@ -87,9 +88,9 @@ public class BlockLogicSlab extends BlockLogic
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack @Nullable [] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
     {
-        ItemStack[] result = modelBlock.getBreakResult(world, dropCause, x, y, z, modelBlockMetadata, tileEntity);
+        final ItemStack @Nullable [] result = dropCause != EnumDropCause.IMPROPER_TOOL ? new ItemStack[] { new ItemStack(this.block) } : null;
 
         if (result != null)
         {
@@ -111,7 +112,7 @@ public class BlockLogicSlab extends BlockLogic
     @Override
     public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int meta, TileEntity tileEntity)
     {
-        ItemStack[] result = modelBlock.getBreakResult(world, dropCause, modelBlockMetadata, tileEntity);
+        final ItemStack @Nullable [] result = dropCause != EnumDropCause.IMPROPER_TOOL ? new ItemStack[] { new ItemStack(this.block) } : null;
 
         if (result != null)
         {
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicStairs.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicStairs.java
index 32974dc56..a8d6700db 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicStairs.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicStairs.java
@@ -18,6 +18,7 @@ import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class BlockLogicStairs extends BlockLogic
 {
@@ -149,9 +150,9 @@ public class BlockLogicStairs extends BlockLogic
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
+    public ItemStack @Nullable [] getBreakResult(World world, EnumDropCause dropCause, int x, int y, int z, int meta, TileEntity tileEntity)
     {
-        ItemStack[] result = modelBlock.getBreakResult(world, dropCause, x, y, z, 0, tileEntity);
+        final ItemStack @Nullable [] result = dropCause != EnumDropCause.IMPROPER_TOOL ? new ItemStack[] { new ItemStack(this.block) } : null;
 
         if (result != null)
         {
@@ -169,9 +170,9 @@ public class BlockLogicStairs extends BlockLogic
     }
 
     @Override
-    public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int meta, TileEntity tileEntity)
+    public ItemStack @Nullable [] getBreakResult(World world, EnumDropCause dropCause, int meta, TileEntity tileEntity)
     {
-        ItemStack[] result = modelBlock.getBreakResult(world, dropCause, 0, tileEntity);
+        final ItemStack @Nullable [] result = dropCause != EnumDropCause.IMPROPER_TOOL ? new ItemStack[] { new ItemStack(this.block) } : null;
 
         if (result != null)
         {
diff --git a/game/core/src/main/resources/lang/en_US/gui.lang b/game/core/src/main/resources/lang/en_US/gui.lang
index bc079d09f..bd3abd0ba 100644
--- a/game/core/src/main/resources/lang/en_US/gui.lang
+++ b/game/core/src/main/resources/lang/en_US/gui.lang
@@ -160,7 +160,7 @@ gui.main_menu.label.downloading_resources=Downloading resources: %s / %s
 gui.main_menu.button.singleplayer=Singleplayer
 gui.main_menu.button.multiplayer=Multiplayer
 gui.main_menu.button.multiplayer.disabled=Multiplayer (not ready yet!)
-gui.main_menu.button.texture_packs=Texture Packs
+gui.main_menu.button.asset_packs=Asset Packs
 gui.main_menu.button.options=Options...
 gui.main_menu.button.quit_game=Quit Game
 gui.main_menu.button.discord=Discord
@@ -218,15 +218,15 @@ gui.options.page.controls.category.hotbar=Hotbar
 gui.options.page.controls.category.view=View
 gui.options.page.controls.category.miscellaneous=Miscellaneous
 
-gui.options.page.texture_packs.title=Texture Packs
-gui.options.page.texture_packs.category.textures=Textures
-gui.options.page.texture_packs.category.texture_packs.available=Available Texture Packs
-gui.options.page.texture_packs.category.texture_packs.selected=Selected Texture Packs
-gui.options.page.texture_packs.button.open_folder=Open Folder
-gui.options.page.texture_packs.button.apply=Apply Texture Packs
-gui.options.page.texture_packs.label.no_packs=No texture packs found :(
-gui.options.page.texture_packs.label.outdated_pack.1=Outdated pack!
-gui.options.page.texture_packs.label.outdated_pack.2=This pack was not made for this version of BTA!
+gui.options.page.asset_packs.title=Asset Packs
+gui.options.page.asset_packs.category.textures=Textures
+gui.options.page.asset_packs.category.asset_packs.available=Available Asset Packs
+gui.options.page.asset_packs.category.asset_packs.selected=Selected Asset Packs
+gui.options.page.asset_packs.button.open_folder=Open Folder
+gui.options.page.asset_packs.button.apply=Apply Asset Packs
+gui.options.page.asset_packs.label.no_packs=No asset packs found :(
+gui.options.page.asset_packs.label.outdated_pack.1=Outdated pack!
+gui.options.page.asset_packs.label.outdated_pack.2=This pack was not made for this version of BTA!
 
 gui.options.page.language_packs.title=Language Packs
 gui.options.page.language_packs.category.language_packs=Language Packs
diff --git a/gradle.properties b/gradle.properties
index 034fc56a7..b81e4aeec 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -4,7 +4,7 @@ org.gradle.caching = true
 
 bta.group = net.minecraft
 bta.version = 7.4
-bta.texturePackFormat = 4
+bta.assetPackFormat = 4
 bta.buildChannel = BuildChannel.DEVELOPMENT
 
 # Protocol version scheme:
