diff --git a/build.gradle.kts b/build.gradle.kts
index 51df363c5..39f707195 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -10,7 +10,7 @@ plugins {
 }
 
 group = "net.minecraft"
-version = "7.2 Prerelease 2"
+version = "7.2"
 val buildChannel = "PRERELEASE"
 
 run {
diff --git a/src/main/java/net/minecraft/client/gui/GuiSelectWorld.java b/src/main/java/net/minecraft/client/gui/GuiSelectWorld.java
index 370b6e522..11037f723 100644
--- a/src/main/java/net/minecraft/client/gui/GuiSelectWorld.java
+++ b/src/main/java/net/minecraft/client/gui/GuiSelectWorld.java
@@ -64,6 +64,7 @@ public class GuiSelectWorld extends GuiScreen
 
     @Override
     public void keyTyped(char c, int key, int mouseX, int mouseY) {
+        super.keyTyped(c, key, mouseX, mouseY);
         if (key == Keyboard.KEY_UP) {
             if (selectedWorld > 0) {
                 worldSlotContainer.selectItem(selectedWorld - 1, false);
diff --git a/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java b/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java
index 39dea97c6..b2b4c7d43 100644
--- a/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java
+++ b/src/main/java/net/minecraft/client/gui/popup/MessageBoxComponent.java
@@ -9,6 +9,7 @@ import org.lwjgl.input.Mouse;
 import org.lwjgl.opengl.GL11;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 public class MessageBoxComponent
@@ -34,35 +35,55 @@ public class MessageBoxComponent
         this.minecraft = Minecraft.getMinecraft(this);
         this.height = height;
 
-        String currentFormat = TextFormatting.WHITE.toString();
-
-        String[] newlines = text.split("\\n",Integer.MAX_VALUE);
-
-        List<String> split = new ArrayList<>();
+        setupText(text, chars);
+    }
 
-        for (String newline : newlines) {
-            if(newline.isEmpty()){
-                split.add("");
-                continue;
-            }
-            String nextFormat = currentFormat;
-            int start = 0;
-            while (start < newline.length()) {
-                String s = newline.substring(start, Math.min(newline.length(), start + chars));
-                char[] charArray = s.toCharArray();
-                for (int i = 0; i < charArray.length; i++) {
-                    char c = charArray[i];
-                    if (c == '\247' && i + 1 < s.length()) {
-                        nextFormat = "§"+charArray[i+1];
+    private void setupText(String text, int chars) {
+        lines.clear();
+
+        String[] newlines = text.split("\\n");
+        List<String> completeSplit = new ArrayList<>();
+        ArrayList<String> newlineSplit = new ArrayList<>(Arrays.asList(newlines));
+
+        String lastFormat = "";
+
+        for (String s : newlineSplit) {
+            String[] words = s.split(" ");
+            StringBuilder line = new StringBuilder();
+            line.append(lastFormat);
+            String currentFormat = lastFormat;
+            boolean formatChanged = false;
+            for (int i = 0; i < words.length; i++) {
+                String word = words[i];
+                if (word.contains("§")) {
+                    if (word.indexOf('§') < word.length() - 1) {
+                        String format = String.valueOf(word.charAt(word.indexOf('§') + 1));
+                        if (format.matches("[0123456789abcdefklmnor]")) {
+                            currentFormat = "§" + format;
+                            formatChanged = true;
+                        }
                     }
                 }
-                split.add(currentFormat+s);
-                start += chars;
-                currentFormat = nextFormat;
+                if (line.length() + 1 + word.length() < chars) {
+                    if(formatChanged) {
+                        line.append(lastFormat);
+                        formatChanged = false;
+                    }
+                    line.append(word).append(" ");
+                } else {
+                    completeSplit.add(line.toString());
+                    line = new StringBuilder();
+                    line.append(lastFormat);
+                    line.append(word).append(" ");
+                }
+                if(i == words.length - 1) {
+                    lastFormat = currentFormat;
+                }
             }
+            completeSplit.add(line.toString());
         }
 
-        lines.addAll(split);
+        lines.addAll(completeSplit);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/render/RenderEngine.java b/src/main/java/net/minecraft/client/render/RenderEngine.java
index 5deba908b..e9fed0614 100644
--- a/src/main/java/net/minecraft/client/render/RenderEngine.java
+++ b/src/main/java/net/minecraft/client/render/RenderEngine.java
@@ -9,6 +9,7 @@ import java.awt.image.BufferedImage;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -552,14 +553,16 @@ public class RenderEngine {
 	}
 
 	public void updateDynamicTextures() {
-		try {
-			for(DynamicTexture dynamicTexture : dynamicTextures) {
+        List<DynamicTexture> dynamics = new ArrayList<>(dynamicTextures);
+		for (DynamicTexture dynamicTexture : dynamics) {
+			try {
 				if (dynamicTexture.runUpdates()) {
 					updateDynamicTexture(dynamicTexture);
 				}
+			} catch(Exception e){
+				new RuntimeException("Exception while updating dynamic for '" + dynamicTexture.texture.namespaceId + "'. Removing from dynamic texture pool and skipping!", e).printStackTrace();
+				dynamicTextures.remove(dynamicTexture); // Remove broken texture
 			}
-		} catch (Exception e){
-			new RuntimeException("Exception while updating dynamic textures. Skipping!", e).printStackTrace();
 		}
 	}
 	
diff --git a/src/main/java/net/minecraft/client/render/stitcher/TextureRegistry.java b/src/main/java/net/minecraft/client/render/stitcher/TextureRegistry.java
index 9da6f97be..011fb256b 100644
--- a/src/main/java/net/minecraft/client/render/stitcher/TextureRegistry.java
+++ b/src/main/java/net/minecraft/client/render/stitcher/TextureRegistry.java
@@ -19,6 +19,7 @@ import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Objects;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.stream.Stream;
@@ -98,11 +99,18 @@ public class TextureRegistry {
         if (!directory.endsWith("/")) directory = directory + "/";
 
         String[] dirs = directory.split("/");
-        String currentDir = dirs[dirs.length - 1];
+        String currentDir = dirs[dirs.length - 1].replace("/", "");
 
         List<String> subDirectories = new ArrayList<>();
 
-        URI uri = TextureRegistry.class.getResource(directory).toURI();
+        URI uri;
+        try {
+            uri = Objects.requireNonNull(TextureRegistry.class.getResource(directory)).toURI();
+        } catch (NullPointerException npe) {
+            System.out.println("Failed to load directory '" + directory + "'! Skipping!");
+            return new String[0];
+        }
+
         Path myPath;
         FileSystem fileSystem = null;
         if (uri.getScheme().equals("jar")) {
@@ -119,7 +127,7 @@ public class TextureRegistry {
                 if (name.endsWith(".png")) {
                     paths.add(name);
                 }
-            } else if (searchSubDirectories && !name.equals(currentDir)) {
+            } else if (searchSubDirectories && !name.replace("/", "").equals(currentDir)) {
                 subDirectories.add(directory + name);
             }
         }
diff --git a/src/main/java/net/minecraft/core/Global.java b/src/main/java/net/minecraft/core/Global.java
index 388d1dde2..6016c6a89 100644
--- a/src/main/java/net/minecraft/core/Global.java
+++ b/src/main/java/net/minecraft/core/Global.java
@@ -22,5 +22,5 @@ public class Global
 	// 4th nibble: Prerelease version or patch version
 	// For example, 7.1_01 would be encoded as 0x7101
 	// 7.1 prerelease 1 would be encoded as 0x7111
-	public static final int MP_PROTOCOL_VERSION = 0x7211;
+	public static final int MP_PROTOCOL_VERSION = 0x7200;
 }
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntityMeshGold.java b/src/main/java/net/minecraft/core/block/entity/TileEntityMeshGold.java
index 67a716780..a071b3cc1 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntityMeshGold.java
+++ b/src/main/java/net/minecraft/core/block/entity/TileEntityMeshGold.java
@@ -22,11 +22,14 @@ public class TileEntityMeshGold extends TileEntity{
         ticksRan++;
     }
     public boolean setFilterItem(EntityPlayer player, @Nullable ItemStack stack){
-        boolean flag = false;
+        boolean success = false;
         boolean wasNull = filterItem == null;
         if (filterItem != null && player.getGamemode().consumeBlocks()){
             player.inventory.insertItem(filterItem, true);
-            flag = true;
+            if (filterItem.stackSize > 0) {
+                player.dropPlayerItem(filterItem);
+            }
+            success = true;
         }
         if (stack != null) {
             stack.consumeItem(player);
@@ -34,7 +37,7 @@ public class TileEntityMeshGold extends TileEntity{
             return true;
         }
         filterItem = null;
-        return flag | !wasNull;
+        return success | !wasNull;
     }
     @Override
     public void readFromNBT(CompoundTag compoundTag)
diff --git a/src/main/java/net/minecraft/core/data/registry/recipe/RecipeSymbol.java b/src/main/java/net/minecraft/core/data/registry/recipe/RecipeSymbol.java
index 9198cde37..a6e35927b 100644
--- a/src/main/java/net/minecraft/core/data/registry/recipe/RecipeSymbol.java
+++ b/src/main/java/net/minecraft/core/data/registry/recipe/RecipeSymbol.java
@@ -157,17 +157,16 @@ public class RecipeSymbol {
     public boolean matches(ItemStack stack){
         if(stack == null) return false;
         List<ItemStack> stacks = resolve();
-        boolean foundId = false;
-        boolean foundMeta = false;
+        boolean found = false;
         for (ItemStack resolvedStack : stacks) {
-            if(resolvedStack.itemID == stack.itemID){
-                foundId = true;
-            }
-            if(resolvedStack.getMetadata() == -1 || resolvedStack.getMetadata() == stack.getMetadata()){
-                foundMeta = true;
+            boolean foundId = resolvedStack.itemID == stack.itemID;
+            boolean foundMeta = resolvedStack.getMetadata() == -1 || resolvedStack.getMetadata() == stack.getMetadata();
+            if (foundId && foundMeta) {
+                found = true;
+                break;
             }
         }
-        return foundId && foundMeta;
+        return found;
     }
 
     public char getSymbol() {
diff --git a/src/main/java/net/minecraft/core/entity/EntityPainting.java b/src/main/java/net/minecraft/core/entity/EntityPainting.java
index dc866ae63..4f21e75d5 100644
--- a/src/main/java/net/minecraft/core/entity/EntityPainting.java
+++ b/src/main/java/net/minecraft/core/entity/EntityPainting.java
@@ -299,28 +299,31 @@ public class EntityPainting extends Entity
     }
 
     @Override
-    public boolean interact(EntityPlayer entityplayer) {
-        if (entityplayer.getHeldItem() != null){
-            ItemStack stack = entityplayer.getHeldItem();
+    public boolean interact(EntityPlayer player) {
+        if (player.getHeldItem() != null){
+            ItemStack stack = player.getHeldItem();
             ItemStack paintingStack = getBorderStack();
             if (getBorder(stack) == null) return false;
             setStack(new ItemStack(stack.getItem(), 1, stack.getMetadata()));
-            stack.consumeItem(entityplayer);
+            stack.consumeItem(player);
             if (stack.stackSize <= 0) {
-                entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, null);
+                player.inventory.setInventorySlotContents(player.inventory.currentItem, null);
             }
-            if (paintingStack != null && entityplayer.getGamemode().consumeBlocks()){
-                entityplayer.inventory.insertItem(paintingStack, true);
+            if (paintingStack != null && player.getGamemode().consumeBlocks()){
+                player.inventory.insertItem(paintingStack, true);
+                if (paintingStack.stackSize > 0) {
+                    player.dropPlayerItem(paintingStack);
+                }
             }
             return true;
         } else if (getBorderStack() != null){
-            if (entityplayer.getGamemode().consumeBlocks()){
-                entityplayer.inventory.insertItem(getBorderStack(), true);
+            if (player.getGamemode().consumeBlocks()){
+                player.inventory.insertItem(getBorderStack(), true);
             }
             setStack(null);
             return true;
         }
-        return super.interact(entityplayer);
+        return super.interact(player);
     }
 
     public ItemStack getBorderStack() {
diff --git a/src/main/java/net/minecraft/core/world/save/SaveFile.java b/src/main/java/net/minecraft/core/world/save/SaveFile.java
index ed839b6c3..7ca8f2768 100644
--- a/src/main/java/net/minecraft/core/world/save/SaveFile.java
+++ b/src/main/java/net/minecraft/core/world/save/SaveFile.java
@@ -19,7 +19,7 @@ public class SaveFile
         this.levelData = levelData;
         this.dimensionData = Objects.requireNonNull(dimensionData);
 
-        this.corrupted = levelData == null || dimensionData[0] == null;
+        this.corrupted = levelData == null || (!needsConversion && dimensionData[0] == null);
     }
 
     public String getFileName()
diff --git a/src/main/resources/bg/8210.png_0.png b/src/main/resources/bg/8210.png_0.png
new file mode 100644
index 000000000..9f9db4cff
Binary files /dev/null and b/src/main/resources/bg/8210.png_0.png differ
diff --git a/src/main/resources/bg/adamng_0.png b/src/main/resources/bg/adamng_0.png
new file mode 100644
index 000000000..9937cb3be
Binary files /dev/null and b/src/main/resources/bg/adamng_0.png differ
diff --git a/src/main/resources/bg/afelends_0.png b/src/main/resources/bg/afelends_0.png
new file mode 100644
index 000000000..1ef7a11a1
Binary files /dev/null and b/src/main/resources/bg/afelends_0.png differ
diff --git a/src/main/resources/bg/backgrounds.json b/src/main/resources/bg/backgrounds.json
index a1399ccc0..3891f9ad0 100644
--- a/src/main/resources/bg/backgrounds.json
+++ b/src/main/resources/bg/backgrounds.json
@@ -1,11 +1,35 @@
 {
 	"replace": false,
 	"backgrounds": [
-		"bg0",
-		"bg1",
-		"bg2",
-		"bg3",
-		"bg4",
-		"bg5"
+		"tess_o_0",
+		"thaboar_0",
+		"thaboar_1",
+		"koomah_0",
+		"clyran_0",
+		"clyran_1",
+		"adamng_0",
+		"brotado_0",
+		"damian_0",
+		"p0k_3_0",
+		"itsifox_0",
+		"funnelton_0",
+		"afelends_0",
+		"thekingofnachos_tm_0",
+		"thekingofnachos_tm_1",
+		"gravelcap_0",
+		"sr.kitty_0",
+		"watermelonmojito_0",
+		"cloud54_0",
+		"umbrellamanray_0",
+		"seapickle_0",
+		"thaboar_2",
+		"itsifox_1",
+		"mzov_0",
+		"kiwind_0",
+		"t3ssed_0",
+		"brokendoop_0",
+		"brokendoop_1",
+		"8210.png_0",
+		"prismary_0"
 	]
 }
\ No newline at end of file
diff --git a/src/main/resources/bg/brokendoop_0.png b/src/main/resources/bg/brokendoop_0.png
new file mode 100644
index 000000000..f3674a38a
Binary files /dev/null and b/src/main/resources/bg/brokendoop_0.png differ
diff --git a/src/main/resources/bg/brokendoop_1.png b/src/main/resources/bg/brokendoop_1.png
new file mode 100644
index 000000000..6367996d2
Binary files /dev/null and b/src/main/resources/bg/brokendoop_1.png differ
diff --git a/src/main/resources/bg/brotado_0.png b/src/main/resources/bg/brotado_0.png
new file mode 100644
index 000000000..b3ec3cbad
Binary files /dev/null and b/src/main/resources/bg/brotado_0.png differ
diff --git a/src/main/resources/bg/cloud54_0.png b/src/main/resources/bg/cloud54_0.png
new file mode 100644
index 000000000..3d5d8b8ac
Binary files /dev/null and b/src/main/resources/bg/cloud54_0.png differ
diff --git a/src/main/resources/bg/bg4.png b/src/main/resources/bg/clyran_0.png
similarity index 100%
rename from src/main/resources/bg/bg4.png
rename to src/main/resources/bg/clyran_0.png
diff --git a/src/main/resources/bg/bg5.png b/src/main/resources/bg/clyran_1.png
similarity index 100%
rename from src/main/resources/bg/bg5.png
rename to src/main/resources/bg/clyran_1.png
diff --git a/src/main/resources/bg/credits.txt b/src/main/resources/bg/credits.txt
deleted file mode 100644
index 991eb141d..000000000
--- a/src/main/resources/bg/credits.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-bg0.png - @tess_o
-bg1.png - @thaboar
-bg2.png - @thaboar
-bg3.png - @koomah
-bg4.png - @clyran
-bg5.png - @clyran
\ No newline at end of file
diff --git a/src/main/resources/bg/damian_0.png b/src/main/resources/bg/damian_0.png
new file mode 100644
index 000000000..7ce9bc1a3
Binary files /dev/null and b/src/main/resources/bg/damian_0.png differ
diff --git a/src/main/resources/bg/funnelton_0.png b/src/main/resources/bg/funnelton_0.png
new file mode 100644
index 000000000..66634819b
Binary files /dev/null and b/src/main/resources/bg/funnelton_0.png differ
diff --git a/src/main/resources/bg/gravelcap_0.png b/src/main/resources/bg/gravelcap_0.png
new file mode 100644
index 000000000..ba3e6b61c
Binary files /dev/null and b/src/main/resources/bg/gravelcap_0.png differ
diff --git a/src/main/resources/bg/itsifox_0.png b/src/main/resources/bg/itsifox_0.png
new file mode 100644
index 000000000..ae2f9372d
Binary files /dev/null and b/src/main/resources/bg/itsifox_0.png differ
diff --git a/src/main/resources/bg/itsifox_1.png b/src/main/resources/bg/itsifox_1.png
new file mode 100644
index 000000000..249e80f5a
Binary files /dev/null and b/src/main/resources/bg/itsifox_1.png differ
diff --git a/src/main/resources/bg/kiwind_0.png b/src/main/resources/bg/kiwind_0.png
new file mode 100644
index 000000000..ea3075dc8
Binary files /dev/null and b/src/main/resources/bg/kiwind_0.png differ
diff --git a/src/main/resources/bg/bg3.png b/src/main/resources/bg/koomah_0.png
similarity index 100%
rename from src/main/resources/bg/bg3.png
rename to src/main/resources/bg/koomah_0.png
diff --git a/src/main/resources/bg/mzov_0.png b/src/main/resources/bg/mzov_0.png
new file mode 100644
index 000000000..4b05f3e2d
Binary files /dev/null and b/src/main/resources/bg/mzov_0.png differ
diff --git a/src/main/resources/bg/p0k_3_0.png b/src/main/resources/bg/p0k_3_0.png
new file mode 100644
index 000000000..9acba24ae
Binary files /dev/null and b/src/main/resources/bg/p0k_3_0.png differ
diff --git a/src/main/resources/bg/prismary_0.png b/src/main/resources/bg/prismary_0.png
new file mode 100644
index 000000000..38f0191da
Binary files /dev/null and b/src/main/resources/bg/prismary_0.png differ
diff --git a/src/main/resources/bg/seapickle_0.png b/src/main/resources/bg/seapickle_0.png
new file mode 100644
index 000000000..4bb78fc5e
Binary files /dev/null and b/src/main/resources/bg/seapickle_0.png differ
diff --git a/src/main/resources/bg/sr.kitty_0.png b/src/main/resources/bg/sr.kitty_0.png
new file mode 100644
index 000000000..06f1a17b0
Binary files /dev/null and b/src/main/resources/bg/sr.kitty_0.png differ
diff --git a/src/main/resources/bg/t3ssed_0.png b/src/main/resources/bg/t3ssed_0.png
new file mode 100644
index 000000000..3b5ae720d
Binary files /dev/null and b/src/main/resources/bg/t3ssed_0.png differ
diff --git a/src/main/resources/bg/bg0.png b/src/main/resources/bg/tess_o_0.png
similarity index 100%
rename from src/main/resources/bg/bg0.png
rename to src/main/resources/bg/tess_o_0.png
diff --git a/src/main/resources/bg/bg1.png b/src/main/resources/bg/thaboar_0.png
similarity index 100%
rename from src/main/resources/bg/bg1.png
rename to src/main/resources/bg/thaboar_0.png
diff --git a/src/main/resources/bg/bg2.png b/src/main/resources/bg/thaboar_1.png
similarity index 100%
rename from src/main/resources/bg/bg2.png
rename to src/main/resources/bg/thaboar_1.png
diff --git a/src/main/resources/bg/thaboar_2.png b/src/main/resources/bg/thaboar_2.png
new file mode 100644
index 000000000..d18c00421
Binary files /dev/null and b/src/main/resources/bg/thaboar_2.png differ
diff --git a/src/main/resources/bg/thekingofnachos_tm_0.png b/src/main/resources/bg/thekingofnachos_tm_0.png
new file mode 100644
index 000000000..e2ba7b1e0
Binary files /dev/null and b/src/main/resources/bg/thekingofnachos_tm_0.png differ
diff --git a/src/main/resources/bg/thekingofnachos_tm_1.png b/src/main/resources/bg/thekingofnachos_tm_1.png
new file mode 100644
index 000000000..627013e88
Binary files /dev/null and b/src/main/resources/bg/thekingofnachos_tm_1.png differ
diff --git a/src/main/resources/bg/umbrellamanray_0.png b/src/main/resources/bg/umbrellamanray_0.png
new file mode 100644
index 000000000..fce49227e
Binary files /dev/null and b/src/main/resources/bg/umbrellamanray_0.png differ
diff --git a/src/main/resources/bg/watermelonmojito_0.png b/src/main/resources/bg/watermelonmojito_0.png
new file mode 100644
index 000000000..e60922ae3
Binary files /dev/null and b/src/main/resources/bg/watermelonmojito_0.png differ
diff --git a/src/main/resources/particles.png b/src/main/resources/particles.png
deleted file mode 100644
index e88aa97c7..000000000
Binary files a/src/main/resources/particles.png and /dev/null differ
