diff --git a/game/client/build.gradle.kts b/game/client/build.gradle.kts
index 126576088..3b7f26ad2 100644
--- a/game/client/build.gradle.kts
+++ b/game/client/build.gradle.kts
@@ -24,13 +24,21 @@ repositories {
         metadataSources { artifact() }
     }
     ivy {
-        url = uri("https://github.com/Turnip-Labs")
+        url = uri("https://github.com/Better-than-Adventure")
         patternLayout {
             artifact("[organisation]/releases/download/[revision]/[module]-bta-[revision].jar")
             m2Compatible
         }
         metadataSources { artifact() }
     }
+    ivy {
+        url = uri("https://github.com/Better-than-Adventure")
+        patternLayout {
+            artifact("[organisation]/releases/download/[revision]/brigadier-[revision].jar")
+            m2Compatible
+        }
+        metadataSources { artifact() }
+    }
 }
 
 dependencies {
@@ -52,7 +60,7 @@ dependencies {
     implementation(project(":util:logging"))?.let { include(it) }
     // </core dependencies>
 
-    implementation("legacy-lwjgl3:legacy-lwjgl3:1.0.3")?.let { include(it) }
+    implementation("legacy-lwjgl3:legacy-lwjgl3:1.0.4")?.let { include(it) }
 
     implementation("org.apache-extras.beanshell:bsh:2.0b6")?.let { include(it) }
     implementation("com.deepoove:codehighlight:1.0.3")?.let { include(it) }
diff --git a/game/client/src/main/java/net/minecraft/client/Minecraft.java b/game/client/src/main/java/net/minecraft/client/Minecraft.java
index d3cc5142f..79ccb7266 100644
--- a/game/client/src/main/java/net/minecraft/client/Minecraft.java
+++ b/game/client/src/main/java/net/minecraft/client/Minecraft.java
@@ -1933,7 +1933,6 @@ public class Minecraft
 
         // Display Guidebook
         if (gameSettings.keyGuidebook.isPressEvent(currentInputDevice)) {
-            thePlayer.triggerAchievement(Achievements.OPEN_GUIDEBOOK);
             thePlayer.displayGuidebookScreen();
             return true;
         }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/Screen.java b/game/client/src/main/java/net/minecraft/client/gui/Screen.java
index c31c7044d..b50714c12 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/Screen.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/Screen.java
@@ -210,6 +210,7 @@ public abstract class Screen extends Gui {
     }
 
     public void guiSpecificControllerInput(ControllerInput controller) {
+        this.mouseReleased((int)controller.cursorX, (int)controller.cursorY, -1);
         if(controller.buttonB.pressedThisFrame()) {
             this.keyPressed((char)0, Keyboard.KEY_BACK, -1, -1);
         }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenSignEditor.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenSignEditor.java
index 9c63e80d4..b7d7c0ca6 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenSignEditor.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenSignEditor.java
@@ -5,6 +5,7 @@ import net.minecraft.client.gui.modelviewer.elements.ListenerButtonElement;
 import net.minecraft.client.input.InputType;
 import net.minecraft.client.input.controller.ControllerInput;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockLogicSign;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.entity.TileEntitySign;
 import net.minecraft.core.enums.EnumSignPicture;
@@ -160,12 +161,12 @@ public class ScreenSignEditor extends Screen
         Block<?> block = entitySign.getBlock();
         if(block == Blocks.SIGN_POST_PLANKS_OAK)
         {
-            float signAngle = (float)(entitySign.getBlockMeta() * 360) / 16F;
+            float signAngle = (float)((entitySign.getBlockMeta() & BlockLogicSign.MASK_SIDE) * 360) / 16F;
             GL11.glRotatef(signAngle, 0.0F, 1.0F, 0.0F);
             GL11.glTranslatef(0.0F, -1.0625F, 0.0F);
         } else
         {
-            int meta = entitySign.getBlockMeta();
+            int meta = entitySign.getBlockMeta() & BlockLogicSign.MASK_SIDE;
             float signAngle = 0.0F;
             if(meta == 2)
             {
@@ -186,6 +187,7 @@ public class ScreenSignEditor extends Screen
         {
             entitySign.lineBeingEdited = editLine;
         }
+        GL11.glEnable(GL11.GL_BLEND);
         TileEntityRenderDispatcher.instance.renderTileEntity(Tessellator.instance, entitySign, -0.5D, -0.75D, -0.5D, 0.0F);
         entitySign.lineBeingEdited = -1;
         GL11.glPopMatrix();
diff --git a/game/client/src/main/java/net/minecraft/client/gui/SliderElement.java b/game/client/src/main/java/net/minecraft/client/gui/SliderElement.java
index 4f47c75eb..dc40c1223 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/SliderElement.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/SliderElement.java
@@ -1,7 +1,9 @@
 package net.minecraft.client.gui;
 
+import net.minecraft.client.input.InputType;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.input.Mouse;
 import org.lwjgl.opengl.GL11;
 
@@ -46,15 +48,9 @@ public class SliderElement extends ButtonElement {
 		if(!visible) {
 			return;
 		}
-		final double realMouseX = (double) (Mouse.getX() * mc.resolution.getScaledWidthScreenCoords()) / mc.resolution.getWidthScreenCoords();
 		if(dragging) {
-			sliderValue = (realMouseX - (xPosition + 4)) / (float) (width - 8);
-			if(sliderValue < 0.0F) {
-				sliderValue = 0.0F;
-			}
-			if(sliderValue > 1.0F) {
-				sliderValue = 1.0F;
-			}
+			final double realMouseX = mc.inputType == InputType.CONTROLLER ? mc.controllerInput.cursorX : (double) (Mouse.getX() * mc.resolution.getScaledWidthScreenCoords()) / mc.resolution.getWidthScreenCoords();
+			sliderValue = MathHelper.clamp((realMouseX - (xPosition + 4)) / (float) (width - 8), 0, 1);
 			if(option != null) {
 				option.set((float) sliderValue);
 				displayString = option.getDisplayString();
@@ -110,14 +106,8 @@ public class SliderElement extends ButtonElement {
 	@Override
 	public boolean mouseClicked(Minecraft mc, int mouseX, int mouseY) {
 		if(super.mouseClicked(mc, mouseX, mouseY)) {
-			final double realMouseX = (double) (Mouse.getX() * mc.resolution.getScaledWidthScreenCoords()) / mc.resolution.getWidthScreenCoords();
-			sliderValue = (realMouseX - (xPosition + 4)) / (float) (width - 8);
-			if(sliderValue < 0.0F) {
-				sliderValue = 0.0F;
-			}
-			if(sliderValue > 1.0F) {
-				sliderValue = 1.0F;
-			}
+			final double realMouseX = mc.inputType == InputType.CONTROLLER ? mc.controllerInput.cursorX : (double) (Mouse.getX() * mc.resolution.getScaledWidthScreenCoords()) / mc.resolution.getWidthScreenCoords();
+			sliderValue = MathHelper.clamp((realMouseX - (xPosition + 4)) / (float) (width - 8), 0, 1);
 			if(option != null) {
 				option.set((float) sliderValue);
 				displayString = option.getDisplayString();
diff --git a/game/client/src/main/java/net/minecraft/client/gui/TooltipElement.java b/game/client/src/main/java/net/minecraft/client/gui/TooltipElement.java
index b864a15ba..09a62b274 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/TooltipElement.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/TooltipElement.java
@@ -220,7 +220,7 @@ public class TooltipElement extends Gui
 
 			if(showDescription) {
 				text.append('\n').append(formatDescription(itemStack.getItemDescription(), 16));
-			} else {
+			} else if (!(slot instanceof SlotResult)) {
                 text.append('\n').append(formatDescription(trans.translateKeyAndFormat("gui.tooltip.prompt.description", mc.gameSettings.keyDescription.getKeyName()), 16));
             }
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenChat.java b/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenChat.java
index af67e6057..c191842cd 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenChat.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenChat.java
@@ -16,7 +16,7 @@ import org.slf4j.Logger;
 
 public class ScreenChat extends Screen implements ITextField {
 	protected static final Logger LOGGER = LogUtils.getLogger();
-	protected String message;
+	public String message;
 	private int currentIndex = 0;
 	private String originalMessage;
 	private int updateCounter;
@@ -52,6 +52,7 @@ public class ScreenChat extends Screen implements ITextField {
 				ComponentAnchor.BOTTOM_LEFT
 			);
 			if (!this.getText().startsWith("/")) {
+
 				this.suggestionsElement.hidden = true;
 			} else {
 				this.suggestionsElement.updateSuggestions();
diff --git a/game/client/src/main/java/net/minecraft/client/gui/guidebook/ScreenGuidebook.java b/game/client/src/main/java/net/minecraft/client/gui/guidebook/ScreenGuidebook.java
index 3ca8638d1..3a866bc28 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/guidebook/ScreenGuidebook.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/guidebook/ScreenGuidebook.java
@@ -14,6 +14,7 @@ import net.minecraft.client.render.entity.EntityRendererItem;
 import net.minecraft.client.render.font.FontRenderer;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.sound.SoundCategory;
@@ -54,6 +55,7 @@ public class ScreenGuidebook
     @Override
     public void init() {
         super.init();
+        mc.thePlayer.triggerAchievement(Achievements.OPEN_GUIDEBOOK);
 
         initTabList();
         Keyboard.enableRepeatEvents(true);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/guidebook/crafting/RecipePageCrafting.java b/game/client/src/main/java/net/minecraft/client/gui/guidebook/crafting/RecipePageCrafting.java
index 350e0bdc3..2df94b267 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/guidebook/crafting/RecipePageCrafting.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/guidebook/crafting/RecipePageCrafting.java
@@ -70,7 +70,6 @@ public class RecipePageCrafting
     private final TooltipElement tooltipElement;
     private final ItemElement itemElement;
     private static final Minecraft mc = Minecraft.getMinecraft();
-    private static Player player;
     private static long ticks = 0;
 
     public RecipePageCrafting(GuidebookSection section, List<RecipeEntryCrafting<?,?>> recipes) {
@@ -78,8 +77,6 @@ public class RecipePageCrafting
         this.recipes = recipes;
         this.slots = new ArrayList<>();
         this.map = new HashMap<>();
-        player = mc.thePlayer;
-        player.addStat(Achievements.OPEN_GUIDEBOOK,1);
         tooltipElement = new TooltipElement(mc);
         itemElement = new ItemElement(mc);
         int recipeAmount = 0;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/guidebook/smelting/RecipePageBlastSmelting.java b/game/client/src/main/java/net/minecraft/client/gui/guidebook/smelting/RecipePageBlastSmelting.java
index 34f11ecfe..bafa22b81 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/guidebook/smelting/RecipePageBlastSmelting.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/guidebook/smelting/RecipePageBlastSmelting.java
@@ -35,15 +35,12 @@ public class RecipePageBlastSmelting
     private final TooltipElement tooltipElement;
     private final ItemElement itemElement;
     private static final Minecraft mc = Minecraft.getMinecraft();
-    private static Player player;
     private static long ticks = 0;
     public RecipePageBlastSmelting(GuidebookSection section, ArrayList<RecipeEntryBlastFurnace> recipes) {
         super(section);
         this.recipes = recipes;
         this.slots = new ArrayList<>();
         this.map = new HashMap<>();
-        player = mc.thePlayer;
-        player.addStat(Achievements.OPEN_GUIDEBOOK,1);
         tooltipElement = new TooltipElement(mc);
         itemElement = new ItemElement(mc);
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/guidebook/smelting/RecipePageSmelting.java b/game/client/src/main/java/net/minecraft/client/gui/guidebook/smelting/RecipePageSmelting.java
index 5639bf0b5..461fe1cd7 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/guidebook/smelting/RecipePageSmelting.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/guidebook/smelting/RecipePageSmelting.java
@@ -35,15 +35,12 @@ public class RecipePageSmelting
     private final TooltipElement tooltipElement;
     private final ItemElement itemElement;
     private static final Minecraft mc = Minecraft.getMinecraft();
-    private static Player player;
     private static long ticks = 0;
     public RecipePageSmelting(GuidebookSection section, ArrayList<RecipeEntryFurnace> recipes) {
         super(section);
         this.recipes = recipes;
         this.slots = new ArrayList<>();
         this.map = new HashMap<>();
-        player = mc.thePlayer;
-        player.addStat(Achievements.OPEN_GUIDEBOOK,1);
         tooltipElement = new TooltipElement(mc);
         itemElement = new ItemElement(mc);
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/guidebook/trommeling/RecipePageTrommel.java b/game/client/src/main/java/net/minecraft/client/gui/guidebook/trommeling/RecipePageTrommel.java
index 1d5fbceae..d8d6506b9 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/guidebook/trommeling/RecipePageTrommel.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/guidebook/trommeling/RecipePageTrommel.java
@@ -38,7 +38,6 @@ public class RecipePageTrommel
     private final TooltipElement tooltipElement;
     private final ItemElement itemElement;
     private static final Minecraft mc = Minecraft.getMinecraft();
-    private static Player player;
     private static long ticks = 0;
     private static long ticks2 = 0;
 
@@ -47,8 +46,6 @@ public class RecipePageTrommel
         this.recipes = recipes;
         this.slots = new ArrayList<>();
         this.map = new HashMap<>();
-        player = mc.thePlayer;
-        player.addStat(Achievements.OPEN_GUIDEBOOK,1);
         tooltipElement = new TooltipElement(mc);
         itemElement = new ItemElement(mc);
         int recipeAmount = 0;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java b/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
index 3d47aacdc..0c3922518 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
@@ -16,6 +16,7 @@ import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.HeldItemTooltipElement;
 import net.minecraft.client.gui.ScreenPhotoMode;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
+import net.minecraft.client.render.entity.EntityRendererItem;
 import net.minecraft.client.render.font.FontRenderer;
 import net.minecraft.core.block.BlockLogicPortal;
 import net.minecraft.core.enums.ChatVisibility;
@@ -818,6 +819,7 @@ public class HudIngame extends Gui
     public void drawChat(int width, int height, int sp)
     {
         if (mc.gameSettings.chatVisibility.value == ChatVisibility.NEVER_SHOW) return;
+        if(mc.currentScreen instanceof ScreenChat && ((ScreenChat) mc.currentScreen).message.startsWith("/")) return;
         int linesToShow = 10;
         boolean ignoreFadeout = false;
         if (mc.currentScreen instanceof ScreenChat)
diff --git a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryMinecart.java b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryMinecart.java
index a2276c73c..8f52ca544 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryMinecart.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryMinecart.java
@@ -4,8 +4,10 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.ButtonElement;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.modelviewer.elements.ListenerButtonElement;
+import net.minecraft.client.gui.modelviewer.elements.ListenerSliderElement;
 import net.minecraft.core.entity.vehicle.EntityMinecart;
 import net.minecraft.core.lang.I18n;
+import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.world.World;
 import org.lwjgl.input.Keyboard;
 
@@ -22,7 +24,22 @@ public class EntityEntryMinecart extends EntityEntry<EntityMinecart>{
     public List<ButtonElement> getEntryButtons(Minecraft mc, Screen parentScreen, EntityMinecart minecart) {
         ListenerButtonElement button = new ListenerButtonElement(-1, - 120, 0, 120, 20, I18n.getInstance().translateKey("model.category.entity.minecart.button.cycle"));
         button.setActionListener(() -> minecart.setType((byte) ((minecart.getType() + 3 + (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) ? -1 : 1)) % 3)));
-        return new ArrayList<ButtonElement>(){{add(button);}};
+        ListenerSliderElement slider = new ListenerSliderElement(-1, - 120, 21, 120, 20, I18n.getInstance().translateKeyAndFormat("model.category.entity.sheep.slider.color", "White"), 0f);
+        slider.setOnValueChanged(() -> {
+            int sliderVal = (int) (slider.sliderValue * 16) - 1;
+            if (sliderVal >= 0) {
+                DyeColor dc = DyeColor.colorFromBlockMeta(sliderVal);
+                minecart.setMeta(dc.blockMeta << 4 | EntityMinecart.TYPE_MASK_PAINTED_CHEST);
+                String color = dc.colorID;
+                String c = String.valueOf(color.charAt(0));
+                color = c.toUpperCase() + color.substring(1);
+                slider.displayString = I18n.getInstance().translateKeyAndFormat("model.category.entity.minecart.slider.color", color);
+            } else {
+                minecart.setMeta(0);
+                slider.displayString = I18n.getInstance().translateKeyAndFormat("model.category.entity.minecart.slider.color", "none");
+            }
+        });
+        return new ArrayList<ButtonElement>(){{add(button); add(slider);}};
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/components/FloatOptionComponent.java b/game/client/src/main/java/net/minecraft/client/gui/options/components/FloatOptionComponent.java
index 3ecddf448..7d817c0ee 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/components/FloatOptionComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/components/FloatOptionComponent.java
@@ -30,6 +30,7 @@ public class FloatOptionComponent
     @Override
     protected void buttonDragged(int x, int y, int width, int height, int relativeMouseX, int relativeMouseY) {
         this.option.set((float) this.slider.sliderValue);
+        this.slider.mouseDragged(mc, this.slider.xPosition + relativeMouseX, this.slider.yPosition + relativeMouseY);
         this.slider.displayString = this.option.getDisplayStringValue();
         this.option.onUpdate();
     }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/components/KeyBindingComponent.java b/game/client/src/main/java/net/minecraft/client/gui/options/components/KeyBindingComponent.java
index 9e835cea8..1706b7973 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/components/KeyBindingComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/components/KeyBindingComponent.java
@@ -18,7 +18,8 @@ public class KeyBindingComponent
 
         this.keyBinding = keyBinding;
         this.keyButton = new ButtonElement(0, 0, 0, 150, 20, keyBinding.getKeyName());
-        this.clearButton = new ButtonElement(0, 0, 0, 12, 20, "X");
+        this.clearButton = new ButtonElement(0, 0, 0, 12, 20, "")
+            .setTextures("minecraft:gui/screen/options/clear", "minecraft:gui/screen/options/clear_highlighted", null);
     }
 
     @Override
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 f26273141..a9a46b332 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
@@ -1,5 +1,6 @@
 package net.minecraft.client.gui.options.data;
 
+import com.mojang.logging.LogUtils;
 import net.betterthanadventure.utils.DataDumper;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.enums.EnumGPUVendor;
@@ -15,6 +16,7 @@ import net.minecraft.client.option.enums.LightmapStyle;
 import net.minecraft.client.player.controller.PlayerControllerSP;
 import net.minecraft.client.sound.SoundEngine;
 import net.minecraft.client.util.helper.FileOpener;
+import net.minecraft.client.util.helper.JavaProcess;
 import net.minecraft.client.world.WorldClient;
 import net.minecraft.core.Global;
 import net.minecraft.core.UnexpectedThrowable;
@@ -28,6 +30,8 @@ import paulscode.sound.SoundSystem;
 
 import javax.management.RuntimeErrorException;
 import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
 
 
 public abstract class OptionsPages
@@ -212,6 +216,7 @@ public abstract class OptionsPages
                 .withComponent(new KeyBindingComponent(mc.gameSettings.keySneak))
                 .withComponent(new KeyBindingComponent(mc.gameSettings.keyFly))
                 .withComponent(new KeyBindingComponent(mc.gameSettings.keyAutoWalk))
+                .withComponent(new KeyBindingComponent(mc.gameSettings.keyEasyBridge))
                 .withComponent(new KeyBindingComponent(mc.gameSettings.keySprint))
             )
             .withComponent(new OptionsCategory("gui.options.page.controls.category.user_interface")
@@ -360,7 +365,13 @@ public abstract class OptionsPages
                 .withComponent(new ShortcutComponent("gui.options.page.debug.button.open.sound_test", () -> mc.displayScreen(new ScreenSoundTest(mc.currentScreen))))
                 .withComponent(new ShortcutComponent("gui.options.page.debug.button.open.texture_viewer", () -> mc.displayScreen(new ScreenTextureViewer(mc.currentScreen))))
                 .withComponent(new ShortcutComponent("gui.options.page.debug.button.open.biome_finder", () -> {
-                    new Thread(() -> SeedViewerMain.main(new String[0])).start();
+                    new Thread(() -> {
+                        try {
+                            JavaProcess.exec(SeedViewerMain.class, Collections.emptyList());
+                        } catch (final IOException | InterruptedException e) {
+                            LogUtils.getLogger().error("", e);
+                        }
+                    }).start();
                     Global.accessor = mc;
                 }))
                 .withComponent(new ShortcutComponent("gui.options.page.debug.button.open.font_tester", () -> mc.displayScreen(new ScreenFontTest(mc.currentScreen))))
diff --git a/game/client/src/main/java/net/minecraft/client/input/PlayerInput.java b/game/client/src/main/java/net/minecraft/client/input/PlayerInput.java
index 0a6c4cea0..700a1a729 100644
--- a/game/client/src/main/java/net/minecraft/client/input/PlayerInput.java
+++ b/game/client/src/main/java/net/minecraft/client/input/PlayerInput.java
@@ -69,6 +69,11 @@ public class PlayerInput {
 		if(gameSettings.keyAutoWalk.isKeyboardKey(keyCode) && pressed) {
 			isAutoWalkOn = true;
 		}
+
+		if(gameSettings.keyEasyBridge.isKeyboardKey(keyCode) && pressed) {
+			gameSettings.easyBridge.toggle();
+			mc.hudIngame.heldItemTooltipElement.setOptionNameAndValueString(gameSettings.easyBridge);
+		}
 	}
 
 	public void onGameUnfocused() {
diff --git a/game/client/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java b/game/client/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java
index 02bc0c127..9df70381f 100644
--- a/game/client/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java
+++ b/game/client/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java
@@ -25,7 +25,7 @@ public class ClientCommandSource implements CommandSource {
     }
 
     @Override
-    public Collection<String> getPlayerNames() {
+    public Collection<String> getPlayerUsernames() {
         List<String> list = new ArrayList<>();
         for (Player player : this.mc.currentWorld.players) {
             list.add(player.username);
@@ -33,9 +33,18 @@ public class ClientCommandSource implements CommandSource {
         return list;
     }
 
+    @Override
+    public Collection<String> getPlayerNicknames() {
+        List<String> list = new ArrayList<>();
+        for (Player player : this.mc.currentWorld.players) {
+            list.add(player.nickname);
+        }
+        return list;
+    }
+
     @Override
     public Collection<String> getEntitySuggestions() {
-        List<String> suggestions = new ArrayList<>(this.getPlayerNames());
+        List<String> suggestions = new ArrayList<>(this.getPlayerUsernames());
         if (this.mc.objectMouseOver != null && this.mc.objectMouseOver.entity != null) {
             suggestions.add(EntitySelector.ENTITY_PREFIX + this.mc.objectMouseOver.entity.hashCode());
         }
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 2ad33bf4f..52ce4d5c1 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
@@ -238,6 +238,7 @@ public class GameSettings {
 	public KeyBinding keySwitchPerspective = new KeyBinding("key.switchPerspective").setDefault(InputDevice.keyboard, KEY_F5);
 	public KeyBinding keyHideGui = new KeyBinding("key.immersiveMode").setDefault(InputDevice.keyboard, KEY_F1);
 	public KeyBinding keyAutoWalk = new KeyBinding("key.autoWalk");
+	public KeyBinding keyEasyBridge = new KeyBinding("key.easyBridge");
 	public KeyBinding keySprint = new KeyBinding("key.sprint");
 	public KeyBinding keyToggleOverlay = new KeyBinding("key.toggleOverlay").setDefault(InputDevice.keyboard, KEY_F4);
 	public KeyBinding keyOpenAchievements = new KeyBinding("key.openAchievements");
diff --git a/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java b/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java
index 702faaedf..aad6531bd 100644
--- a/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java
+++ b/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java
@@ -99,6 +99,7 @@ public abstract class PlayerController {
 				
 				if(!isMiningBlock(x, y, z)) {
 					sendStartDigPacket(x, y, z, side, xHit, yHit);
+					hitBlock(x, y, z, side, xHit, yHit);
 					currentDamage = 0.0f;
 					previousDamage = 0.0f;
 					setMineBlock(x, y, z);
diff --git a/game/client/src/main/java/net/minecraft/client/render/FogManager.java b/game/client/src/main/java/net/minecraft/client/render/FogManager.java
index 5c76b3dcf..da3ac9efc 100644
--- a/game/client/src/main/java/net/minecraft/client/render/FogManager.java
+++ b/game/client/src/main/java/net/minecraft/client/render/FogManager.java
@@ -109,7 +109,7 @@ public class FogManager {
     {
         WorldClient world = mc.currentWorld;
 
-        float renderDistanceScale = 1.0F / (float)((mc.gameSettings.renderDistance.highest + 1) - mc.gameSettings.renderDistance.value);
+        float renderDistanceScale = 1.0F / (float)((mc.gameSettings.renderDistance.highest + 8) - mc.gameSettings.renderDistance.value);
         renderDistanceScale = 1.0F - (float) Math.pow(renderDistanceScale, 0.25D);
 
         Vec3 skyColor = world.getSkyColor(mc.activeCamera, partialTick);
diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
index 3c024de83..e9807a55e 100644
--- a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
@@ -670,6 +670,8 @@ public final class BlockModelDispatcher
         addDispatch(new BlockModelEmpty<>(Blocks.SIGN_POST_PLANKS_OAK).setAllTextures(BLOCK_TEXTURES, "minecraft:block/planks/oak"));
         addDispatch(new BlockModelEmpty<>(Blocks.SIGN_WALL_PLANKS_OAK).setAllTextures(BLOCK_TEXTURES, "minecraft:block/planks/oak"));
         addDispatch(new BlockModelEmpty<>(Blocks.FLAG).setAllTextures(BLOCK_TEXTURES, "minecraft:block/planks/oak"));
+        addDispatch(new BlockModelEmpty<>(Blocks.SIGN_POST_PLANKS_OAK_PAINTED).setAllTextures(BLOCK_TEXTURES, "minecraft:block/planks/oak"));
+        addDispatch(new BlockModelEmpty<>(Blocks.SIGN_WALL_PLANKS_OAK_PAINTED).setAllTextures(BLOCK_TEXTURES, "minecraft:block/planks/oak"));
 
         addDispatch(new BlockModelLayer<>(Blocks.LAYER_SNOW).setAllTextures(BLOCK_TEXTURES, "minecraft:block/block_snow"));
         addDispatch(new BlockModelLayer<>(Blocks.LAYER_LEAVES_OAK).setAllTextures(BLOCK_TEXTURES, "minecraft:block/leaves/oak_fancy"));
diff --git a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
index 724e6acfd..5d8fd8a28 100644
--- a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
+++ b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
@@ -415,6 +415,8 @@ public class ItemModelDispatcher extends Dispatcher<Item, ItemModel> {
         addDispatch(new ItemModelStandard(Items.STATUE_MARBLE, "minecraft"));
         addDispatch(new ItemModelStandard(Items.STATUE_PIGMAN, "minecraft"));
 
+        addDispatch(new ItemModelSignPainted(Items.SIGN_PAINTED));
+
         for (int i = 0; i < Blocks.blocksList.length; i++) {
             if (Blocks.blocksList[i] == null) continue;
             Item item = Blocks.blocksList[i].asItem();
diff --git a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelPaintbrush.java b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelPaintbrush.java
index beeafa9ff..accefcc40 100644
--- a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelPaintbrush.java
+++ b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelPaintbrush.java
@@ -25,7 +25,7 @@ public class ItemModelPaintbrush extends ItemModelStandard {
 
     @Override
     public @NotNull IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack) {
-        final DyeColor color = ((ItemPaintBrush) itemStack.getItem()).getColor(itemStack);
+        final DyeColor color = ItemPaintBrush.getColor(itemStack);
         if (color == null) {
             return emptyIcon;
         }
diff --git a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelSignPainted.java b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelSignPainted.java
new file mode 100644
index 000000000..c7eb9ee08
--- /dev/null
+++ b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelSignPainted.java
@@ -0,0 +1,25 @@
+package net.minecraft.client.render.item.model;
+
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.DyeColor;
+import org.jetbrains.annotations.NotNull;
+
+public class ItemModelSignPainted extends ItemModelStandard {
+    public static IconCoordinate[] sign = new IconCoordinate[DyeColor.COLOR_AMOUNT];
+    static {
+        for (DyeColor c : DyeColor.itemOrderedColors()){
+            sign[c.itemMeta] = TextureRegistry.getTexture("minecraft:item/sign/" + c.colorID);
+        }
+    }
+    public ItemModelSignPainted(Item item) {
+        super(item, null);
+    }
+    public @NotNull IconCoordinate getIcon(Entity entity, ItemStack itemStack){
+        int meta = itemStack.getMetadata();
+        return sign[meta & DyeColor.MASK_COLOR];
+    }
+}
\ No newline at end of file
diff --git a/game/client/src/main/java/net/minecraft/client/render/texture/TextureFile.java b/game/client/src/main/java/net/minecraft/client/render/texture/TextureFile.java
index ee65211e2..69b4353c3 100644
--- a/game/client/src/main/java/net/minecraft/client/render/texture/TextureFile.java
+++ b/game/client/src/main/java/net/minecraft/client/render/texture/TextureFile.java
@@ -62,6 +62,12 @@ public class TextureFile extends Texture{
             try (final InputStream stream = pack.getResourceAsStream(this.sourcePath + ".mcmeta")) {
                 if (stream != null) {
                     this.metaHandler.loadFromStream(stream);
+                } else {
+                    try (InputStream stream2 = mc.texturePackList.getDefaultTexturePack().getResourceAsStream(sourcePath + ".mcmeta")) {
+                        if (stream2 != null) {
+                            this.metaHandler.loadFromStream(stream2);
+                        }
+                    }
                 }
             } catch (final Exception e) {
                 LOGGER.error("Failed to load data for '{}.mcmeta'!", this.sourcePath, e);
diff --git a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
index 9754a6056..3fdff365e 100644
--- a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
+++ b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
@@ -9,9 +9,12 @@ import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.BlockLogicSign;
+import net.minecraft.core.block.BlockLogicSignPainted;
+import net.minecraft.core.block.IPainted;
 import net.minecraft.core.block.entity.TileEntitySign;
 import net.minecraft.core.enums.EnumSignPicture;
 import net.minecraft.core.util.helper.Color;
+import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.MathHelper;
 import org.jetbrains.annotations.NotNull;
 import org.lwjgl.opengl.GL11;
@@ -23,9 +26,13 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
 
     private final Minecraft mc = Minecraft.getMinecraft();
     private final @NotNull StringBuilder builder = new StringBuilder();
+    private final String[] signColorTextures = new String[16];
 
     public TileEntityRendererSign() {
         super();
+        for (int i = 0; i < signColorTextures.length; i++) {
+            signColorTextures[i] = "/assets/minecraft/textures/entity/sign/" + DyeColor.colorFromBlockMeta(i).colorID + ".png";
+        }
     }
 
      @Override
@@ -41,14 +48,15 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
         final float scale = 2/3f * 1/16f;
         final float height;
         GL11.glTranslatef((float)x + 0.5F, (float)y, (float)z + 0.5F);
+        final int meta = tileEntity.getBlockMeta();
         if (((BlockLogicSign) block.getLogic()).isFreeStanding) {
-            final float angle = (float)(tileEntity.getBlockMeta() * 360) / 16F;
+            final float angle = (float)((meta & BlockLogicSign.MASK_SIDE) * 360) / 16F;
             GL11.glRotatef(-angle, 0.0F, 1.0F, 0.0F);
             model = getModel("post");
             height = 20;
         } else {
             final float angle;
-            switch (tileEntity.getBlockMeta()) {
+            switch (meta & BlockLogicSign.MASK_SIDE) {
                 case BlockLogicSign.SIDE_NORTH:
                     angle = 180F;
                     break;
@@ -71,17 +79,29 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
 
         GL11.glPushMatrix();
         GL11.glScalef(scale, scale, -scale);
-        bindTexture("/assets/minecraft/textures/entity/sign.png");
+        int colorSign;
+        if (Block.hasLogicClass(block, BlockLogicSignPainted.class)) {
+            DyeColor c = ((IPainted) block.getLogic()).fromMetadata(meta);
+            bindTexture(this.signColorTextures[c.blockMeta]);
+            colorSign = c.color.getARGB();
+        } else {
+            bindTexture("/assets/minecraft/textures/entity/sign.png");
+//            colorSign = 0xa57319;
+            colorSign = 0x695e43;
+        }
         model.render(t);
         GL11.glPopMatrix();
 
+
+
         // Render overlay
         GL11.glPushMatrix();
+        GL11.glEnable(GL11.GL_BLEND);
         GL11.glTranslatef(0 * scale, height * scale, 1.05f * scale);
         GL11.glNormal3f(0, 0, 1);
         GL11.glDepthMask(false);
         final EnumSignPicture picture = tileEntity.getPicture();
-        drawTexturedModalRect(1, 0.5,TextureRegistry.getTexture(picture.getTextureKey()));
+        drawTexturedModalRect(1, 0.5, colorSign,TextureRegistry.getTexture(picture.getTextureKey()));
         GL11.glPopMatrix();
 
         // Render text
@@ -102,21 +122,35 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
          GL11.glTranslatef(0.0F, height * scale, 1.1f * scale);
          GL11.glScalef(scale2, -scale2, scale2);
          GL11.glDepthMask(false);
-        int color = Colors.allSignColors[tileEntity.getColor().id].getARGB();
+         int color = Colors.allSignColors[tileEntity.getColor().id].getARGB();
         final int r = (int) MathHelper.clamp((Color.redFromInt(color) * lightLevel + lightOffset), 0, 255);
         final int g = (int)MathHelper.clamp((Color.greenFromInt(color) * lightLevel + lightOffset), 0, 255);
         final int b = (int)MathHelper.clamp((Color.blueFromInt(color) * lightLevel + lightOffset), 0, 255);
+        final int borderR = (int) MathHelper.clamp((Color.redFromInt(color) * lightLevel - 127), 0, 255);
+        final int borderG = (int) MathHelper.clamp((Color.greenFromInt(color) * lightLevel - 127), 0, 255);
+        final int borderB = (int) MathHelper.clamp((Color.blueFromInt(color) * lightLevel - 127), 0, 255);
         color = Color.intToIntARGB(0, r, g, b);
+        int borderColor = Color.intToIntARGB(0, borderR, borderG, borderB);
         for(int line = 0; line < tileEntity.signText.length; line++)
         {
             this.builder.setLength(0);
             if(line == tileEntity.lineBeingEdited)
             {
-                this.builder.append("§+§0> §-").append(tileEntity.signText[line]).append("§+§0 <§-");
+                this.builder.append("§+§f> §-").append(tileEntity.signText[line]).append("§+§f <§-");
             } else {
                 this.builder.append(tileEntity.signText[line]);
             }
-            sr.render(t, this.builder, -sr.stringWidth(this.builder) / 2, line * 10 - tileEntity.signText.length * 5).setColor(color).call();
+            int _x = -sr.stringWidth(this.builder) / 2;
+            int _y = line * 10 - tileEntity.signText.length * 5;
+            if (tileEntity.isGlowing()) {
+                int _x2 = -sr.stringWidth(tileEntity.signText[line]) / 2;
+                for (float i = -1; i <= 1; i += 1/3f) {
+                    for (float j = -1; j <= 1; j += 1/3f) {
+                        sr.renderDouble(t, tileEntity.signText[line], _x2 + i, _y + j).setColor(borderColor).call();
+                    }
+                }
+            }
+            sr.render(t, this.builder, _x, _y).setColor(color).call();
         }
         GL11.glPopMatrix();
 
@@ -126,11 +160,12 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
         GL11.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 
-    private static void drawTexturedModalRect(final double width, final double height, final @NotNull IconCoordinate coordinate)
+    private static void drawTexturedModalRect(final double width, final double height, int color, final @NotNull IconCoordinate coordinate)
     {
         coordinate.parentAtlas.bind();
         final Tessellator tessellator = Tessellator.instance;
         tessellator.startDrawingQuads();
+        tessellator.setColorRGBA_I(color, 128);
         tessellator.addVertexWithUV(-width/2,  height/2, 0, coordinate.getIconUMin(),coordinate.getIconVMin());
         tessellator.addVertexWithUV(-width/2, -height/2, 0, coordinate.getIconUMin(),coordinate.getIconVMax());
         tessellator.addVertexWithUV( width/2, -height/2, 0, coordinate.getIconUMax(),coordinate.getIconVMax());
diff --git a/game/client/src/main/java/net/minecraft/client/sound/SoundEngine.java b/game/client/src/main/java/net/minecraft/client/sound/SoundEngine.java
index 23be97302..9d9dccc91 100644
--- a/game/client/src/main/java/net/minecraft/client/sound/SoundEngine.java
+++ b/game/client/src/main/java/net/minecraft/client/sound/SoundEngine.java
@@ -171,7 +171,6 @@ public class SoundEngine
 	public void playSound(final SoundEntry entry, final SoundCategory category, final float volume, final float pitch) {
 		try {
 			lock.lock();
-			if (!canPlaySounds()) return;
 			this.idCounter = (this.idCounter + 1) % 256;
 			final String soundName = "sound_" + this.idCounter;
 			playSoundWithID(entry, category, volume, pitch, soundName);
@@ -187,7 +186,6 @@ public class SoundEngine
 	public void playSoundAt(final SoundEntry entry, final SoundCategory category, final float x, final float y, final float z, final float volume, final float pitch) {
 		try {
 			lock.lock();
-			if (!canPlaySounds()) return;
 			this.idCounter = (this.idCounter + 1) % 256;
 			final String soundName = "sound_" + this.idCounter;
 			playSoundWithIdAtPos(entry, category, x, y, z, volume, pitch, soundName);
@@ -211,27 +209,28 @@ public class SoundEngine
 	private void playSoundWithID(final SoundEntry entry, final SoundCategory category, float volume, final float pitch, final String soundID, final boolean allowSubtitle) {
 		try {
 			lock.lock();
-			if (!canPlaySounds()) return;
 			if (entry != null) {
-				if (entry.type == SoundEntry.Type.FILE) {
-					final URL url = entry.getURL();
-					if (url != null){
-						if (entry.shouldStream) {
-							soundSystem.newStreamingSource(false, soundID, url, entry.name, false, 0, 0, 0, 2, 0);
-						} else {
-							soundSystem.newSource(false, soundID, url, entry.name, false, 0, 0, 0, 0, 0);
-						}
-						if (volume > 1.0F)
-						{
-							volume = 1.0F;
+				if (canPlaySounds()) {
+					if (entry.type == SoundEntry.Type.FILE) {
+						final URL url = entry.getURL();
+						if (url != null){
+							if (entry.shouldStream) {
+								soundSystem.newStreamingSource(false, soundID, url, entry.name, false, 0, 0, 0, 2, 0);
+							} else {
+								soundSystem.newSource(false, soundID, url, entry.name, false, 0, 0, 0, 0, 0);
+							}
+							if (volume > 1.0F)
+							{
+								volume = 1.0F;
+							}
+							volume *= 0.25F;
+							soundSystem.setPitch(soundID, pitch * entry.pitch);
+							soundSystem.setVolume(soundID, volume * SoundCategoryHelper.getEffectiveVolume(category, this.options) * entry.volume);
+							soundSystem.play(soundID);
 						}
-						volume *= 0.25F;
-						soundSystem.setPitch(soundID, pitch * entry.pitch);
-						soundSystem.setVolume(soundID, volume * SoundCategoryHelper.getEffectiveVolume(category, this.options) * entry.volume);
-						soundSystem.play(soundID);
+					} else if (entry.type == SoundEntry.Type.EVENT) {
+						playSoundWithID(entry.name, category, volume * entry.volume, pitch * entry.pitch, soundID, false);
 					}
-				} else if (entry.type == SoundEntry.Type.EVENT) {
-					playSoundWithID(entry.name, category, volume * entry.volume, pitch * entry.pitch, soundID, false);
 				}
 				if (allowSubtitle && entry.parent.hasSubtitle()) {
 					this.mc.subtitleTracker.heardSound(entry.parent, 0, 0, 0);
@@ -256,7 +255,6 @@ public class SoundEngine
 	private void playSoundWithIdAtPos(final SoundEntry entry, final SoundCategory category, final float x, final float y, final float z, float volume, final float pitch, final String soundID, final boolean allowSubtitle) {
 		try {
 			lock.lock();
-			if (!canPlaySounds()) return;
 			if (entry != null) {
 				float soundDistance = entry.attenuationDistance;
 				if(volume > 1.0F)
@@ -265,24 +263,26 @@ public class SoundEngine
 				}
 				if(this.mc.activeCamera.distanceToSqr(x, y, z) > (double)(soundDistance * soundDistance)) return;
 
-				if (entry.type == SoundEntry.Type.FILE) {
-					final URL url = entry.getURL();
-					if (url != null){
-						if (entry.shouldStream) {
-							soundSystem.newStreamingSource(volume > 1.0F, soundID, url, entry.name, false, x, y, z, 2, soundDistance);
-						} else {
-							soundSystem.newSource(volume > 1.0F, soundID, url, entry.name, false, x, y, z, 2, soundDistance);
+				if (canPlaySounds()) {
+					if (entry.type == SoundEntry.Type.FILE) {
+						final URL url = entry.getURL();
+						if (url != null){
+							if (entry.shouldStream) {
+								soundSystem.newStreamingSource(volume > 1.0F, soundID, url, entry.name, false, x, y, z, 2, soundDistance);
+							} else {
+								soundSystem.newSource(volume > 1.0F, soundID, url, entry.name, false, x, y, z, 2, soundDistance);
+							}
+							if (volume > 1.0F) {
+								volume = 1.0F;
+							}
+
+							soundSystem.setPitch(soundID, pitch * entry.pitch);
+							soundSystem.setVolume(soundID, volume * SoundCategoryHelper.getEffectiveVolume(category, this.options) * entry.volume);
+							soundSystem.play(soundID);
 						}
-						if (volume > 1.0F) {
-							volume = 1.0F;
-						}
-
-						soundSystem.setPitch(soundID, pitch * entry.pitch);
-						soundSystem.setVolume(soundID, volume * SoundCategoryHelper.getEffectiveVolume(category, this.options) * entry.volume);
-						soundSystem.play(soundID);
+					} else if (entry.type == SoundEntry.Type.EVENT) {
+						playSoundWithIdAtPos(entry.name, category, x, y, z, volume * entry.volume, pitch * entry.pitch, soundID, false);
 					}
-				} else if (entry.type == SoundEntry.Type.EVENT) {
-					playSoundWithIdAtPos(entry.name, category, x, y, z, volume * entry.volume, pitch * entry.pitch, soundID, false);
 				}
 				if (allowSubtitle && entry.parent.hasSubtitle()) {
 					this.mc.subtitleTracker.heardSound(entry.parent, x, y, z);
diff --git a/game/client/src/main/java/net/minecraft/client/util/helper/ItemDragHandler.java b/game/client/src/main/java/net/minecraft/client/util/helper/ItemDragHandler.java
index 2127c1808..62b0c16da 100644
--- a/game/client/src/main/java/net/minecraft/client/util/helper/ItemDragHandler.java
+++ b/game/client/src/main/java/net/minecraft/client/util/helper/ItemDragHandler.java
@@ -128,6 +128,9 @@ public class ItemDragHandler extends Gui {
 	
 	public void mouseEvent(final int x, final int y, int button, boolean pressed) {
 		boolean shift = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT);
+		if (button == 10) {
+			shift = true;
+		}
 		boolean control = Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL);
 		boolean alt = Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU);
 		boolean space = Keyboard.isKeyDown(Keyboard.KEY_SPACE);
diff --git a/game/client/src/main/java/net/minecraft/client/util/helper/JavaProcess.java b/game/client/src/main/java/net/minecraft/client/util/helper/JavaProcess.java
new file mode 100644
index 000000000..598002f99
--- /dev/null
+++ b/game/client/src/main/java/net/minecraft/client/util/helper/JavaProcess.java
@@ -0,0 +1,39 @@
+package net.minecraft.client.util.helper;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+// From https://stackoverflow.com/questions/636367/executing-a-java-application-in-a-separate-process
+public final class JavaProcess {
+
+    private JavaProcess() {}
+
+    public static int exec(final Class klass, final Collection<String> args) throws IOException,
+        InterruptedException {
+        final String javaHome = System.getProperty("java.home");
+        final String javaBin = javaHome +
+            File.separator + "bin" +
+            File.separator + "java";
+        final String classpath = System.getProperty("java.class.path");
+        final String className = klass.getName();
+
+        final List<String> command = new LinkedList<>();
+        command.add(javaBin);
+        command.add("-cp");
+        command.add(classpath);
+        command.add(className);
+        if (args != null) {
+            command.addAll(args);
+        }
+
+        final ProcessBuilder builder = new ProcessBuilder(command);
+
+        final Process process = builder.inheritIO().start();
+        process.waitFor();
+        return process.exitValue();
+    }
+
+}
diff --git a/game/client/src/main/resources/assets/minecraft/models/entity/secret.geo.json b/game/client/src/main/resources/assets/minecraft/models/entity/secret.geo.json
index c4e90d15c..1e0264592 100644
--- a/game/client/src/main/resources/assets/minecraft/models/entity/secret.geo.json
+++ b/game/client/src/main/resources/assets/minecraft/models/entity/secret.geo.json
@@ -448,40 +448,9 @@
 						{"origin": [-4, 24, -4], "size": [8, 8, 8], "inflate": 0.25, "uv": [32, 0]}
 					]
 				},
-				{
-					"name": "rightLeg",
-					"parent": "body",
-					"pivot": [-1.9, 12, 0],
-					"cubes": [
-						{"origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 16]}
-					]
-				},
-				{
-					"name": "rightPant",
-					"parent": "rightLeg",
-					"pivot": [-2, 6, 0],
-					"cubes": [
-						{"origin": [-4, 0, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [0, 32]}
-					]
-				},
-				{
-					"name": "leftLeg",
-					"parent": "body",
-					"pivot": [1.9, 12, 0],
-					"cubes": [
-						{"origin": [0, 0, -2], "size": [4, 12, 4], "uv": [16, 48]}
-					]
-				},
-				{
-					"name": "leftPant",
-					"parent": "leftLeg",
-					"pivot": [2, 6, 0],
-					"cubes": [
-						{"origin": [0, 0, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [0, 48]}
-					]
-				},
 				{
 					"name": "bone",
+					"parent": "head",
 					"pivot": [9, 30, -7],
 					"rotation": [-12.5, 0, 0],
 					"cubes": [
@@ -540,6 +509,38 @@
 							}
 						}
 					]
+				},
+				{
+					"name": "rightLeg",
+					"parent": "body",
+					"pivot": [-1.9, 12, 0],
+					"cubes": [
+						{"origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 16]}
+					]
+				},
+				{
+					"name": "rightPant",
+					"parent": "rightLeg",
+					"pivot": [-2, 6, 0],
+					"cubes": [
+						{"origin": [-4, 0, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [0, 32]}
+					]
+				},
+				{
+					"name": "leftLeg",
+					"parent": "body",
+					"pivot": [1.9, 12, 0],
+					"cubes": [
+						{"origin": [0, 0, -2], "size": [4, 12, 4], "uv": [16, 48]}
+					]
+				},
+				{
+					"name": "leftPant",
+					"parent": "leftLeg",
+					"pivot": [2, 6, 0],
+					"cubes": [
+						{"origin": [0, 0, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [0, 48]}
+					]
 				}
 			],
 			"item_display_transforms": {
diff --git a/game/client/src/main/resources/assets/minecraft/textures/block/sapling/oak.png b/game/client/src/main/resources/assets/minecraft/textures/block/sapling/oak.png
index e08e44b9e..810adf31b 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/block/sapling/oak.png and b/game/client/src/main/resources/assets/minecraft/textures/block/sapling/oak.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/black.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/black.png
new file mode 100644
index 000000000..29afa7479
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/black.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/blue.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/blue.png
new file mode 100644
index 000000000..2f8d3b328
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/blue.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/brown.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/brown.png
new file mode 100644
index 000000000..99db107a0
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/brown.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/cyan.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/cyan.png
new file mode 100644
index 000000000..7b6e8cf78
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/cyan.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/gray.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/gray.png
new file mode 100644
index 000000000..6a2addd30
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/gray.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/green.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/green.png
new file mode 100644
index 000000000..bf8f431e8
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/green.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/lightblue.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/lightblue.png
new file mode 100644
index 000000000..8097cd2b2
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/lightblue.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/lime.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/lime.png
new file mode 100644
index 000000000..79e6e9ed4
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/lime.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/magenta.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/magenta.png
new file mode 100644
index 000000000..384e502e3
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/magenta.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/orange.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/orange.png
new file mode 100644
index 000000000..8432325c9
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/orange.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/pink.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/pink.png
new file mode 100644
index 000000000..3d49858bb
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/pink.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/purple.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/purple.png
new file mode 100644
index 000000000..c000d2d22
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/purple.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/red.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/red.png
new file mode 100644
index 000000000..9c0ed3291
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/red.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/silver.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/silver.png
new file mode 100644
index 000000000..cfd0707b6
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/silver.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/white.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/white.png
new file mode 100644
index 000000000..bf01ca622
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/white.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/entity/sign/yellow.png b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/yellow.png
new file mode 100644
index 000000000..101abb418
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/entity/sign/yellow.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/afk.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/afk.png
index 10a208512..afc0d24b0 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/afk.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/afk.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_down.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_down.png
index 0c491cc38..18c3d82c8 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_down.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_down.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_left.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_left.png
index 0ea1cd0ef..88bac6d03 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_left.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_left.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_right.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_right.png
index 268d1cb5f..21e81ee65 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_right.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_up.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_up.png
index 17f9f0125..8fb73acab 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_up.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_up.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrows_left_right.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrows_left_right.png
new file mode 100644
index 000000000..5ac81b2c1
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrows_left_right.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrows_up_down.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrows_up_down.png
new file mode 100644
index 000000000..e2f54c2a1
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrows_up_down.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/axe.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/axe.png
index 21917251c..855038c76 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/axe.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/axe.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/barricade.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/barricade.png
index fa2ba0bd6..73145a44a 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/barricade.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/barricade.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/big_sign.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/big_sign.png
index 71fd6979c..ff9d45ab3 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/big_sign.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/big_sign.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/bowl.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/bowl.png
index 0950f2fa7..a9dac9ac9 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/bowl.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/bowl.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/brb.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/brb.png
index 4e8b2263b..cc7c0cec4 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/brb.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/brb.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/caution.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/caution.png
index f1c524dbb..33a84a512 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/caution.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/caution.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/check.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/check.png
new file mode 100644
index 000000000..baa769a30
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/check.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/chest.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/chest.png
index 2f2e37b21..0f9264bfc 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/chest.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/chest.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/craft.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/craft.png
index 36563d486..15cfdcd7e 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/craft.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/craft.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/cross.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/cross.png
index 4be4d9cb9..1c4008ce3 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/cross.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/cross.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/exit.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/exit.png
new file mode 100644
index 000000000..dfd50e291
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/exit.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_confused.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_confused.png
index 75ccc7bd1..286bcae2f 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_confused.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_confused.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_crying.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_crying.png
index a14e28804..d4f86b11e 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_crying.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_crying.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_gasp.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_gasp.png
index 9f6854560..1efb13c77 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_gasp.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_gasp.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_sad.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_sad.png
index 0620b3713..6d8c64690 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_sad.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_sad.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_smile.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_smile.png
index 7f6dfd425..7160c6224 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_smile.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_smile.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_thinking.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_thinking.png
index 8aaa623ce..7036ba809 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_thinking.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/face_thinking.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/farm.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/farm.png
index fbcaa059c..f800a3d86 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/farm.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/farm.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/heart.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/heart.png
index cd61d01e6..b428e7ed3 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/heart.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/heart.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/hoe.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/hoe.png
index b5850b3c3..0febb1d9d 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/hoe.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/hoe.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mine.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mine.png
index bc7429476..174999d5b 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mine.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mine.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_creeper.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_creeper.png
index a19ff9996..724655e79 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_creeper.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_creeper.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_farm.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_farm.png
index 5479c4a73..f5ed89e9f 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_farm.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_farm.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_skeleton.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_skeleton.png
index 7798c9126..022badc37 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_skeleton.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_skeleton.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_zombie.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_zombie.png
index e4b14313a..dfd33ceec 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_zombie.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mob_zombie.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mobs.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mobs.png
index 0bd3693ac..7fd8c0b68 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mobs.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/mobs.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/none.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/none.png
index 78aafa7f4..601d5c3b8 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/none.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/none.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/one_player.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/one_player.png
index 1089bd027..01d445481 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/one_player.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/one_player.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/pickaxe.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/pickaxe.png
index d613d7bff..e45507249 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/pickaxe.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/pickaxe.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/question_mark.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/question_mark.png
index 504e390ab..4cbfeafff 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/question_mark.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/question_mark.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/redstone.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/redstone.png
index dba3b0a7b..de572e9e1 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/redstone.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/redstone.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/shovel.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/shovel.png
index 0603e3d22..8ffd74c9e 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/shovel.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/shovel.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/sword.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/sword.png
index 9765d462e..39b87d0bd 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/sword.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/sword.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/three_players.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/three_players.png
index 5a523f7e7..e20a8921c 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/three_players.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/three_players.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/tnt.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/tnt.png
index 6ae648706..d045c0d82 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/tnt.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/tnt.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/trees.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/trees.png
index 291148b8a..45e1f0864 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/trees.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/trees.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/two_players.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/two_players.png
index eaec6f472..d3f54db64 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/two_players.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/two_players.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/wolf.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/wolf.png
index 3a5ca5f2c..1bf31f044 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/wolf.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/wolf.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/black.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/black.png
new file mode 100644
index 000000000..70b2ae017
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/black.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/blue.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/blue.png
new file mode 100644
index 000000000..bf4c6d879
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/blue.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/brown.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/brown.png
new file mode 100644
index 000000000..5f58da005
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/brown.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/cyan.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/cyan.png
new file mode 100644
index 000000000..df7f32d53
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/cyan.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/gray.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/gray.png
new file mode 100644
index 000000000..89801bd98
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/gray.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/green.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/green.png
new file mode 100644
index 000000000..303fe6b42
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/green.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/lightblue.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/lightblue.png
new file mode 100644
index 000000000..721d4eb1b
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/lightblue.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/lime.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/lime.png
new file mode 100644
index 000000000..205b0ebcb
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/lime.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/magenta.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/magenta.png
new file mode 100644
index 000000000..6b98dcd49
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/magenta.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/orange.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/orange.png
new file mode 100644
index 000000000..cf0db0c85
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/orange.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/pink.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/pink.png
new file mode 100644
index 000000000..43bbdfd54
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/pink.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/purple.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/purple.png
new file mode 100644
index 000000000..7781fb9b1
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/purple.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/red.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/red.png
new file mode 100644
index 000000000..09323f74e
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/red.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/silver.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/silver.png
new file mode 100644
index 000000000..8d851247f
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/silver.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/white.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/white.png
new file mode 100644
index 000000000..17b8d71e6
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/white.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/item/sign/yellow.png b/game/client/src/main/resources/assets/minecraft/textures/item/sign/yellow.png
new file mode 100644
index 000000000..9f1d32acd
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/item/sign/yellow.png differ
diff --git a/game/client/src/main/resources/credits.txt b/game/client/src/main/resources/credits.txt
index 88207485c..ea57ae3f0 100644
--- a/game/client/src/main/resources/credits.txt
+++ b/game/client/src/main/resources/credits.txt
@@ -21,9 +21,14 @@ Cookie Cakes
 Jej Chainstar
 Orknarok_666 (@derperu)
 
+*Community Helpers
+azure (@azurelmao)
+bones (@frazzelbones)
+Crowbar
+Cruxy
+
 *Special Thanks
 AndroidDr (@Pedro270707)
-bones (@frazzelbones)
 DirtPiper
 Doop (@brokendoop)
 H2_AIL
diff --git a/game/core/build.gradle.kts b/game/core/build.gradle.kts
index f764ce40f..c084dc811 100644
--- a/game/core/build.gradle.kts
+++ b/game/core/build.gradle.kts
@@ -21,6 +21,15 @@ run {
 repositories {
     mavenCentral()
     maven("https://libraries.minecraft.net/")
+
+    ivy {
+        url = uri("https://github.com/Better-than-Adventure")
+        patternLayout {
+            artifact("[organisation]/releases/download/[revision]/brigadier-[revision].jar")
+            m2Compatible
+        }
+        metadataSources { artifact() }
+    }
 }
 
 dependencies {
@@ -40,6 +49,7 @@ dependencies {
 
 }
 
+
 java {
     sourceCompatibility = JavaVersion.VERSION_1_8
     targetCompatibility = JavaVersion.VERSION_1_8
diff --git a/game/core/src/main/java/net/minecraft/core/BuildChannel.java b/game/core/src/main/java/net/minecraft/core/BuildChannel.java
index ea4e79ceb..3ed54d0d4 100644
--- a/game/core/src/main/java/net/minecraft/core/BuildChannel.java
+++ b/game/core/src/main/java/net/minecraft/core/BuildChannel.java
@@ -1,17 +1,17 @@
 package net.minecraft.core;
 
 public enum BuildChannel {
-    STABLE,
+    RELEASE,
     PRERELEASE,
     DEVELOPMENT,
     NIGHTLY;
 
     public boolean isUnstableBuild() {
-        return this != STABLE;
+        return this != RELEASE;
     }
 
     public String modifyVersionString(String version) {
-        if (this == STABLE || this == PRERELEASE) {
+        if (this == RELEASE || this == PRERELEASE) {
             return version;
         } else if (this == DEVELOPMENT) {
             return version + " INDEV";
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicBasket.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicBasket.java
index 1b8ffb04e..2df4076e4 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicBasket.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicBasket.java
@@ -8,6 +8,7 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
@@ -54,7 +55,7 @@ public class BlockLogicBasket extends BlockLogic
     {
         final TileEntityBasket te = (TileEntityBasket) world.getTileEntity(x, y, z);
 
-        final float fill = te.getNumUnitsInside() / (float)te.getMaxUnits();
+        final float fill = MathHelper.clamp(te.getNumUnitsInside() / (float)te.getMaxUnits(), 0, 1); // Clamps the visual effect even if the basket gets overstuffed
 
         return (int) Math.ceil(10 * fill);
     }
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicChest.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicChest.java
index 8ad5f97f7..cbbf2dfc6 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicChest.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicChest.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.block;
 
 import com.mojang.logging.LogUtils;
+import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.entity.TileEntityChest;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Mob;
@@ -408,7 +409,8 @@ public class BlockLogicChest extends BlockLogic implements IPaintable {
 	@Override
 	public void setColor(World world, int x, int y, int z, DyeColor color) {
 		final int meta = world.getBlockMetadata(x, y, z);
-		world.setBlockAndMetadata(x, y, z, Blocks.CHEST_PLANKS_OAK_PAINTED.id(), meta);
+		world.setBlockAndMetadataRaw(x, y, z, Blocks.CHEST_PLANKS_OAK_PAINTED.id(), meta);
+		world.setBlockMetadata(x, y, z, meta);
 		Blocks.CHEST_PLANKS_OAK_PAINTED.getLogic().setColor(world, x, y, z, color);
 	}
 
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicGlowStone.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicGlowStone.java
index 00691447e..9a6419f3c 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicGlowStone.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicGlowStone.java
@@ -25,7 +25,7 @@ public class BlockLogicGlowStone extends BlockLogic
             case SILK_TOUCH:
                 return new ItemStack[] { new ItemStack(this) };
             default:
-                return new ItemStack[] { new ItemStack(Items.DUST_GLOWSTONE, 2 + world.rand.nextInt(2)) };
+                return new ItemStack[] { new ItemStack(Items.DUST_GLOWSTONE, 4) };
         }
     }
     
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicLayerSnow.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicLayerSnow.java
index 081207a22..54ee250b7 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicLayerSnow.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicLayerSnow.java
@@ -5,8 +5,11 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.enums.LightLayer;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
+import net.minecraft.core.world.WorldSource;
 
 import java.util.Random;
 
@@ -53,6 +56,13 @@ public class BlockLogicLayerSnow extends BlockLogicLayerBase
         }
     }
 
+    @Override
+    public AABB getCollisionBoundingBoxFromPool(final WorldSource world, final int x, final int y, final int z) {
+        final AABB aabb = super.getCollisionBoundingBoxFromPool(world, x, y, z);
+        aabb.maxY = Math.max(aabb.maxY - 2/16f, y);
+        return aabb;
+    }
+
     @Override
 	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
     {
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicMoss.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicMoss.java
index 00f2150aa..9787d6a11 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicMoss.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicMoss.java
@@ -6,6 +6,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
+import net.minecraft.core.world.generate.feature.WorldFeatureOre;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.HashMap;
@@ -14,7 +15,7 @@ import java.util.Map.Entry;
 import java.util.Random;
 
 public class BlockLogicMoss extends BlockLogic implements IBonemealable {
-	public static Map<Integer, Integer> variantMap = new HashMap<>();
+	public static WorldFeatureOre.OreMap variantMap = new WorldFeatureOre.OreMap();
 	public BlockLogicMoss(Block<?> block, Block<?> parentBlock) {
 		super(block, Material.moss);
 		block.setTicking(true);
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicNote.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicNote.java
index f8be60f35..858749eee 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicNote.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicNote.java
@@ -47,7 +47,7 @@ public class BlockLogicNote extends BlockLogic
     public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
         if (!world.isClientSide) {
-            changePitch(world, x, y, z);
+            changePitch(world, x, y, z, player.isSneaking() ? -1 : 1);
             triggerNote(world, x, y, z);
         }
         return true;
@@ -55,7 +55,7 @@ public class BlockLogicNote extends BlockLogic
 
     @Override
     public void onActivatorInteract(World world, int x, int y, int z, TileEntityActivator activator, Direction direction) {
-        changePitch(world, x, y, z);
+        changePitch(world, x, y, z, 1);
         triggerNote(world, x, y, z);
     }
 
@@ -67,9 +67,9 @@ public class BlockLogicNote extends BlockLogic
         }
     }
 
-    public void changePitch(World world, int x, int y, int z) {
+    public void changePitch(World world, int x, int y, int z, int delta) {
         int meta = world.getBlockMetadata(x, y, z);
-        world.setBlockMetadata(x, y, z, setNote(meta, (getNote(meta) + 1) % (MAX_NOTE + 1)));
+        world.setBlockMetadata(x, y, z, setNote(meta, (getNote(meta) + (MAX_NOTE + 1) + delta) % (MAX_NOTE + 1)));
     }
 
     public void triggerNote(World world, int x, int y, int z) {
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreCoal.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreCoal.java
index 4664fdd7a..7b638b37e 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreCoal.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreCoal.java
@@ -6,13 +6,14 @@ import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
+import net.minecraft.core.world.generate.feature.WorldFeatureOre;
 
 import java.util.HashMap;
 import java.util.Map;
 
 public class BlockLogicOreCoal extends BlockLogic
 {
-    public static Map<Integer, Integer> variantMap = new HashMap<>();
+    public static WorldFeatureOre.OreMap variantMap = new WorldFeatureOre.OreMap();
 
     public BlockLogicOreCoal(Block<?> block, Block<?> parentBlock, Material material){
         super(block, material);
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreDiamond.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreDiamond.java
index 1d13014cc..e25b350f6 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreDiamond.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreDiamond.java
@@ -6,13 +6,14 @@ import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
+import net.minecraft.core.world.generate.feature.WorldFeatureOre;
 
 import java.util.HashMap;
 import java.util.Map;
 
 public class BlockLogicOreDiamond extends BlockLogic
 {
-    public static Map<Integer, Integer> variantMap = new HashMap<>();
+    public static WorldFeatureOre.OreMap variantMap = new WorldFeatureOre.OreMap();
     public BlockLogicOreDiamond(Block<?> block, Block<?> parentBlock, Material material)
     {
         super(block, material);
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreGold.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreGold.java
index 28905c573..2bb4211df 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreGold.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreGold.java
@@ -6,13 +6,14 @@ import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
+import net.minecraft.core.world.generate.feature.WorldFeatureOre;
 
 import java.util.HashMap;
 import java.util.Map;
 
 
 public class BlockLogicOreGold extends BlockLogic {
-    public static Map<Integer, Integer> variantMap = new HashMap<>();
+    public static WorldFeatureOre.OreMap variantMap = new WorldFeatureOre.OreMap();
 
     public BlockLogicOreGold(Block<?> block, Block<?> parentBlock, Material material) {
         super(block, material);
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreIron.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreIron.java
index 242dede8f..80a828668 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreIron.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreIron.java
@@ -6,13 +6,14 @@ import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
+import net.minecraft.core.world.generate.feature.WorldFeatureOre;
 
 import java.util.HashMap;
 import java.util.Map;
 
 public class BlockLogicOreIron extends BlockLogic
 {
-    public static Map<Integer, Integer> variantMap = new HashMap<>();
+    public static WorldFeatureOre.OreMap variantMap = new WorldFeatureOre.OreMap();
     public BlockLogicOreIron(Block<?> block, Block<?> parentBlock, Material material) {
         super(block, material);
         variantMap.put(parentBlock.id(), block.id());
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreLapis.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreLapis.java
index dbfcc4240..228954fe8 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreLapis.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreLapis.java
@@ -7,13 +7,14 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.world.World;
+import net.minecraft.core.world.generate.feature.WorldFeatureOre;
 
 import java.util.HashMap;
 import java.util.Map;
 
 public class BlockLogicOreLapis extends BlockLogic
 {
-    public static Map<Integer, Integer> variantMap = new HashMap<>();
+    public static WorldFeatureOre.OreMap variantMap = new WorldFeatureOre.OreMap();
     public BlockLogicOreLapis(Block<?> block, Block<?> parentBlock, Material material)
     {
         super(block, material);
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreRedstone.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreRedstone.java
index 858cdf7e0..e5057d4bf 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreRedstone.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicOreRedstone.java
@@ -1,32 +1,30 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.block.entity.TileEntity;
+import net.minecraft.core.block.entity.TileEntityActivator;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
+import net.minecraft.core.world.generate.feature.WorldFeatureOre;
+import net.minecraft.core.world.WorldSource;
 
-import java.util.HashMap;
-import java.util.Map;
 import java.util.Random;
 
 public class BlockLogicOreRedstone extends BlockLogic
 {
-    public static Map<Integer, Integer> variantMap = new HashMap<>();
+    public static WorldFeatureOre.OreMap variantMap = new WorldFeatureOre.OreMap();
     private final boolean illuminated;
     private final Block<?> normalBlock;
     private final Block<?> illuminatedBlock;
     public BlockLogicOreRedstone(Block<?> block, Block<?> parentBlock, Material material, boolean illuminated, Block<?> normalBlock, Block<?> illuminatedBlock)
     {
         super(block, material);
-        if(illuminated)
-        {
-            block.setTicking(true);
-        }
         this.illuminated = illuminated;
         this.normalBlock = normalBlock;
         this.illuminatedBlock = illuminatedBlock;
@@ -48,6 +46,17 @@ public class BlockLogicOreRedstone extends BlockLogic
         super.onBlockLeftClicked(world, x, y, z, player, side, xHit, yHit);
     }
 
+    @Override
+    public boolean onBlockRightClicked(final World world, final int x, final int y, final int z, final Player player, final Side side, final double xHit, final double yHit) {
+        lightRedstone(world, x, y, z);
+        return false;
+    }
+
+    @Override
+    public void onActivatorInteract(final World world, final int x, final int y, final int z, final TileEntityActivator activator, final Direction direction) {
+        lightRedstone(world, x, y, z);
+    }
+
     @Override
     public void onEntityWalking(World world, int x, int y, int z, Entity entity)
     {
@@ -61,7 +70,8 @@ public class BlockLogicOreRedstone extends BlockLogic
         spawnParticles(world, x, y, z);
         if (!illuminated)
         {
-        	world.setBlockWithNotify(x, y, z, illuminatedBlock.id());
+            world.scheduleBlockUpdate(x, y, z, illuminatedBlock.id(), 20 + world.rand.nextInt(9 * 20));
+            world.setBlockWithNotify(x, y, z, illuminatedBlock.id());
         }
     }
 
@@ -74,6 +84,21 @@ public class BlockLogicOreRedstone extends BlockLogic
         }
     }
 
+    @Override
+    public boolean getSignal(final WorldSource worldSource, final int x, final int y, final int z, final Side side) {
+        return this.illuminated;
+    }
+
+    @Override
+    public boolean getDirectSignal(final World world, final int x, final int y, final int z, final Side side) {
+        return false;
+    }
+
+    @Override
+    public boolean isSignalSource() {
+        return true;
+    }
+
     @Override
     public ItemStack[] getBreakResult(World world, EnumDropCause dropCause, int meta, TileEntity tileEntity)
     {
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicRail.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicRail.java
index d97bc0ea8..9781fe381 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicRail.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicRail.java
@@ -186,7 +186,7 @@ public class BlockLogicRail extends BlockLogic {
         }
 
         if(isConnectedPoweredRail2(world, nextX, nextY, nextZ, forward, distance, axis)) { return true; }
-        return railDirection.isStraight() && isConnectedPoweredRail2(world, nextX, nextY - 1, nextZ, forward, distance, axis);
+        return isConnectedPoweredRail2(world, nextX, nextY - 1, nextZ, forward, distance, axis);
     }
 
     private boolean isConnectedPoweredRail2(World world, int x, int y, int z, boolean forward, int distance, Axis axis) {
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicSign.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicSign.java
index 0a59a9ea1..dc45de160 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicSign.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicSign.java
@@ -7,14 +7,16 @@ import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.WorldSource;
 
-public class BlockLogicSign extends BlockLogic
+public class BlockLogicSign extends BlockLogic implements IPaintable
 {
+    public static final int MASK_SIDE = 0b0000_1111;
     public static final int SIDE_NORTH = 2;
     public static final int SIDE_SOUTH = 3;
     public static final int SIDE_WEST = 4;
@@ -47,7 +49,7 @@ public class BlockLogicSign extends BlockLogic
         float top = 12.5f / 16f;
         float width = 16f / 16f;
         float thickness = 2.0f / 16f;
-        switch (world.getBlockMetadata(x, y, z)) {
+        switch (world.getBlockMetadata(x, y, z) & MASK_SIDE) {
             case SIDE_NORTH:
                 return AABB.getTemporaryBB(0.0F, bottom, 1.0F - thickness, width, top, 1.0F);
             case SIDE_SOUTH:
@@ -85,7 +87,7 @@ public class BlockLogicSign extends BlockLogic
             }
         } else
         {
-            switch (world.getBlockMetadata(x, y, z)) {
+            switch (world.getBlockMetadata(x, y, z) & MASK_SIDE) {
                 case SIDE_NORTH:
                     isUnstable = !world.getBlockMaterial(x, y, z + 1).isSolid();
                     break;
@@ -125,7 +127,7 @@ public class BlockLogicSign extends BlockLogic
                 }
                 player.addStat(Achievements.LIGHT_SIGN, 1);
                 return true;
-            } else if (player.getHeldItem() != null && player.getHeldItem().itemID == Items.DYE.id) {
+            } else if (player.getHeldItem() != null && (player.getHeldItem().itemID == Items.DYE.id || player.getHeldItem().itemID == Items.PAINTBRUSH.id)) {
                 return false;
             } else if (signEntity.isEditableBy(player)) {
                 player.displaySignEditorScreen(signEntity);
@@ -139,4 +141,10 @@ public class BlockLogicSign extends BlockLogic
     public int getPistonPushReaction(World world, int x, int y, int z) {
         return Material.PISTON_DESTROY_ON_PUSH;
     }
+
+    @Override
+    public void setColor(World world, int x, int y, int z, DyeColor color) {
+        world.setBlockRaw(x, y, z, this.isFreeStanding ? Blocks.SIGN_POST_PLANKS_OAK_PAINTED.id() : Blocks.SIGN_WALL_PLANKS_OAK_PAINTED.id());
+        world.setBlockMetadataWithNotify(x, y, z, color.blockMeta << 4 | (world.getBlockMetadata(x, y, z) & MASK_SIDE));
+    }
 }
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicSignPainted.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicSignPainted.java
new file mode 100644
index 000000000..7860a4b14
--- /dev/null
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicSignPainted.java
@@ -0,0 +1,36 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.util.helper.DyeColor;
+import net.minecraft.core.world.World;
+
+public class BlockLogicSignPainted extends BlockLogicSign implements IPainted{
+    public static final int MASK_COLOR = 0b1111_0000;
+    public BlockLogicSignPainted(Block<?> block, boolean isFreeStanding) {
+        super(block, isFreeStanding);
+    }
+
+    @Override
+    public DyeColor fromMetadata(int meta) {
+        return DyeColor.colorFromBlockMeta((meta & MASK_COLOR) >> 4);
+    }
+
+    @Override
+    public int toMetadata(DyeColor color) {
+        return color.blockMeta << 4;
+    }
+
+    @Override
+    public int stripColorFromMetadata(int meta) {
+        return meta & ~MASK_COLOR;
+    }
+
+    @Override
+    public void removeDye(World world, int x, int y, int z) {
+        world.setBlockMetadata(x, y, z, stripColorFromMetadata(world.getBlockMetadata(x, y, z)));
+    }
+
+    @Override
+    public void setColor(World world, int x, int y, int z, DyeColor color) {
+        world.setBlockMetadataWithNotify(x, y, z, color.blockMeta << 4 | stripColorFromMetadata(world.getBlockMetadata(x, y, z)));
+    }
+}
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicSponge.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicSponge.java
index ae5ae401e..f66b663ac 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicSponge.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicSponge.java
@@ -23,7 +23,7 @@ public class BlockLogicSponge extends BlockLogic
     {
         super.onBlockPlacedByWorld(world, x, y, z);
         byte byte0 = 2;
-        if(world.dimension == Dimension.NETHER && isWet){
+        if((world.dimension == Dimension.NETHER || inHot(world, x, y, z)) && isWet){
             world.setBlockWithNotify(x, y, z, Blocks.SPONGE_DRY.id());
             world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, x + 0.5D, y + 0.5D, z + 0.5D, "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
             for(int l = 0; l < 8; l++)
@@ -63,6 +63,23 @@ public class BlockLogicSponge extends BlockLogic
         return false;
     }
 
+    public boolean inHot(World world, int x, int y, int z){
+        Block<?> b;
+        if (Blocks.hasTag(b = world.getBlock(x + 1, y, z), BlockTags.IS_LAVA) || b == Blocks.COBBLE_NETHERRACK_IGNEOUS)
+            return true;
+        if (Blocks.hasTag(b = world.getBlock(x - 1, y, z), BlockTags.IS_LAVA) || b == Blocks.COBBLE_NETHERRACK_IGNEOUS)
+            return true;
+        if (Blocks.hasTag(b = world.getBlock(x, y + 1, z), BlockTags.IS_LAVA) || b == Blocks.COBBLE_NETHERRACK_IGNEOUS)
+            return true;
+        if (Blocks.hasTag(b = world.getBlock(x, y - 1, z), BlockTags.IS_LAVA) || b == Blocks.COBBLE_NETHERRACK_IGNEOUS)
+            return true;
+        if (Blocks.hasTag(b = world.getBlock(x, y , z + 1), BlockTags.IS_LAVA) || b == Blocks.COBBLE_NETHERRACK_IGNEOUS)
+            return true;
+        if (Blocks.hasTag(b = world.getBlock(x, y , z - 1), BlockTags.IS_LAVA) || b == Blocks.COBBLE_NETHERRACK_IGNEOUS)
+            return true;
+        return false;
+    }
+
     @Override
     public void onBlockRemoved(World world, int x, int y, int z, int data)
     {
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicTrapDoor.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicTrapDoor.java
index f8b623f48..a92405fd2 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicTrapDoor.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicTrapDoor.java
@@ -115,7 +115,7 @@ public class BlockLogicTrapDoor extends BlockLogic implements IPaintable {
         }
 
         Block<?> block = Blocks.getBlock(blockId);
-        if (block == null || block.isSignalSource()) {
+        if ((material != Material.metal && material != Material.steel && block != null && block.isSignalSource()) || ((material == Material.metal || material == Material.steel) && (block == null || block.isSignalSource()))) {
             int meta = world.getBlockMetadata(x, y, z);
             boolean isOpened = isTrapdoorOpen(meta);
             boolean isPowered = world.hasNeighborSignal(x, y, z);
diff --git a/game/core/src/main/java/net/minecraft/core/block/Blocks.java b/game/core/src/main/java/net/minecraft/core/block/Blocks.java
index 28381d39e..6007f9098 100644
--- a/game/core/src/main/java/net/minecraft/core/block/Blocks.java
+++ b/game/core/src/main/java/net/minecraft/core/block/Blocks.java
@@ -994,6 +994,13 @@ public final class Blocks {
         .withSound(BlockSounds.WOOD).withHardness(1.0F).setStatParent(() -> Items.FLAG)
         .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
 
+    public static final Block<BlockLogicSignPainted> SIGN_POST_PLANKS_OAK_PAINTED = register("sign.post.planks.oak.painted", "minecraft:block/sign_post_planks_oak_painted", 713, (BlockLogicSupplier<BlockLogicSignPainted>)(b) -> new BlockLogicSignPainted(b, true))
+        .withSound(BlockSounds.WOOD).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> Items.SIGN)
+        .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+    public static final Block<BlockLogicSignPainted> SIGN_WALL_PLANKS_OAK_PAINTED = register("sign.wall.planks.oak.painted", "minecraft:block/sign_wall_planks_oak_painted", 714, (BlockLogicSupplier<BlockLogicSignPainted>)(b) -> new BlockLogicSignPainted(b, false))
+        .withSound(BlockSounds.WOOD).withHardness(1.0F).withDisabledNeighborNotifyOnMetadataChange().setStatParent(() -> SIGN_POST_PLANKS_OAK)
+        .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_AXE);
+
     public static final Block<BlockLogicLayerSnow> LAYER_SNOW = register("layer.snow", "minecraft:block/layer_snow", 720, (BlockLogicSupplier<BlockLogicLayerSnow>)(b) -> new BlockLogicLayerSnow(b, Blocks.BLOCK_SNOW, Material.topSnow))
         .withSound(BlockSounds.CLOTH).withHardness(0.1F).withLitInteriorSurface(true)
         .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.MINEABLE_BY_SHOVEL, BlockTags.OVERRIDE_STEPSOUND);
@@ -1362,4 +1369,10 @@ public final class Blocks {
         if (block == null) return false;
         return block.hasTag(tag);
     }
+
+    public static boolean hasTag(@Nullable Block<?> block, Tag<Block<?>> tag)
+    {
+        if (block == null) return false;
+        return block.hasTag(tag);
+    }
 }
diff --git a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityTrommel.java b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityTrommel.java
index 1fceada04..f6e0a888b 100644
--- a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityTrommel.java
+++ b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityTrommel.java
@@ -169,6 +169,7 @@ public class TileEntityTrommel extends TileEntity
     @Override
 	public void tick()
     {
+        boolean isClient = worldObj == null ? carriedBlock.holder.world.isClientSide : worldObj.isClientSide;
         if(nextToSieve > 4)
             nextToSieve = 1;
         boolean isBurning = burnTime > 0;
@@ -177,7 +178,7 @@ public class TileEntityTrommel extends TileEntity
         {
             burnTime--;
         }
-        if(worldObj == null || !worldObj.isClientSide)
+        if(!isClient)
         {
         	if(worldObj == null || worldObj.getBlockId(x, y, z) == Blocks.TROMMEL_IDLE.id()) {
             	if(currentItemBurnTime == 0 && itemStacks[0] == null) {
diff --git a/game/core/src/main/java/net/minecraft/core/crafting/LookupFuelFurnace.java b/game/core/src/main/java/net/minecraft/core/crafting/LookupFuelFurnace.java
index f8250a653..b086c770c 100644
--- a/game/core/src/main/java/net/minecraft/core/crafting/LookupFuelFurnace.java
+++ b/game/core/src/main/java/net/minecraft/core/crafting/LookupFuelFurnace.java
@@ -73,6 +73,7 @@ public class LookupFuelFurnace {
 
 		addFuelEntry(Items.BOAT.id, 300);
 		addFuelEntry(Items.DOOR_OAK.id, 300);
+		addFuelEntry(Items.DOOR_OAK_PAINTED.id, 300);
 		addFuelEntry(Items.SIGN.id, 300);
 		addFuelEntry(Items.BOWL.id, 300);
 		addFuelEntry(Items.TOOL_CALENDAR.id, 300);
diff --git a/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java b/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java
index 940c12e82..319bb69a7 100644
--- a/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java
+++ b/game/core/src/main/java/net/minecraft/core/data/registry/Registries.java
@@ -83,6 +83,8 @@ public class Registries extends Registry<Registry<?>>
         ITEM_GROUPS.register("minecraft:nethercoal_ores", stackListOf(Blocks.ORE_NETHERCOAL_NETHERRACK));
         {
             List<ItemStack> plankStackList = new ArrayList<>();
+            List<ItemStack> signStackList = new ArrayList<>();
+            List<ItemStack> doorStackList = new ArrayList<>();
             List<ItemStack> chestStackList = new ArrayList<>();
             List<ItemStack> stairsStackList = new ArrayList<>();
             List<ItemStack> slabsStackList = new ArrayList<>();
@@ -94,6 +96,8 @@ public class Registries extends Registry<Registry<?>>
             List<ItemStack> invertedLampStackList = new ArrayList<>();
 
             plankStackList.add(Blocks.PLANKS_OAK.getDefaultStack());
+            signStackList.add(Items.SIGN.getDefaultStack());
+            doorStackList.add(Items.DOOR_OAK.getDefaultStack());
             chestStackList.add(Blocks.CHEST_PLANKS_OAK.getDefaultStack());
             stairsStackList.add(Blocks.STAIRS_PLANKS_OAK.getDefaultStack());
             slabsStackList.add(Blocks.SLAB_PLANKS_OAK.getDefaultStack());
@@ -103,6 +107,8 @@ public class Registries extends Registry<Registry<?>>
 
             for (DyeColor color : DyeColor.values()) {
                 plankStackList.add(new ItemStack(Blocks.PLANKS_OAK_PAINTED, 1, color.blockMeta));
+                signStackList.add(new ItemStack(Items.SIGN_PAINTED, 1, color.itemMeta));
+                doorStackList.add(new ItemStack(Items.DOOR_OAK_PAINTED, 1, color.itemMeta));
                 chestStackList.add(new ItemStack(Blocks.CHEST_PLANKS_OAK_PAINTED, 1, color.blockMeta << 4));
                 stairsStackList.add(new ItemStack(Blocks.STAIRS_PLANKS_PAINTED, 1, color.blockMeta << 4));
                 slabsStackList.add(new ItemStack(Blocks.SLAB_PLANKS_PAINTED, 1, color.blockMeta << 4));
@@ -114,6 +120,8 @@ public class Registries extends Registry<Registry<?>>
                 invertedLampStackList.add(new ItemStack(Blocks.LAMP_INVERTED_ACTIVE, 1, color.blockMeta));
             }
             ITEM_GROUPS.register("minecraft:planks",plankStackList);
+            ITEM_GROUPS.register("minecraft:signs",signStackList);
+            ITEM_GROUPS.register("minecraft:doors",doorStackList);
             ITEM_GROUPS.register("minecraft:chests", chestStackList);
             ITEM_GROUPS.register("minecraft:wools", woolStackList);
             ITEM_GROUPS.register("minecraft:lamps", lampStackList);
diff --git a/game/core/src/main/java/net/minecraft/core/entity/monster/MobGhast.java b/game/core/src/main/java/net/minecraft/core/entity/monster/MobGhast.java
index fbeb64774..48348524d 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/monster/MobGhast.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/monster/MobGhast.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.entity.monster;
 
 import net.minecraft.core.WeightedRandomLootObject;
+import net.minecraft.core.block.Block;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.MobFlying;
 import net.minecraft.core.entity.player.Player;
@@ -279,9 +280,9 @@ public class MobGhast extends MobFlying
     {
         return
             this.world.getDifficulty().canHostileMobsSpawn() &&
-            this.random.nextInt(20) == 0 &&
-            BlockTags.NETHER_MOBS_SPAWN.appliesTo(this.world.getBlock(MathHelper.floor(this.x), MathHelper.floor(this.y), MathHelper.floor(this.z))) &&
-            super.canSpawnHere();
+                this.random.nextInt(20) == 0 &&
+                BlockTags.NETHER_MOBS_SPAWN.appliesTo(this.world.getBlock(MathHelper.floor(this.x), MathHelper.floor(this.y - this.heightOffset) - 1, MathHelper.floor(this.z))) &&
+                super.canSpawnHere();
     }
 
     @Override
diff --git a/game/core/src/main/java/net/minecraft/core/entity/player/Player.java b/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
index f35052c80..befe891c9 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
@@ -340,26 +340,13 @@ public abstract class Player
     @Override
 	public void rideTick()
     {
-        final double xdO = this.xd;
-        final double ydO = this.yd;
-        final double zdO = this.zd;
-        final double xo = this.x;
-        final double yo = this.y;
-        final double zo = this.z;
+        double xdO = x;
+        double ydO = y;
+        double zdO = z;
         super.rideTick();
-        this.cameraVelocityOld = this.cameraVelocity;
-        this.cameraVelocity = 0.0F;
-        addMountedMovementStat(this.x - xo, this.y - yo, this.z - zo);
-
-        if (this.vehicle instanceof Entity) {
-            this.xd = ((Entity) this.vehicle).xd;
-            this.yd = ((Entity) this.vehicle).yd;
-            this.zd = ((Entity) this.vehicle).zd;
-        }
-
-        this.xdO = xdO;
-        this.ydO = ydO;
-        this.zdO = zdO;
+        cameraVelocityOld = cameraVelocity;
+        cameraVelocity = 0.0F;
+        addMountedMovementStat(x - xdO, y - ydO, z - zdO);
     }
 
     @Override
@@ -808,6 +795,7 @@ public abstract class Player
 	public void readAdditionalSaveData(@NotNull CompoundTag tag)
     {
         super.readAdditionalSaveData(tag);
+        nickname = nickname.replace(" ", "");
         ListTag nbttaglist = tag.getList("Inventory");
         inventory.readFromNBT(nbttaglist);
         inventory.setCurrentItemIndex(tag.getIntegerOrDefault("CurrentItem", inventory.getCurrentItemIndex()), true);
@@ -1638,7 +1626,7 @@ public abstract class Player
             tileEntity.writeAdditionalData(entityTag);
             selectItem.getData().put("tileEntityData", entityTag);
         }
-    	
+
 		//Find item in hotbar, and select it
 		for(int i=0; i < 9; i++) {
 			ItemStack stack = inventory.getItem(i + inventory.getHotbarOffset());
diff --git a/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileFireball.java b/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileFireball.java
index 2dcb5d22a..8ed5c35d5 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileFireball.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileFireball.java
@@ -82,7 +82,7 @@ public class ProjectileFireball extends Projectile
                     } else {
                         result.entity.hurt(owner, damage, DamageType.COMBAT);
                     }
-                    if (owner instanceof Player) {
+                    if (result.entity instanceof Mob && owner instanceof Player) {
                         ((Player) owner).addStat(Achievements.HIT_FIREBALL, 1);
                     }
                 }
diff --git a/game/core/src/main/java/net/minecraft/core/enums/EnumSignPicture.java b/game/core/src/main/java/net/minecraft/core/enums/EnumSignPicture.java
index 1b342c853..abd5d27ef 100644
--- a/game/core/src/main/java/net/minecraft/core/enums/EnumSignPicture.java
+++ b/game/core/src/main/java/net/minecraft/core/enums/EnumSignPicture.java
@@ -2,47 +2,51 @@ package net.minecraft.core.enums;
 
 public enum EnumSignPicture
 {
-    NONE            (0,  "sign.image.none",          "minecraft:sign/none"),
-    ARROW_RIGHT     (1,  "sign.image.arrow_right",   "minecraft:sign/arrow_right"),
-    ARROW_LEFT      (2,  "sign.image.arrow_left",    "minecraft:sign/arrow_left"),
-    ARROW_DOWN      (3,  "sign.image.arrow_down",    "minecraft:sign/arrow_down"),
-    ARROW_UP        (4,  "sign.image.arrow_up",      "minecraft:sign/arrow_up"),
-    CAUTION         (5,  "sign.image.caution",       "minecraft:sign/caution"),
-    MOBS            (6,  "sign.image.mobs",          "minecraft:sign/mobs"),
-    TREES           (7,  "sign.image.trees",         "minecraft:sign/trees"),
-    CHEST           (8,  "sign.image.chest",         "minecraft:sign/chest"),
-    PICKAXE         (9,  "sign.image.pickaxe",       "minecraft:sign/pickaxe"),
-    WOLF            (10, "sign.image.wolf",          "minecraft:sign/wolf"),
-    SWORD           (11, "sign.image.sword",         "minecraft:sign/sword"),
-    HOE             (12, "sign.image.hoe",           "minecraft:sign/hoe"),
-    AXE             (13, "sign.image.axe",           "minecraft:sign/axe"),
-    SHOVEL          (14, "sign.image.shovel",        "minecraft:sign/shovel"),
-    BOWL            (15, "sign.image.bowl",          "minecraft:sign/bowl"),
-    TNT             (16, "sign.image.tnt",           "minecraft:sign/tnt"),
-    MOB_FARM        (17, "sign.image.mob_farm",      "minecraft:sign/mob_farm"),
-    MINE            (18, "sign.image.mine",          "minecraft:sign/mine"),
-    REDSTONE        (19, "sign.image.redstone",      "minecraft:sign/redstone"),
-    FARM            (20, "sign.image.farm",          "minecraft:sign/farm"),
-    BARRICADE       (21, "sign.image.barricade",     "minecraft:sign/barricade"),
-    QUESTION_MARK   (22, "sign.image.question_mark", "minecraft:sign/question_mark"),
-    FACE_SMILE      (23, "sign.image.face_smile",    "minecraft:sign/face_smile"),
-    FACE_SAD        (24, "sign.image.face_sad",      "minecraft:sign/face_sad"),
-    FACE_CRYING     (25, "sign.image.face_crying",   "minecraft:sign/face_crying"),
-    FACE_GASP       (26, "sign.image.face_gasp",     "minecraft:sign/face_gasp"),
-    FACE_THINKING   (27, "sign.image.face_thinking", "minecraft:sign/face_thinking"),
-    FACE_CONFUSED   (28, "sign.image.face_confused", "minecraft:sign/face_confused"),
-    BIG_SIGN        (29, "sign.image.big_sign",      "minecraft:sign/big_sign"),
-    MOB_ZOMBIE      (30, "sign.image.mob_zombie",    "minecraft:sign/mob_zombie"),
-    MOB_SKELETON    (31, "sign.image.mob_skeleton",  "minecraft:sign/mob_skeleton"),
-    MOB_CREEPER     (32, "sign.image.mob_creeper",   "minecraft:sign/mob_creeper"),
-    ONE_PLAYER      (33, "sign.image.one_player",    "minecraft:sign/one_player"),
-    TWO_PLAYERS     (34, "sign.image.two_players",   "minecraft:sign/two_players"),
-    THREE_PLAYERS   (35, "sign.image.three_players", "minecraft:sign/three_players"),
-    CROSS           (36, "sign.image.cross",         "minecraft:sign/cross"),
-    CRAFT           (37, "sign.image.craft",         "minecraft:sign/craft"),
-    AFK             (38, "sign.image.afk",           "minecraft:sign/afk"),
-    BRB             (39, "sign.image.brb",           "minecraft:sign/brb"),
-    HEART           (40, "sign.image.heart",         "minecraft:sign/heart");
+    NONE                (0,  "sign.image.none",             "minecraft:sign/none"),
+    ARROW_RIGHT         (1,  "sign.image.arrow_right",      "minecraft:sign/arrow_right"),
+    ARROW_LEFT          (2,  "sign.image.arrow_left",       "minecraft:sign/arrow_left"),
+    ARROW_DOWN          (3,  "sign.image.arrow_down",       "minecraft:sign/arrow_down"),
+    ARROW_UP            (4,  "sign.image.arrow_up",         "minecraft:sign/arrow_up"),
+    CAUTION             (5,  "sign.image.caution",          "minecraft:sign/caution"),
+    MOBS                (6,  "sign.image.mobs",             "minecraft:sign/mobs"),
+    TREES               (7,  "sign.image.trees",            "minecraft:sign/trees"),
+    CHEST               (8,  "sign.image.chest",            "minecraft:sign/chest"),
+    PICKAXE             (9,  "sign.image.pickaxe",          "minecraft:sign/pickaxe"),
+    WOLF                (10, "sign.image.wolf",             "minecraft:sign/wolf"),
+    SWORD               (11, "sign.image.sword",            "minecraft:sign/sword"),
+    HOE                 (12, "sign.image.hoe",              "minecraft:sign/hoe"),
+    AXE                 (13, "sign.image.axe",              "minecraft:sign/axe"),
+    SHOVEL              (14, "sign.image.shovel",           "minecraft:sign/shovel"),
+    BOWL                (15, "sign.image.bowl",             "minecraft:sign/bowl"),
+    TNT                 (16, "sign.image.tnt",              "minecraft:sign/tnt"),
+    MOB_FARM            (17, "sign.image.mob_farm",         "minecraft:sign/mob_farm"),
+    MINE                (18, "sign.image.mine",             "minecraft:sign/mine"),
+    REDSTONE            (19, "sign.image.redstone",         "minecraft:sign/redstone"),
+    FARM                (20, "sign.image.farm",             "minecraft:sign/farm"),
+    BARRICADE           (21, "sign.image.barricade",        "minecraft:sign/barricade"),
+    QUESTION_MARK       (22, "sign.image.question_mark",    "minecraft:sign/question_mark"),
+    FACE_SMILE          (23, "sign.image.face_smile",       "minecraft:sign/face_smile"),
+    FACE_SAD            (24, "sign.image.face_sad",         "minecraft:sign/face_sad"),
+    FACE_CRYING         (25, "sign.image.face_crying",      "minecraft:sign/face_crying"),
+    FACE_GASP           (26, "sign.image.face_gasp",        "minecraft:sign/face_gasp"),
+    FACE_THINKING       (27, "sign.image.face_thinking",    "minecraft:sign/face_thinking"),
+    FACE_CONFUSED       (28, "sign.image.face_confused",    "minecraft:sign/face_confused"),
+    BIG_SIGN            (29, "sign.image.big_sign",         "minecraft:sign/big_sign"),
+    MOB_ZOMBIE          (30, "sign.image.mob_zombie",       "minecraft:sign/mob_zombie"),
+    MOB_SKELETON        (31, "sign.image.mob_skeleton",     "minecraft:sign/mob_skeleton"),
+    MOB_CREEPER         (32, "sign.image.mob_creeper",      "minecraft:sign/mob_creeper"),
+    ONE_PLAYER          (33, "sign.image.one_player",       "minecraft:sign/one_player"),
+    TWO_PLAYERS         (34, "sign.image.two_players",      "minecraft:sign/two_players"),
+    THREE_PLAYERS       (35, "sign.image.three_players",    "minecraft:sign/three_players"),
+    CROSS               (36, "sign.image.cross",            "minecraft:sign/cross"),
+    CRAFT               (37, "sign.image.craft",            "minecraft:sign/craft"),
+    AFK                 (38, "sign.image.afk",              "minecraft:sign/afk"),
+    BRB                 (39, "sign.image.brb",              "minecraft:sign/brb"),
+    HEART               (40, "sign.image.heart",            "minecraft:sign/heart"),
+    ARROWS_LEFT_RIGHT   (41, "sign.image.arrows_left_right","minecraft:sign/arrows_left_right"),
+    ARROWS_UP_DOWN      (42, "sign.image.arrows_up_down",   "minecraft:sign/arrows_up_down"),
+    CHECK               (43, "sign.image.check",            "minecraft:sign/check"),
+    EXIT                (44, "sign.image.exit",             "minecraft:sign/exit");
 
     private final int id;
     private final String languageKey;
diff --git a/game/core/src/main/java/net/minecraft/core/item/ItemDye.java b/game/core/src/main/java/net/minecraft/core/item/ItemDye.java
index 34f810ec5..7b180f59f 100644
--- a/game/core/src/main/java/net/minecraft/core/item/ItemDye.java
+++ b/game/core/src/main/java/net/minecraft/core/item/ItemDye.java
@@ -2,6 +2,7 @@ package net.minecraft.core.item;
 
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockLogicSign;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.entity.TileEntityActivator;
 import net.minecraft.core.block.entity.TileEntitySign;
@@ -41,7 +42,8 @@ public class ItemDye extends Item
     @Override
     public boolean onUseItemOnBlock(@NotNull ItemStack itemstack, @Nullable Player player, @NotNull World world, int blockX, int blockY, int blockZ, @NotNull Side side, double xPlaced, double yPlaced)
     {
-        if (world.getBlockId(blockX, blockY, blockZ) == Blocks.SIGN_POST_PLANKS_OAK.id() || world.getBlockId(blockX, blockY, blockZ) == Blocks.SIGN_WALL_PLANKS_OAK.id())
+        Block<?> block = world.getBlock(blockX, blockY, blockZ);
+        if (Block.hasLogicClass(block, BlockLogicSign.class))
         {
             TileEntitySign sign = (TileEntitySign) world.getTileEntity(blockX, blockY, blockZ);
             if ((DyeColor.WHITE.itemMeta - itemstack.getMetadata()) != sign.getColor().id)
@@ -57,14 +59,12 @@ public class ItemDye extends Item
         }
         if(itemstack.getMetadata() == DyeColor.WHITE.itemMeta)
         {
-            int id = world.getBlockId(blockX, blockY, blockZ);
-            Block<?> block = Blocks.blocksList[id];
             if (Block.hasLogicClass(block, IBonemealable.class)){
                if (((IBonemealable) block.getLogic()).onBonemealUsed(itemstack, player, world, blockX, blockY, blockZ, side, xPlaced, yPlaced)){
                    return true;
                }
             }
-            if(id == Blocks.DIRT.id())
+            if(block == Blocks.DIRT)
             {
                 if(!world.isClientSide)
                 {
@@ -82,7 +82,7 @@ public class ItemDye extends Item
                 }
                 return true;
             }
-            if(id == Blocks.DIRT_SCORCHED.id())
+            if(block == Blocks.DIRT_SCORCHED)
             {
                 if (!world.isClientSide)
                 {
@@ -98,7 +98,7 @@ public class ItemDye extends Item
                 return true;
             }
 
-            if(Blocks.blocksList[id] != null && Blocks.blocksList[id].hasTag(BlockTags.GROWS_FLOWERS))
+            if(block != null && block.hasTag(BlockTags.GROWS_FLOWERS))
             {
                 if(!world.isClientSide)
                 {
diff --git a/game/core/src/main/java/net/minecraft/core/item/ItemFireStriker.java b/game/core/src/main/java/net/minecraft/core/item/ItemFireStriker.java
index ec98da5a3..bd281d988 100644
--- a/game/core/src/main/java/net/minecraft/core/item/ItemFireStriker.java
+++ b/game/core/src/main/java/net/minecraft/core/item/ItemFireStriker.java
@@ -37,7 +37,7 @@ public class ItemFireStriker extends Item
         if(i1 == 0)
         {
             if(world.setBlockWithNotify(blockX, blockY, blockZ, Blocks.FIRE.id())){
-                world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double) blockX + 0.5D, (double) blockY + 0.5D, (double) blockZ + 0.5D, "fire.ignite", 1.0F, itemRand.nextFloat() * 0.4F + 0.8F);
+                world.playSoundEffect(player, SoundCategory.WORLD_SOUNDS, (double) blockX + 0.5D, (double) blockY + 0.5D, (double) blockZ + 0.5D, "fire.ignite", 1.0F, itemRand.nextFloat() * 0.4F + 0.8F);
                 itemstack.damageItem(1, player);
                 return true;
             }
diff --git a/game/core/src/main/java/net/minecraft/core/item/ItemPaintBrush.java b/game/core/src/main/java/net/minecraft/core/item/ItemPaintBrush.java
index a6569b680..cf66fac7b 100644
--- a/game/core/src/main/java/net/minecraft/core/item/ItemPaintBrush.java
+++ b/game/core/src/main/java/net/minecraft/core/item/ItemPaintBrush.java
@@ -2,11 +2,14 @@ package net.minecraft.core.item;
 
 import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockLogicSign;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.IPaintable;
 import net.minecraft.core.block.IPainted;
 import net.minecraft.core.block.entity.TileEntityActivator;
+import net.minecraft.core.block.entity.TileEntitySign;
 import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.player.inventory.slot.Slot;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.DyeColor;
@@ -28,23 +31,33 @@ public class ItemPaintBrush extends Item {
 
     @Override
     public boolean onUseItemOnBlock(@NotNull ItemStack itemstack, @Nullable Player player, @NotNull World world, int blockX, int blockY, int blockZ, @NotNull Side side, double xPlaced, double yPlaced) {
-        if (itemstack.getMetadata() >= itemstack.getMaxDamage()) {
-            return false;
-        }
-
         final int id = world.getBlockId(blockX, blockY, blockZ);
         final Block<?> block = Blocks.getBlock(id);
 
-        if (Block.hasLogicClass(block, IPaintable.class)) {
+        if (Block.hasLogicClass(block, BlockLogicSign.class) && (player != null && player.isSneaking())) {
+            TileEntitySign sign = (TileEntitySign) world.getTileEntity(blockX, blockY, blockZ);
+            final DyeColor color = getColor(itemstack);
+            if (color.blockMeta != sign.getColor().id)
+            {
+                sign.setColor(TextFormatting.get(color.blockMeta));
+                itemstack.damageItem(1, player);
+                return true;
+            }
+        } else if (Block.hasLogicClass(block, IPaintable.class)) {
             final IPaintable paintable = (IPaintable) block.getLogic();
             if (!paintable.canBePainted()) return false;
             final DyeColor color = getColor(itemstack);
             if (color != null) {
                 if (paintable instanceof IPainted && ((IPainted)paintable).getColor(world, blockX, blockY, blockZ) == color) {
-                   return false;
+                    return false;
                 }
                 paintable.setColor(world, blockX, blockY, blockZ, color);
-                itemstack.damageItem(1, player);
+                if (itemstack.getMetadata() >= itemstack.getMaxDamage()) {
+                    setColor(itemstack, null);
+                    itemstack.setMetadata(getMaxDamage());
+                } else {
+                    itemstack.damageItem(1, player);
+                }
                 return true;
             }
         }
@@ -100,7 +113,7 @@ public class ItemPaintBrush extends Item {
 
     @Override
     public boolean showFullDurability() {
-        return true;
+        return false;
     }
 
     public int getDyeCount(ItemStack stack) {
@@ -111,8 +124,8 @@ public class ItemPaintBrush extends Item {
         stack.setMetadata(stack.getMaxDamage() - count);
     }
 
-    public DyeColor getColor(ItemStack stack) {
-        CompoundTag tag = stack.getData();
+    public static DyeColor getColor(@NotNull final ItemStack stack) {
+        final CompoundTag tag = stack.getData();
         if (tag.containsKey("Color")) {
             final int color = tag.getInteger("Color");
             if (color < 0) {
@@ -124,8 +137,8 @@ public class ItemPaintBrush extends Item {
         }
     }
 
-    public void setColor(ItemStack stack, DyeColor color) {
-        CompoundTag tag = stack.getData();
+    public static void setColor(@NotNull final ItemStack stack, @Nullable final DyeColor color) {
+        final CompoundTag tag = stack.getData();
         if (color == null) {
             tag.putInt("Color", -1);
         } else {
diff --git a/game/core/src/main/java/net/minecraft/core/item/ItemSignPainted.java b/game/core/src/main/java/net/minecraft/core/item/ItemSignPainted.java
new file mode 100644
index 000000000..3a00fd3ae
--- /dev/null
+++ b/game/core/src/main/java/net/minecraft/core/item/ItemSignPainted.java
@@ -0,0 +1,69 @@
+package net.minecraft.core.item;
+
+import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.TileEntitySign;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.enums.EnumBlockSoundEffectType;
+import net.minecraft.core.util.helper.DyeColor;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class ItemSignPainted extends ItemSign{
+    public ItemSignPainted(String name, String namespaceId, int id) {
+        super(name, namespaceId, id);
+    }
+
+    @Override
+    public boolean onUseItemOnBlock(@NotNull ItemStack itemstack, @Nullable Player player, @NotNull World world, int blockX, int blockY, int blockZ, @NotNull Side side, double xPlaced, double yPlaced)
+    {
+        int sideHit = side.getId();
+        if(side == Side.BOTTOM)
+        {
+            return false;
+        }
+        if(!world.getBlockMaterial(blockX, blockY, blockZ).isSolid())
+        {
+            return false;
+        }
+
+        if(!world.canPlaceInsideBlock(blockX, blockY, blockZ)) {
+            blockX += side.getOffsetX();
+            blockY += side.getOffsetY();
+            blockZ += side.getOffsetZ();
+        }
+        if(blockY < 0 || blockY >= world.getHeightBlocks()) {
+            return false;
+        }
+        if(!Blocks.SIGN_POST_PLANKS_OAK_PAINTED.canPlaceBlockAt(world, blockX, blockY, blockZ))
+        {
+            return false;
+        }
+        if(sideHit == 1)
+        {
+            int direction = MathHelper.floor((double)(((player.yRot + 180F) * 16F) / 360F) + 0.5D) & 0xf;
+            world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.SIGN_POST_PLANKS_OAK_PAINTED, EnumBlockSoundEffectType.PLACE);
+            world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.SIGN_POST_PLANKS_OAK_PAINTED.id(), Blocks.SIGN_POST_PLANKS_OAK_PAINTED.getLogic().toMetadata(DyeColor.colorFromItemMeta(itemstack.getMetadata())) | direction);
+        } else
+        {
+            world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.SIGN_WALL_PLANKS_OAK_PAINTED, EnumBlockSoundEffectType.PLACE);
+            world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.SIGN_WALL_PLANKS_OAK_PAINTED.id(), Blocks.SIGN_POST_PLANKS_OAK_PAINTED.getLogic().toMetadata(DyeColor.colorFromItemMeta(itemstack.getMetadata())) | sideHit);
+        }
+        itemstack.consumeItem(player);
+        TileEntitySign tileentitysign = (TileEntitySign)world.getTileEntity(blockX, blockY, blockZ);
+        if(tileentitysign != null)
+        {
+            tileentitysign.setOwner(player);
+            player.displaySignEditorScreen(tileentitysign);
+        }
+        return true;
+    }
+
+    @Override
+    public String getLanguageKey(ItemStack itemstack)
+    {
+        return super.getKey() + "." + DyeColor.colorFromItemMeta(itemstack.getMetadata()).colorID;
+    }
+}
diff --git a/game/core/src/main/java/net/minecraft/core/item/Items.java b/game/core/src/main/java/net/minecraft/core/item/Items.java
index e35a78c2b..8b55d1ad4 100644
--- a/game/core/src/main/java/net/minecraft/core/item/Items.java
+++ b/game/core/src/main/java/net/minecraft/core/item/Items.java
@@ -200,6 +200,7 @@ public final class Items {
     public static Item STATUE_GRANITE;
     public static Item STATUE_MARBLE;
     public static Item STATUE_PIGMAN;
+    public static Item SIGN_PAINTED;
 
     private static boolean hasInit = false;
     public static void init(){
@@ -420,5 +421,6 @@ public final class Items {
         STATUE_GRANITE = new ItemStatue("statue.granite", "minecraft:item/statue_granite", 16546, Blocks.STATUE_GRANITE_LOWER, Blocks.STATUE_GRANITE_UPPER);
         STATUE_MARBLE = new ItemStatue("statue.marble", "minecraft:item/statue_marble", 16547, Blocks.STATUE_MARBLE_LOWER, Blocks.STATUE_MARBLE_UPPER);
         STATUE_PIGMAN = new ItemStatue("statue.pigman", "minecraft:item/statue_pigman", 16548, Blocks.STATUE_PIGMAN_LOWER, Blocks.STATUE_PIGMAN_UPPER);
+        SIGN_PAINTED = (new ItemSignPainted("sign.painted", "minecraft:item/sign_painted", 16549));
     }
 }
diff --git a/game/core/src/main/java/net/minecraft/core/lang/LanguageSeeker.java b/game/core/src/main/java/net/minecraft/core/lang/LanguageSeeker.java
index 247e19e52..f6f6f52df 100644
--- a/game/core/src/main/java/net/minecraft/core/lang/LanguageSeeker.java
+++ b/game/core/src/main/java/net/minecraft/core/lang/LanguageSeeker.java
@@ -14,6 +14,7 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
 /**
@@ -114,7 +115,16 @@ public class LanguageSeeker {
                         // Don't handle this zip file with try-with-resources since
                         // it is meant to be handled by the Language instance itself.
                         ZipFile zip = new ZipFile(file);
-                        try (InputStream stream = zip.getInputStream(zip.getEntry("lang_info.json"))) {
+                        ZipEntry entry = zip.getEntry("lang_info.json");
+                        if (entry == null) {
+                            LOGGER.error("Language pack '{}' is missing a `lang_info.json` file!", file);
+                            continue;
+                        }
+                        try (InputStream stream = zip.getInputStream(entry)) {
+                            if (stream == null) {
+                                LOGGER.error("Language pack '{}' could not read `lang_info.json` file as stream!", file);
+                                continue;
+                            }
                             String content = readInputString(stream);
                             JsonObject json = JsonParser.instance.parseString(content);
                             String langId = json.getString("id");
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/CommandSource.java b/game/core/src/main/java/net/minecraft/core/net/command/CommandSource.java
index 746220976..b5ba0ba8f 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/CommandSource.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/CommandSource.java
@@ -12,10 +12,12 @@ import java.util.Collections;
 import java.util.function.Supplier;
 
 public interface CommandSource {
-    Collection<String> getPlayerNames();
+    Collection<String> getPlayerUsernames();
+
+    Collection<String> getPlayerNicknames();
 
     default Collection<String> getChatSuggestions() {
-        return this.getPlayerNames();
+        return this.getPlayerUsernames();
     }
 
     default Collection<String> getEntitySuggestions() {
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeEntity.java b/game/core/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeEntity.java
index 51e212cbd..362f41cd6 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeEntity.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeEntity.java
@@ -2,6 +2,7 @@ package net.minecraft.core.net.command.arguments;
 
 import com.mojang.brigadier.StringReader;
 import com.mojang.brigadier.arguments.ArgumentType;
+import com.mojang.brigadier.arguments.ArgumentTypeString;
 import com.mojang.brigadier.context.CommandContext;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 import com.mojang.brigadier.suggestion.Suggestions;
@@ -20,28 +21,31 @@ import java.util.concurrent.CompletableFuture;
 public class ArgumentTypeEntity implements ArgumentType<EntitySelector> {
     private static final Collection<String> EXAMPLES = Arrays.asList("Player", "0123", "@e", "@e[type=foo]", EntitySelector.ENTITY_PREFIX + "11203");
 
-    private final boolean singleEntity, playerOnly;
+    private final boolean singleEntity, playerOnly, showNicknames;
 
-    private ArgumentTypeEntity(boolean singleEntity, boolean playerOnly) {
+    private ArgumentTypeEntity(boolean singleEntity, boolean playerOnly, boolean showNicknames) {
         this.singleEntity = singleEntity;
         this.playerOnly = playerOnly;
+        this.showNicknames = showNicknames;
     }
 
     public static ArgumentTypeEntity entities() {
-        return new ArgumentTypeEntity(false, false);
+        return new ArgumentTypeEntity(false, false, false);
     }
 
     public static ArgumentTypeEntity entity() {
-        return new ArgumentTypeEntity(true, false);
+        return new ArgumentTypeEntity(true, false, false);
     }
 
-    public static ArgumentTypeEntity players() {
-        return new ArgumentTypeEntity(false, true);
+    public static ArgumentTypeEntity usernames() {
+        return new ArgumentTypeEntity(false, true, false);
     }
 
-    public static ArgumentTypeEntity player() {
-        return new ArgumentTypeEntity(true, true);
-    }
+    public static ArgumentTypeEntity username() {return new ArgumentTypeEntity(true, true, false);}
+
+    public static ArgumentTypeEntity nicknames() {return new ArgumentTypeEntity(false, true, true);}
+
+    public static ArgumentTypeEntity nickname() {return new ArgumentTypeEntity(true, true, true);}
 
     @Override
     public EntitySelector parse(StringReader reader) throws CommandSyntaxException {
@@ -74,7 +78,12 @@ public class ArgumentTypeEntity implements ArgumentType<EntitySelector> {
                 entitySelectorParser.parse();
             } catch (CommandSyntaxException ignored) {}
             return entitySelectorParser.fillSuggestions(builder, suggestionsBuilder -> {
-                Collection<String> collection = source.getPlayerNames();
+                Collection<String> collection;
+                if(this.showNicknames){
+                    collection = source.getPlayerNicknames();
+                } else {
+                    collection = source.getPlayerUsernames();
+                }
                 Iterable<String> iterable = this.playerOnly ? collection : new ConcatIterable<>(collection, source.getEntitySuggestions());
                 CommandHelper.suggest(iterable, suggestionsBuilder);
             });
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandAchievement.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandAchievement.java
index 4d390f75a..99c349963 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandAchievement.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandAchievement.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 import net.minecraft.core.achievement.Achievement;
 import net.minecraft.core.achievement.Achievements;
@@ -24,11 +24,11 @@ public class CommandAchievement implements CommandManager.CommandRegistry {
     private static final SimpleCommandExceptionType PLAYER_ALREADY_HAS_ACHIEVEMENT = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("command.commands.achievement.grant.exception_already_has_achievement"));
 
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(((LiteralArgumentBuilder.<CommandSource>literal("achievement"))
+        dispatcher.register(((ArgumentBuilderLiteral.<CommandSource>literal("achievement"))
             .requires(CommandSource::hasAdmin)
-            .then((LiteralArgumentBuilder.<CommandSource>literal("grant"))
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("entities", ArgumentTypeEntity.players())
-                    .then(RequiredArgumentBuilder.<CommandSource, Achievement>argument("achievement", ArgumentTypeAchievement.achievement())
+            .then((ArgumentBuilderLiteral.<CommandSource>literal("grant"))
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("entities", ArgumentTypeEntity.usernames())
+                    .then(ArgumentBuilderRequired.<CommandSource, Achievement>argument("achievement", ArgumentTypeAchievement.achievement())
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             List<? extends Entity> entities = c.getArgument("entities", EntitySelector.class).get(source);
@@ -54,7 +54,7 @@ public class CommandAchievement implements CommandManager.CommandRegistry {
 
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("*")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("*")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             List<? extends Entity> entities = c.getArgument("entities", EntitySelector.class).get(source);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandBiome.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandBiome.java
index 724ee22fc..dced004ad 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandBiome.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandBiome.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
 import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.lang.I18n;
@@ -20,18 +20,18 @@ public class CommandBiome implements CommandManager.CommandRegistry {
     private static final DynamicCommandExceptionType FAILURE = new DynamicCommandExceptionType(arg -> () -> I18n.getInstance().translateKeyAndFormat("command.commands.biome.locate.exception_failure", arg));
 
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("biome")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("biome")
                 .requires(CommandSource::hasAdmin)
-                .then(LiteralArgumentBuilder.<CommandSource>literal("get")
-                        .then(RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("position", ArgumentTypeIntegerCoordinates.intCoordinates())
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("get")
+                        .then(ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("position", ArgumentTypeIntegerCoordinates.intCoordinates())
                                 .executes(c -> {
                                     IntegerCoordinates position = c.getArgument("position", IntegerCoordinates.class);
                                     Biome biome = c.getSource().getWorld().getBlockBiome(position.getX(c.getSource()), position.getY(c.getSource(), true), position.getZ(c.getSource()));
                                     c.getSource().sendTranslatableMessage("command.commands.biome.get.success", position.getX(c.getSource()), position.getY(c.getSource(), true), position.getZ(c.getSource()), Registries.BIOMES.getKey(biome));
                                     return Command.SINGLE_SUCCESS;
                                 })))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("locate")
-                        .then(RequiredArgumentBuilder.<CommandSource, Biome>argument("biome", ArgumentTypeBiome.biome())
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("locate")
+                        .then(ArgumentBuilderRequired.<CommandSource, Biome>argument("biome", ArgumentTypeBiome.biome())
                                 .executes(c -> {
                                     Biome biome = c.getArgument("biome", Biome.class);
                                     Coordinates2D biomeLocation = getBiomeCoords(biome, c.getSource());
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandChunk.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandChunk.java
index c71febbb6..51507880c 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandChunk.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandChunk.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.net.command.CommandManager;
 import net.minecraft.core.net.command.CommandSource;
 import net.minecraft.core.net.command.arguments.ArgumentTypeChunkCoordinates;
@@ -13,10 +13,10 @@ import net.minecraft.core.world.World;
 
 public class CommandChunk implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("chunk")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("chunk")
             .requires(CommandSource::hasAdmin)
-            .then(LiteralArgumentBuilder.<CommandSource>literal("reset")
-                .then(RequiredArgumentBuilder.<CommandSource, Coordinates2D>argument("position", ArgumentTypeChunkCoordinates.chunkCoordinates())
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("reset")
+                .then(ArgumentBuilderRequired.<CommandSource, Coordinates2D>argument("position", ArgumentTypeChunkCoordinates.chunkCoordinates())
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         Coordinates2D coordinates2D = c.getArgument("position", Coordinates2D.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandClear.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandClear.java
index 3fbca8803..c64b4a572 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandClear.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandClear.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 import com.mojang.logging.LogUtils;
 import com.mojang.nbt.tags.Tag;
@@ -30,7 +30,7 @@ public class CommandClear implements CommandManager.CommandRegistry {
     private static final SimpleCommandExceptionType FAILURE = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("command.commands.clear.exception_failure"));
 
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("clear")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("clear")
             .requires(CommandSource::hasAdmin)
             .executes(c -> {
                 CommandSource source = c.getSource();
@@ -45,7 +45,7 @@ public class CommandClear implements CommandManager.CommandRegistry {
 
                 return Command.SINGLE_SUCCESS;
             })
-            .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("players", ArgumentTypeEntity.players())
+            .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("players", ArgumentTypeEntity.usernames())
                 .executes(c -> {
                     CommandSource source = c.getSource();
                     List<? extends Entity> players = c.getArgument("players", EntitySelector.class).get(source);
@@ -61,7 +61,7 @@ public class CommandClear implements CommandManager.CommandRegistry {
 
                     return Command.SINGLE_SUCCESS;
                 })
-                .then(RequiredArgumentBuilder.<CommandSource, ItemStack>argument("item", ArgumentTypeItemStack.itemStack())
+                .then(ArgumentBuilderRequired.<CommandSource, ItemStack>argument("item", ArgumentTypeItemStack.itemStack())
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         List<? extends Entity> players = c.getArgument("players", EntitySelector.class).get(source);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandClone.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandClone.java
index ffeb83a08..0fb5cff75 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandClone.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandClone.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.CommandDispatcher;
 import com.mojang.brigadier.builder.ArgumentBuilder;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.context.CommandContext;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
@@ -36,26 +36,26 @@ public class CommandClone implements CommandManager.CommandRegistry {
     private static final SimpleCommandExceptionType NOWHERE_LOADED = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("command.commands.clone.exception_nowhere_loaded"));
 
     public void register(CommandDispatcher<CommandSource> commandDispatcher) {
-        commandDispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("clone")
+        commandDispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("clone")
                 .requires(CommandSource::hasAdmin)
                 .then(beginEndDestinationAndModeSuffix(c -> {
                     return c.getSource().getWorld();
                 }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("from")
-                        .then((RequiredArgumentBuilder.<CommandSource, Dimension>argument("sourceDimension", ArgumentTypeDimension.dimension()))
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("from")
+                        .then((ArgumentBuilderRequired.<CommandSource, Dimension>argument("sourceDimension", ArgumentTypeDimension.dimension()))
                                 .then(beginEndDestinationAndModeSuffix(c -> {
                                     return c.getSource().getWorld(c.getArgument("sourceDimension", Dimension.class).id);
                                 })))));
     }
 
     private static ArgumentBuilder<CommandSource, ?> beginEndDestinationAndModeSuffix(CommandFunction<CommandContext<CommandSource>, World> commandFunction) {
-        return RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("begin", ArgumentTypeIntegerCoordinates.intCoordinates())
-                .then(RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("end", ArgumentTypeIntegerCoordinates.intCoordinates())
+        return ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("begin", ArgumentTypeIntegerCoordinates.intCoordinates())
+                .then(ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("end", ArgumentTypeIntegerCoordinates.intCoordinates())
                         .then(destinationAndModeSuffix(commandFunction, c -> {
                             return c.getSource().getWorld();
                         }))
-                        .then(LiteralArgumentBuilder.<CommandSource>literal("to")
-                                .then((RequiredArgumentBuilder.<CommandSource, Dimension>argument("targetDimension", ArgumentTypeDimension.dimension()))
+                        .then(ArgumentBuilderLiteral.<CommandSource>literal("to")
+                                .then((ArgumentBuilderRequired.<CommandSource, Dimension>argument("targetDimension", ArgumentTypeDimension.dimension()))
                                         .then(destinationAndModeSuffix(commandFunction, c -> {
                                             return c.getSource().getWorld(c.getArgument("targetDimension", Dimension.class).id);
                                         })))));
@@ -70,37 +70,37 @@ public class CommandClone implements CommandManager.CommandRegistry {
         CommandFunction<CommandContext<CommandSource>, WorldAndPosition> commandFunction3 = c -> getWorldAndPosition(c, commandFunction.apply(c), "begin");
         CommandFunction<CommandContext<CommandSource>, WorldAndPosition> commandFunction4 = c -> getWorldAndPosition(c, commandFunction.apply(c), "end");
         CommandFunction<CommandContext<CommandSource>, WorldAndPosition> commandFunction5 = c -> getWorldAndPosition(c, commandFunction2.apply(c), "destination");
-        return RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("destination", ArgumentTypeIntegerCoordinates.intCoordinates())
+        return ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("destination", ArgumentTypeIntegerCoordinates.intCoordinates())
                 .executes(c -> {
                     return clone(c.getSource(), commandFunction3.apply(c), commandFunction4.apply(c), commandFunction5.apply(c), null, CloneMode.NORMAL);
                 })
-                .then(wrapWithCloneMode(commandFunction3, commandFunction4, commandFunction5, (commandContext) -> null, LiteralArgumentBuilder.<CommandSource>literal("replace")
+                .then(wrapWithCloneMode(commandFunction3, commandFunction4, commandFunction5, (commandContext) -> null, ArgumentBuilderLiteral.<CommandSource>literal("replace")
                         .executes(c -> {
                             return clone(c.getSource(), commandFunction3.apply(c), commandFunction4.apply(c), commandFunction5.apply(c), null, CloneMode.NORMAL);
                         })))
-                .then(wrapWithCloneMode(commandFunction3, commandFunction4, commandFunction5, commandContext -> new BlockInput(null, 0, new CompoundTag()), LiteralArgumentBuilder.<CommandSource>literal("masked")
+                .then(wrapWithCloneMode(commandFunction3, commandFunction4, commandFunction5, commandContext -> new BlockInput(null, 0, new CompoundTag()), ArgumentBuilderLiteral.<CommandSource>literal("masked")
                         .executes(c -> {
                             return clone(c.getSource(), commandFunction3.apply(c), commandFunction4.apply(c), commandFunction5.apply(c), new BlockInput(null, 0, new CompoundTag()), CloneMode.NORMAL);
                         })))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("filtered")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("filtered")
                         .then(wrapWithCloneMode(commandFunction3, commandFunction4, commandFunction5, c -> {
                             return c.getArgument("filter", BlockInput.class);
-                            }, RequiredArgumentBuilder.<CommandSource, BlockInput>argument("filter", ArgumentTypeBlock.block())
+                            }, ArgumentBuilderRequired.<CommandSource, BlockInput>argument("filter", ArgumentTypeBlock.block())
                                 .executes(c -> {
                                     return clone(c.getSource(), commandFunction3.apply(c), commandFunction4.apply(c), commandFunction5.apply(c), c.getArgument("filter", BlockInput.class), CloneMode.NORMAL);
                                 }))));
     }
 
     private static ArgumentBuilder<CommandSource, ?> wrapWithCloneMode(CommandFunction<CommandContext<CommandSource>, WorldAndPosition> commandFunction, CommandFunction<CommandContext<CommandSource>, WorldAndPosition> commandFunction2, CommandFunction<CommandContext<CommandSource>, WorldAndPosition> commandFunction3, CommandFunction<CommandContext<CommandSource>, BlockInput> commandFunction4, ArgumentBuilder<CommandSource, ?> argumentBuilder) {
-        return argumentBuilder.then(LiteralArgumentBuilder.<CommandSource>literal("force")
+        return argumentBuilder.then(ArgumentBuilderLiteral.<CommandSource>literal("force")
                 .executes(c -> {
                     return clone(c.getSource(), commandFunction.apply(c), commandFunction2.apply(c), commandFunction3.apply(c), commandFunction4.apply(c), CloneMode.FORCE);
                 }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("move")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("move")
                         .executes(c -> {
                             return clone(c.getSource(), commandFunction.apply(c), commandFunction2.apply(c), commandFunction3.apply(c), commandFunction4.apply(c), CloneMode.MOVE);
                         }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("normal")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("normal")
                         .executes(c -> {
                             return clone(c.getSource(), commandFunction.apply(c), commandFunction2.apply(c), commandFunction3.apply(c), commandFunction4.apply(c), CloneMode.NORMAL);
                         }));
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandDamage.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandDamage.java
index 5cc8b2e89..93c1e4a4a 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandDamage.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandDamage.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.IntegerArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeInteger;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.net.command.CommandManager;
 import net.minecraft.core.util.helper.DamageType;
@@ -16,11 +16,11 @@ import java.util.List;
 
 public class CommandDamage implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("damage")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("damage")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("entities", ArgumentTypeEntity.entities())
-                        .then(RequiredArgumentBuilder.<CommandSource, DamageType>argument("type", ArgumentTypeDamageType.damageType())
-                                .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("amount", IntegerArgumentType.integer(0, 32768))
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("entities", ArgumentTypeEntity.entities())
+                        .then(ArgumentBuilderRequired.<CommandSource, DamageType>argument("type", ArgumentTypeDamageType.damageType())
+                                .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("amount", ArgumentTypeInteger.integer(0, 32768))
                                         .executes(c -> {
                                             List<? extends Entity> entities = c.getArgument("entities", EntitySelector.class).get(c.getSource());
                                             DamageType type = c.getArgument("type", DamageType.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandFill.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandFill.java
index 071213d5d..4495f5deb 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandFill.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandFill.java
@@ -1,8 +1,8 @@
 package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.block.entity.TileEntity;
@@ -20,11 +20,11 @@ import org.jetbrains.annotations.Nullable;
 
 public class CommandFill implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("fill")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("fill")
             .requires(CommandSource::hasAdmin)
-            .then(RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("first", ArgumentTypeIntegerCoordinates.intCoordinates())
-                .then(RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("second", ArgumentTypeIntegerCoordinates.intCoordinates())
-                    .then(RequiredArgumentBuilder.<CommandSource, BlockInput>argument("block", ArgumentTypeBlock.block())
+            .then(ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("first", ArgumentTypeIntegerCoordinates.intCoordinates())
+                .then(ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("second", ArgumentTypeIntegerCoordinates.intCoordinates())
+                    .then(ArgumentBuilderRequired.<CommandSource, BlockInput>argument("block", ArgumentTypeBlock.block())
                         .executes(c -> {
                             IntegerCoordinates first = c.getArgument("first", IntegerCoordinates.class);
                             IntegerCoordinates second = c.getArgument("second", IntegerCoordinates.class);
@@ -35,7 +35,7 @@ public class CommandFill implements CommandManager.CommandRegistry {
                             c.getSource().sendTranslatableMessage(blocksFilled == 1 ? "command.commands.fill.success_single" : "command.commands.fill.success_multiple", blocksFilled);
                             return blocksFilled;
                         })
-                        .then(LiteralArgumentBuilder.<CommandSource>literal("replace")
+                        .then(ArgumentBuilderLiteral.<CommandSource>literal("replace")
                             .executes(c -> {
                                 IntegerCoordinates first = c.getArgument("first", IntegerCoordinates.class);
                                 IntegerCoordinates second = c.getArgument("second", IntegerCoordinates.class);
@@ -46,7 +46,7 @@ public class CommandFill implements CommandManager.CommandRegistry {
                                 c.getSource().sendTranslatableMessage(blocksFilled == 1 ? "command.commands.fill.success_single" : "command.commands.fill.success_multiple", blocksFilled);
                                 return blocksFilled;
                             })
-                            .then(RequiredArgumentBuilder.<CommandSource, BlockInput>argument("filter", ArgumentTypeBlock.block())
+                            .then(ArgumentBuilderRequired.<CommandSource, BlockInput>argument("filter", ArgumentTypeBlock.block())
                                 .executes(c -> {
                                     IntegerCoordinates first = c.getArgument("first", IntegerCoordinates.class);
                                     IntegerCoordinates second = c.getArgument("second", IntegerCoordinates.class);
@@ -58,7 +58,7 @@ public class CommandFill implements CommandManager.CommandRegistry {
                                     c.getSource().sendTranslatableMessage(blocksFilled == 1 ? "command.commands.fill.success_single" : "command.commands.fill.success_multiple", blocksFilled);
                                     return blocksFilled;
                                 })))
-                        .then(LiteralArgumentBuilder.<CommandSource>literal("hollow")
+                        .then(ArgumentBuilderLiteral.<CommandSource>literal("hollow")
                             .executes(c -> {
                                 IntegerCoordinates first = c.getArgument("first", IntegerCoordinates.class);
                                 IntegerCoordinates second = c.getArgument("second", IntegerCoordinates.class);
@@ -69,7 +69,7 @@ public class CommandFill implements CommandManager.CommandRegistry {
                                 c.getSource().sendTranslatableMessage(blocksFilled == 1 ? "command.commands.fill.success_single" : "command.commands.fill.success_multiple", blocksFilled);
                                 return blocksFilled;
                             }))
-                        .then(LiteralArgumentBuilder.<CommandSource>literal("outline")
+                        .then(ArgumentBuilderLiteral.<CommandSource>literal("outline")
                             .executes(c -> {
                                 IntegerCoordinates first = c.getArgument("first", IntegerCoordinates.class);
                                 IntegerCoordinates second = c.getArgument("second", IntegerCoordinates.class);
@@ -80,7 +80,7 @@ public class CommandFill implements CommandManager.CommandRegistry {
                                 c.getSource().sendTranslatableMessage(blocksFilled == 1 ? "command.commands.fill.success_single" : "command.commands.fill.success_multiple", blocksFilled);
                                 return blocksFilled;
                             }))
-                        .then(LiteralArgumentBuilder.<CommandSource>literal("keep")
+                        .then(ArgumentBuilderLiteral.<CommandSource>literal("keep")
                             .executes(c -> {
                                 IntegerCoordinates first = c.getArgument("first", IntegerCoordinates.class);
                                 IntegerCoordinates second = c.getArgument("second", IntegerCoordinates.class);
@@ -91,7 +91,7 @@ public class CommandFill implements CommandManager.CommandRegistry {
                                 c.getSource().sendTranslatableMessage(blocksFilled == 1 ? "command.commands.fill.success_single" : "command.commands.fill.success_multiple", blocksFilled);
                                 return blocksFilled;
                             }))
-                        .then(LiteralArgumentBuilder.<CommandSource>literal("destroy")
+                        .then(ArgumentBuilderLiteral.<CommandSource>literal("destroy")
                             .executes(c -> {
                                 IntegerCoordinates first = c.getArgument("first", IntegerCoordinates.class);
                                 IntegerCoordinates second = c.getArgument("second", IntegerCoordinates.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGameMode.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGameMode.java
index 36f9f5676..71aab7d48 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGameMode.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGameMode.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.lang.I18n;
@@ -20,9 +20,9 @@ import java.util.List;
 
 public class CommandGameMode implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("gamemode")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("gamemode")
             .requires(CommandSource::hasAdmin)
-            .then(RequiredArgumentBuilder.<CommandSource, Gamemode>argument("gamemode", ArgumentTypeGameMode.gameMode())
+            .then(ArgumentBuilderRequired.<CommandSource, Gamemode>argument("gamemode", ArgumentTypeGameMode.gameMode())
                 .executes(c -> {
                     CommandSource source = c.getSource();
                     Gamemode gameMode = c.getArgument("gamemode", Gamemode.class);
@@ -35,7 +35,7 @@ public class CommandGameMode implements CommandManager.CommandRegistry {
                     source.sendTranslatableMessage("command.commands.gamemode.success_self", I18n.getInstance().translateKey(gameMode.getLanguageKey() + ".name"));
                     return Command.SINGLE_SUCCESS;
                 })
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("targets", ArgumentTypeEntity.players())
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("targets", ArgumentTypeEntity.usernames())
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         Gamemode gameMode = c.getArgument("gamemode", Gamemode.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGameRule.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGameRule.java
index d5151e6db..00b1d2c54 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGameRule.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGameRule.java
@@ -2,9 +2,9 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.BoolArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeBool;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.tree.CommandNode;
 import net.minecraft.core.data.gamerule.GameRule;
 import net.minecraft.core.data.gamerule.GameRuleBoolean;
@@ -16,19 +16,19 @@ import net.minecraft.core.net.packet.PacketGameRule;
 
 public class CommandGameRule implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        final LiteralArgumentBuilder<CommandSource> argumentBuilder = LiteralArgumentBuilder.<CommandSource>literal("gamerule").requires(CommandSource::hasAdmin);
+        final ArgumentBuilderLiteral<CommandSource> argumentBuilder = ArgumentBuilderLiteral.<CommandSource>literal("gamerule").requires(CommandSource::hasAdmin);
         for (final GameRule<?> gameRule : Registries.GAME_RULES) {
-            RequiredArgumentBuilder<CommandSource, ?> gameRuleValueArgument;
+            ArgumentBuilderRequired<CommandSource, ?> gameRuleValueArgument;
             if (gameRule instanceof GameRuleBoolean) {
-                gameRuleValueArgument = RequiredArgumentBuilder.<CommandSource, Boolean>argument("value", BoolArgumentType.bool())
+                gameRuleValueArgument = ArgumentBuilderRequired.<CommandSource, Boolean>argument("value", ArgumentTypeBool.bool())
                         .executes(c -> {
-                            c.getSource().getWorld().getLevelData().getGameRules().setValue((GameRuleBoolean) gameRule, BoolArgumentType.getBool(c, "value"));
+                            c.getSource().getWorld().getLevelData().getGameRules().setValue((GameRuleBoolean) gameRule, ArgumentTypeBool.getBool(c, "value"));
                             c.getSource().sendPacketToAllPlayers(() -> new PacketGameRule(c.getSource().getWorld().getLevelData().getGameRules()));
-                            c.getSource().sendTranslatableMessage("command.commands.gamerule.set", gameRule.getKey(), BoolArgumentType.getBool(c, "value"));
+                            c.getSource().sendTranslatableMessage("command.commands.gamerule.set", gameRule.getKey(), ArgumentTypeBool.getBool(c, "value"));
                             return Command.SINGLE_SUCCESS;
                         });
             } else {
-                gameRuleValueArgument = RequiredArgumentBuilder.<CommandSource, Object>argument("value", ArgumentTypeGameruleGeneric.gameRule(gameRule))
+                gameRuleValueArgument = ArgumentBuilderRequired.<CommandSource, Object>argument("value", ArgumentTypeGameruleGeneric.gameRule(gameRule))
                         .executes(c -> {
                             Object o = c.getArgument("value", Object.class);
                             c.getSource().getWorld().getLevelData().getGameRules().setValue((GameRule) gameRule, o);
@@ -37,7 +37,7 @@ public class CommandGameRule implements CommandManager.CommandRegistry {
                             return Command.SINGLE_SUCCESS;
                         });
             }
-            argumentBuilder.then(LiteralArgumentBuilder.<CommandSource>literal(gameRule.getKey())
+            argumentBuilder.then(ArgumentBuilderLiteral.<CommandSource>literal(gameRule.getKey())
                     .executes(c -> {
                         c.getSource().sendTranslatableMessage("command.commands.gamerule.get", gameRule.getKey(), c.getSource().getWorld().getGameRuleValue(gameRule));
                         return Command.SINGLE_SUCCESS;
@@ -45,7 +45,7 @@ public class CommandGameRule implements CommandManager.CommandRegistry {
                     .then(gameRuleValueArgument));
         }
         CommandNode<CommandSource> commandNode = dispatcher.register(argumentBuilder);
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("gr")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("gr")
                 .requires(CommandSource::hasAdmin)
                 .redirect(commandNode));
     }
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGive.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGive.java
index d924ab645..871923b54 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGive.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandGive.java
@@ -2,9 +2,9 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.IntegerArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeInteger;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
@@ -19,10 +19,10 @@ import java.util.List;
 
 public class CommandGive implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("give")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("give")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.players())
-                        .then(RequiredArgumentBuilder.<CommandSource, ItemStack>argument("item", ArgumentTypeItemStack.itemStack())
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.usernames())
+                        .then(ArgumentBuilderRequired.<CommandSource, ItemStack>argument("item", ArgumentTypeItemStack.itemStack())
                                 .executes(c -> {
                                     CommandSource source = c.getSource();
                                     ItemStack itemStack = c.getArgument("item", ItemStack.class);
@@ -45,7 +45,7 @@ public class CommandGive implements CommandManager.CommandRegistry {
 
                                     return Command.SINGLE_SUCCESS;
                                 })
-                                .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("amount", IntegerArgumentType.integer(1, 6400))
+                                .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("amount", ArgumentTypeInteger.integer(1, 6400))
                                         .executes(c -> {
                                             CommandSource source = c.getSource();
                                             ItemStack itemStack = c.getArgument("item", ItemStack.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandHeal.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandHeal.java
index 917fc4b15..de47f6969 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandHeal.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandHeal.java
@@ -1,9 +1,9 @@
 package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.IntegerArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeInteger;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.net.command.CommandManager;
@@ -18,10 +18,10 @@ import java.util.List;
 
 public class CommandHeal implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("heal")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("heal")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("entities", ArgumentTypeEntity.entities())
-                        .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("amount", IntegerArgumentType.integer(0, 32768))
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("entities", ArgumentTypeEntity.entities())
+                        .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("amount", ArgumentTypeInteger.integer(0, 32768))
                                 .executes(c -> {
                                     List<? extends Entity> entities = c.getArgument("entities", EntitySelector.class).get(c.getSource());
                                     int amount = c.getArgument("amount", Integer.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandHelp.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandHelp.java
index bb5d4c20e..a5109041b 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandHelp.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandHelp.java
@@ -2,9 +2,9 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.CommandDispatcher;
 import com.mojang.brigadier.ParseResults;
-import com.mojang.brigadier.arguments.StringArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeString;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 import com.mojang.brigadier.tree.CommandNode;
 import net.minecraft.core.lang.I18n;
@@ -18,7 +18,7 @@ public class CommandHelp implements CommandManager.CommandRegistry {
     private static final SimpleCommandExceptionType FAILURE = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("command.commands.help.exception_failure"));
 
     public void register(CommandDispatcher<CommandSource> commandDispatcher) {
-        commandDispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("help")
+        commandDispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("help")
             .executes(c -> {
                 CommandSource source = c.getSource();
                 Map<CommandNode<CommandSource>, String> map = commandDispatcher.getSmartUsage(commandDispatcher.getRoot(), source);
@@ -31,9 +31,9 @@ public class CommandHelp implements CommandManager.CommandRegistry {
                 }
                 return map.size();
             })
-            .then(RequiredArgumentBuilder.<CommandSource, String>argument("command", StringArgumentType.greedyString())
+            .then(ArgumentBuilderRequired.<CommandSource, String>argument("command", ArgumentTypeString.greedyString())
                 .executes(commandContext -> {
-                    ParseResults<CommandSource> parseResults = commandDispatcher.parse(StringArgumentType.getString(commandContext, "command"), commandContext.getSource());
+                    ParseResults<CommandSource> parseResults = commandDispatcher.parse(ArgumentTypeString.getString(commandContext, "command"), commandContext.getSource());
                     if (parseResults.getContext().getNodes().isEmpty()) {
                         throw FAILURE.create();
                     }
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandKill.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandKill.java
index 7b04917c5..d3dce5ee7 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandKill.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandKill.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.Mob;
@@ -22,7 +22,7 @@ public class CommandKill implements CommandManager.CommandRegistry {
     private static final SimpleCommandExceptionType FAILURE = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("command.commands.kill.exception_failure"));
 
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("kill")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("kill")
                 .requires(CommandSource::hasAdmin)
                 .executes(c -> {
                     CommandSource source = c.getSource();
@@ -36,7 +36,7 @@ public class CommandKill implements CommandManager.CommandRegistry {
 
                     return Command.SINGLE_SUCCESS;
                 })
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("entities", ArgumentTypeEntity.entities())
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("entities", ArgumentTypeEntity.entities())
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("entities", EntitySelector.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandMessage.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandMessage.java
index c7ce6318d..114199979 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandMessage.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandMessage.java
@@ -2,9 +2,9 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.StringArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeString;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.tree.CommandNode;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
@@ -20,30 +20,31 @@ import java.util.List;
 
 public class CommandMessage implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        CommandNode<CommandSource> command = dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("message")
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("targets", ArgumentTypeEntity.players())
-                        .then(RequiredArgumentBuilder.<CommandSource, String>argument("message", StringArgumentType.greedyString())
+        CommandNode<CommandSource> command = dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("message")
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("targets", ArgumentTypeEntity.usernames())
+                        .then(ArgumentBuilderRequired.<CommandSource, String>argument("message", ArgumentTypeString.greedyString())
                                 .executes(c -> {
                                     CommandSource source = c.getSource();
                                     EntitySelector entitySelector = c.getArgument("targets", EntitySelector.class);
                                     String message = c.getArgument("message", String.class);
 
-                                    String senderName = source.getName();
+                                    if(source.getSender() == null) return 0;
+                                    String senderName = source.getSender().getDisplayName();
 
                                     List<? extends Entity> players = entitySelector.get(source);
 
                                     for (Entity player : players) {
-                                        source.sendMessage(TextFormatting.LIGHT_GRAY.toString() + TextFormatting.ITALIC.toString() + I18n.getInstance().translateKeyAndFormat("command.commands.message.outgoing", LoggedPrintStream.removeColorCodes(((Player)player).getDisplayName()), message));
-                                        source.sendMessage((Player)player, TextFormatting.LIGHT_GRAY + (TextFormatting.ITALIC + I18n.getInstance().translateKeyAndFormat("command.commands.message.incoming", senderName, message)));
+                                        source.sendMessage(TextFormatting.LIGHT_GRAY.toString() + TextFormatting.ITALIC.toString() + I18n.getInstance().translateKeyAndFormat("command.commands.message.outgoing", TextFormatting.removeAllFormatting(((Player)player).getDisplayName()), message));
+                                        source.sendMessage((Player)player, TextFormatting.LIGHT_GRAY + (TextFormatting.ITALIC + I18n.getInstance().translateKeyAndFormat("command.commands.message.incoming", TextFormatting.removeAllFormatting(senderName), message)));
                                     }
 
                                     return Command.SINGLE_SUCCESS;
                                 }))));
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("msg")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("msg")
                 .redirect(command));
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("whisper")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("whisper")
                 .redirect(command));
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("tell")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("tell")
                 .redirect(command));
     }
 }
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandMobSpawning.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandMobSpawning.java
index 85fcf50b8..edcb3581b 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandMobSpawning.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandMobSpawning.java
@@ -2,9 +2,9 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.BoolArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeBool;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
@@ -25,9 +25,9 @@ public class CommandMobSpawning implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
         dispatcher.register
             (
-                LiteralArgumentBuilder.<CommandSource>literal("mobspawning")
+                ArgumentBuilderLiteral.<CommandSource>literal("mobspawning")
                     .requires(CommandSource::hasAdmin)
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("list").executes(c -> {
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("list").executes(c -> {
                         Collection<NamespaceID> ids = EntityDispatcher.idToClassMap.keySet();
                         World world = c.getSource().getWorld();
                         SpawnerConfig config = world.getSpawnerConfig();
@@ -39,9 +39,9 @@ public class CommandMobSpawning implements CommandManager.CommandRegistry {
 
                         return Command.SINGLE_SUCCESS;
                     }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("set")
-                        .then(RequiredArgumentBuilder.<CommandSource, Class<? extends Entity>>argument("entity", ArgumentTypeEntitySummon.entity())
-                            .then(RequiredArgumentBuilder.<CommandSource, Boolean>argument("value", BoolArgumentType.bool())
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("set")
+                        .then(ArgumentBuilderRequired.<CommandSource, Class<? extends Entity>>argument("entity", ArgumentTypeEntitySummon.entity())
+                            .then(ArgumentBuilderRequired.<CommandSource, Boolean>argument("value", ArgumentTypeBool.bool())
                                 .executes(c -> {
                                     World world = c.getSource().getWorld();
                                     SpawnerConfig config = world.getSpawnerConfig();
@@ -52,8 +52,8 @@ public class CommandMobSpawning implements CommandManager.CommandRegistry {
                                     c.getSource().sendTranslatableMessage("command.commands.mobspawning.set", mobId, value);
                         return Command.SINGLE_SUCCESS;
                     }))))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("passive")
-                        .then(RequiredArgumentBuilder.<CommandSource, Boolean>argument("value", BoolArgumentType.bool())
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("passive")
+                        .then(ArgumentBuilderRequired.<CommandSource, Boolean>argument("value", ArgumentTypeBool.bool())
                             .executes(c -> {
                                 World world = c.getSource().getWorld();
                                 SpawnerConfig config = world.getSpawnerConfig();
@@ -63,8 +63,8 @@ public class CommandMobSpawning implements CommandManager.CommandRegistry {
                                 c.getSource().sendTranslatableMessage("command.commands.mobspawning.passive", value);
                                 return Command.SINGLE_SUCCESS;
                             })))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("hostile")
-                        .then(RequiredArgumentBuilder.<CommandSource, Boolean>argument("value", BoolArgumentType.bool())
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("hostile")
+                        .then(ArgumentBuilderRequired.<CommandSource, Boolean>argument("value", ArgumentTypeBool.bool())
                             .executes(c -> {
                                 World world = c.getSource().getWorld();
                                 SpawnerConfig config = world.getSpawnerConfig();
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandParticle.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandParticle.java
index b16f9178b..ae05993a8 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandParticle.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandParticle.java
@@ -2,10 +2,10 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.DoubleArgumentType;
-import com.mojang.brigadier.arguments.IntegerArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeDouble;
+import com.mojang.brigadier.arguments.ArgumentTypeInteger;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.CommandManager;
@@ -23,9 +23,9 @@ public class CommandParticle implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
         dispatcher.register
             (
-                LiteralArgumentBuilder.<CommandSource>literal("particle")
+                ArgumentBuilderLiteral.<CommandSource>literal("particle")
                     .requires(CommandSource::hasAdmin)
-                    .then(RequiredArgumentBuilder.<CommandSource, String>argument("particleId", ArgumentTypeParticleId.particleId())
+                    .then(ArgumentBuilderRequired.<CommandSource, String>argument("particleId", ArgumentTypeParticleId.particleId())
                         .executes(c -> {
                             String particleId = c.getArgument("particleId", String.class);
                             Player player = c.getSource().getSender();
@@ -34,7 +34,7 @@ public class CommandParticle implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         })
-                        .then(RequiredArgumentBuilder.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
+                        .then(ArgumentBuilderRequired.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
                             .executes(c -> {
                                 String particleId = c.getArgument("particleId", String.class);
                                 DoubleCoordinates pos = c.getArgument("position", DoubleCoordinates.class);
@@ -42,7 +42,7 @@ public class CommandParticle implements CommandManager.CommandRegistry {
 
                                 return Command.SINGLE_SUCCESS;
                             })
-                            .then(RequiredArgumentBuilder.<CommandSource, DoubleCoordinates>argument("motion", ArgumentTypeVec3.vec3d())
+                            .then(ArgumentBuilderRequired.<CommandSource, DoubleCoordinates>argument("motion", ArgumentTypeVec3.vec3d())
                                 .executes(c -> {
                                     String particleId = c.getArgument("particleId", String.class);
                                     DoubleCoordinates pos = c.getArgument("position", DoubleCoordinates.class);
@@ -53,7 +53,7 @@ public class CommandParticle implements CommandManager.CommandRegistry {
                                         motion.getX(0), motion.getY(0), motion.getZ(0), particleId, null, null);
                                     return Command.SINGLE_SUCCESS;
                                 })
-                                .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("data", IntegerArgumentType.integer())
+                                .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("data", ArgumentTypeInteger.integer())
                                     .executes(c -> {
                                         String particleId = c.getArgument("particleId", String.class);
                                         DoubleCoordinates pos = c.getArgument("position", DoubleCoordinates.class);
@@ -65,7 +65,7 @@ public class CommandParticle implements CommandManager.CommandRegistry {
                                             motion.getX(0), motion.getY(0), motion.getZ(0), particleId, data, null);
                                         return Command.SINGLE_SUCCESS;
                                     })
-                                    .then(RequiredArgumentBuilder.<CommandSource, Double>argument("maxDistance", DoubleArgumentType.doubleArg())
+                                    .then(ArgumentBuilderRequired.<CommandSource, Double>argument("maxDistance", ArgumentTypeDouble.doubleArg())
                                         .executes(c -> {
                                             String particleId = c.getArgument("particleId", String.class);
                                             DoubleCoordinates pos = c.getArgument("position", DoubleCoordinates.class);
@@ -81,7 +81,7 @@ public class CommandParticle implements CommandManager.CommandRegistry {
                                 )
                             )
                         )
-                        .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.entities())
+                        .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.entities())
                             .executes(c -> {
                                 String particleId = c.getArgument("particleId", String.class);
                                 EntitySelector selector = c.getArgument("target", EntitySelector.class);
@@ -92,7 +92,7 @@ public class CommandParticle implements CommandManager.CommandRegistry {
 
                                 return Command.SINGLE_SUCCESS;
                             })
-                            .then(RequiredArgumentBuilder.<CommandSource, DoubleCoordinates>argument("motion", ArgumentTypeVec3.vec3d())
+                            .then(ArgumentBuilderRequired.<CommandSource, DoubleCoordinates>argument("motion", ArgumentTypeVec3.vec3d())
                                 .executes(c -> {
                                     String particleId = c.getArgument("particleId", String.class);
                                     DoubleCoordinates motion = c.getArgument("motion", DoubleCoordinates.class);
@@ -104,7 +104,7 @@ public class CommandParticle implements CommandManager.CommandRegistry {
                                     }
                                     return Command.SINGLE_SUCCESS;
                                 })
-                                .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("data", IntegerArgumentType.integer())
+                                .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("data", ArgumentTypeInteger.integer())
                                     .executes(c -> {
                                         String particleId = c.getArgument("particleId", String.class);
                                         DoubleCoordinates motion = c.getArgument("motion", DoubleCoordinates.class);
@@ -117,7 +117,7 @@ public class CommandParticle implements CommandManager.CommandRegistry {
                                         }
                                         return Command.SINGLE_SUCCESS;
                                     })
-                                    .then(RequiredArgumentBuilder.<CommandSource, Double>argument("maxDistance", DoubleArgumentType.doubleArg())
+                                    .then(ArgumentBuilderRequired.<CommandSource, Double>argument("maxDistance", ArgumentTypeDouble.doubleArg())
                                         .executes(c -> {
                                             String particleId = c.getArgument("particleId", String.class);
                                             DoubleCoordinates motion = c.getArgument("motion", DoubleCoordinates.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandPlace.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandPlace.java
index 8548bf1b3..7ea83be8e 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandPlace.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandPlace.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 import com.mojang.brigadier.tree.CommandNode;
 import net.minecraft.core.lang.I18n;
@@ -21,10 +21,10 @@ public class CommandPlace implements CommandManager.CommandRegistry {
     private static final SimpleCommandExceptionType FAILURE = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("command.commands.place.exception_failure"));
 
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        CommandNode<CommandSource> command = dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("place")
+        CommandNode<CommandSource> command = dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("place")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, WorldFeature>argument("feature", ArgumentTypeWorldFeature.worldFeature())
-                        .then(RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("position", ArgumentTypeIntegerCoordinates.intCoordinates())
+                .then(ArgumentBuilderRequired.<CommandSource, WorldFeature>argument("feature", ArgumentTypeWorldFeature.worldFeature())
+                        .then(ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("position", ArgumentTypeIntegerCoordinates.intCoordinates())
                                 .executes(c -> {
                                     CommandSource source = c.getSource();
                                     WorldFeature feature = c.getArgument("feature", WorldFeature.class);
@@ -48,10 +48,10 @@ public class CommandPlace implements CommandManager.CommandRegistry {
                                     }
                                     return Command.SINGLE_SUCCESS;
                                 }))));
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("generate")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("generate")
                 .requires(CommandSource::hasAdmin)
                 .redirect(command));
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("gen")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("gen")
                 .requires(CommandSource::hasAdmin)
                 .redirect(command));
     }
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandPlaySound.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandPlaySound.java
index 8b79636a6..6dbc18a24 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandPlaySound.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandPlaySound.java
@@ -2,9 +2,9 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.FloatArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeFloat;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.CommandManager;
@@ -25,10 +25,10 @@ public class CommandPlaySound implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
         dispatcher.register
             (
-                LiteralArgumentBuilder.<CommandSource>literal("playsound")
+                ArgumentBuilderLiteral.<CommandSource>literal("playsound")
                     .requires(CommandSource::hasAdmin)
-                    .then(RequiredArgumentBuilder.<CommandSource, String>argument("soundId", ArgumentTypeSoundId.soundId())
-                        .then(RequiredArgumentBuilder.<CommandSource, SoundCategory>argument("type", ArgumentTypeSoundCategory.soundCategory())
+                    .then(ArgumentBuilderRequired.<CommandSource, String>argument("soundId", ArgumentTypeSoundId.soundId())
+                        .then(ArgumentBuilderRequired.<CommandSource, SoundCategory>argument("type", ArgumentTypeSoundCategory.soundCategory())
                             .executes(c -> {
                                 String soundId = c.getArgument("soundId", String.class);
                                 SoundCategory category = c.getArgument("type", SoundCategory.class);
@@ -40,7 +40,7 @@ public class CommandPlaySound implements CommandManager.CommandRegistry {
                                 }
                                 return 0;
                             })
-                            .then(RequiredArgumentBuilder.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
+                            .then(ArgumentBuilderRequired.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
                                 .executes(c -> {
                                     String soundId = c.getArgument("soundId", String.class);
                                     SoundCategory category = c.getArgument("type", SoundCategory.class);
@@ -54,7 +54,7 @@ public class CommandPlaySound implements CommandManager.CommandRegistry {
                                     world.playSoundEffect(null, category, coordinates.getX(sourceX), coordinates.getY(sourceY), coordinates.getZ(sourceZ), soundId, 1f, 1f);
                                     return Command.SINGLE_SUCCESS;
                                 })
-                                .then(RequiredArgumentBuilder.<CommandSource, Float>argument("volume", FloatArgumentType.floatArg())
+                                .then(ArgumentBuilderRequired.<CommandSource, Float>argument("volume", ArgumentTypeFloat.floatArg())
                                     .executes(c -> {
                                         String soundId = c.getArgument("soundId", String.class);
                                         SoundCategory category = c.getArgument("type", SoundCategory.class);
@@ -69,7 +69,7 @@ public class CommandPlaySound implements CommandManager.CommandRegistry {
                                         world.playSoundEffect(null, category, coordinates.getX(sourceX), coordinates.getY(sourceY), coordinates.getZ(sourceZ), soundId, volume, 1f);
                                         return Command.SINGLE_SUCCESS;
                                     })
-                                    .then(RequiredArgumentBuilder.<CommandSource, Float>argument("pitch", FloatArgumentType.floatArg())
+                                    .then(ArgumentBuilderRequired.<CommandSource, Float>argument("pitch", ArgumentTypeFloat.floatArg())
                                         .executes(c -> {
                                             String soundId = c.getArgument("soundId", String.class);
                                             SoundCategory category = c.getArgument("type", SoundCategory.class);
@@ -88,7 +88,7 @@ public class CommandPlaySound implements CommandManager.CommandRegistry {
                                     )
                                 )
                             )
-                            .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.entities())
+                            .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.entities())
                                 .executes(c -> {
                                     String soundId = c.getArgument("soundId", String.class);
                                     SoundCategory category = c.getArgument("type", SoundCategory.class);
@@ -101,7 +101,7 @@ public class CommandPlaySound implements CommandManager.CommandRegistry {
                                     }
                                     return Command.SINGLE_SUCCESS;
                                 })
-                                .then(RequiredArgumentBuilder.<CommandSource, Float>argument("volume", FloatArgumentType.floatArg())
+                                .then(ArgumentBuilderRequired.<CommandSource, Float>argument("volume", ArgumentTypeFloat.floatArg())
                                     .executes(c -> {
                                         String soundId = c.getArgument("soundId", String.class);
                                         SoundCategory category = c.getArgument("type", SoundCategory.class);
@@ -115,7 +115,7 @@ public class CommandPlaySound implements CommandManager.CommandRegistry {
                                         }
                                         return Command.SINGLE_SUCCESS;
                                     })
-                                    .then(RequiredArgumentBuilder.<CommandSource, Float>argument("pitch", FloatArgumentType.floatArg())
+                                    .then(ArgumentBuilderRequired.<CommandSource, Float>argument("pitch", ArgumentTypeFloat.floatArg())
                                         .executes(c -> {
                                             String soundId = c.getArgument("soundId", String.class);
                                             SoundCategory category = c.getArgument("type", SoundCategory.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSay.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSay.java
index 0a24af6dd..778ae23ff 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSay.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSay.java
@@ -2,20 +2,20 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.StringArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeString;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.net.command.CommandManager;
 import net.minecraft.core.net.command.CommandSource;
 
 public class CommandSay implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("say")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("say")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, String>argument("message", StringArgumentType.greedyString())
+                .then(ArgumentBuilderRequired.<CommandSource, String>argument("message", ArgumentTypeString.greedyString())
                         .executes(c -> {
                             CommandSource source = c.getSource();
-                            String message = StringArgumentType.getString(c, "message");
+                            String message = ArgumentTypeString.getString(c, "message");
                             String senderName = source.getName();
                             source.sendMessageToAllPlayers("[" + senderName + "§r] " + message);
                             return Command.SINGLE_SUCCESS;
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSeed.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSeed.java
index feff7ecb5..37e509901 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSeed.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSeed.java
@@ -2,7 +2,7 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
 import net.minecraft.core.Global;
 import net.minecraft.core.net.command.CommandManager;
 import net.minecraft.core.net.command.CommandSource;
@@ -13,7 +13,7 @@ import java.awt.datatransfer.StringSelection;
 
 public class CommandSeed implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("seed")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("seed")
                 .requires(CommandSource::hasAdmin)
                 .executes(c -> {
                     CommandSource source = c.getSource();
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSetBlock.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSetBlock.java
index 4e360d59c..5dad3109e 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSetBlock.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSetBlock.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.CommandManager;
@@ -18,10 +18,10 @@ public class CommandSetBlock implements CommandManager.CommandRegistry {
     private static final SimpleCommandExceptionType FAILURE = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("command.commands.setblock.exception_failure"));
 
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("setblock")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("setblock")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("position", ArgumentTypeIntegerCoordinates.intCoordinates())
-                        .then(RequiredArgumentBuilder.<CommandSource, BlockInput>argument("block", ArgumentTypeBlock.block())
+                .then(ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("position", ArgumentTypeIntegerCoordinates.intCoordinates())
+                        .then(ArgumentBuilderRequired.<CommandSource, BlockInput>argument("block", ArgumentTypeBlock.block())
                                 .executes(c -> {
                                     CommandSource source = c.getSource();
                                     IntegerCoordinates coordinates = c.getArgument("position", IntegerCoordinates.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSetSpawn.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSetSpawn.java
index 7bdb6cf02..743b8d490 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSetSpawn.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSetSpawn.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.tree.CommandNode;
 import net.minecraft.core.net.command.CommandManager;
 import net.minecraft.core.world.chunk.ChunkCoordinates;
@@ -13,9 +13,9 @@ import net.minecraft.core.net.command.helpers.IntegerCoordinates;
 
 public class CommandSetSpawn implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        CommandNode<CommandSource> command = dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("setworldspawn")
+        CommandNode<CommandSource> command = dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("setworldspawn")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("position", ArgumentTypeIntegerCoordinates.intCoordinates())
+                .then(ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("position", ArgumentTypeIntegerCoordinates.intCoordinates())
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             IntegerCoordinates coordinates = c.getArgument("position", IntegerCoordinates.class);
@@ -29,7 +29,7 @@ public class CommandSetSpawn implements CommandManager.CommandRegistry {
 
                             return Command.SINGLE_SUCCESS;
                         })));
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("setspawn")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("setspawn")
                 .requires(CommandSource::hasAdmin)
                 .redirect(command));
     }
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSpawn.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSpawn.java
index 57ece50d0..4ba656aae 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSpawn.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSpawn.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.lang.I18n;
@@ -20,7 +20,7 @@ import java.util.List;
 
 public class CommandSpawn implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("spawn")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("spawn")
                 .requires(CommandSource::hasAdmin)
                 .executes(c -> {
                     CommandSource source = c.getSource();
@@ -35,7 +35,7 @@ public class CommandSpawn implements CommandManager.CommandRegistry {
                     source.sendTranslatableMessage("command.commands.spawn.success");
                     return Command.SINGLE_SUCCESS;
                 })
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("players", ArgumentTypeEntity.players())
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("players", ArgumentTypeEntity.usernames())
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             Player sender = source.getSender();
@@ -56,7 +56,7 @@ public class CommandSpawn implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("get")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("get")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             ChunkCoordinates spawnCoordinates = source.getWorld(0).getSpawnPoint();
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSummon.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSummon.java
index 3c8607b28..de5bf0160 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSummon.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandSummon.java
@@ -2,9 +2,9 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.IntegerArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeInteger;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.context.CommandContext;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.net.command.CommandManager;
@@ -19,9 +19,9 @@ import net.minecraft.core.net.command.helpers.DoubleCoordinates;
 
 public class CommandSummon implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("summon")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("summon")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, Class<? extends Entity>>argument("entity", ArgumentTypeEntitySummon.entity())
+                .then(ArgumentBuilderRequired.<CommandSource, Class<? extends Entity>>argument("entity", ArgumentTypeEntitySummon.entity())
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             Vec3 coordinates = source.getCoordinates(false);
@@ -33,7 +33,7 @@ public class CommandSummon implements CommandManager.CommandRegistry {
 
                             return Command.SINGLE_SUCCESS;
                         })
-                        .then(RequiredArgumentBuilder.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
+                        .then(ArgumentBuilderRequired.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
                                 .executes(c -> {
                                     CommandSource source = c.getSource();
                                     DoubleCoordinates coordinates = c.getArgument("position", DoubleCoordinates.class);
@@ -44,7 +44,7 @@ public class CommandSummon implements CommandManager.CommandRegistry {
 
                                     return Command.SINGLE_SUCCESS;
                                 })
-                                .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("amount", IntegerArgumentType.integer(1, 255))
+                                .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("amount", ArgumentTypeInteger.integer(1, 255))
                                         .executes(c -> {
                                             CommandSource source = c.getSource();
                                             DoubleCoordinates coordinates = c.getArgument("position", DoubleCoordinates.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTeleport.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTeleport.java
index 0beeb1bda..c8245c23d 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTeleport.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTeleport.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.tree.CommandNode;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
@@ -20,9 +20,9 @@ import java.util.List;
 
 public class CommandTeleport implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        CommandNode<CommandSource> command = dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("teleport")
+        CommandNode<CommandSource> command = dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("teleport")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
+                .then(ArgumentBuilderRequired.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             DoubleCoordinates targetCoordinates = c.getArgument("position", DoubleCoordinates.class);
@@ -36,8 +36,8 @@ public class CommandTeleport implements CommandManager.CommandRegistry {
 
                             return Command.SINGLE_SUCCESS;
                         }))
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("entity", ArgumentTypeEntity.entities())
-                        .then(RequiredArgumentBuilder.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("entity", ArgumentTypeEntity.entities())
+                        .then(ArgumentBuilderRequired.<CommandSource, DoubleCoordinates>argument("position", ArgumentTypeVec3.vec3d())
                                 .executes(c -> {
                                     CommandSource source = c.getSource();
                                     EntitySelector entitySelector = c.getArgument("entity", EntitySelector.class);
@@ -61,7 +61,7 @@ public class CommandTeleport implements CommandManager.CommandRegistry {
 
                                     return Command.SINGLE_SUCCESS;
                                 }))
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.entity())
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.entity())
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("entity", EntitySelector.class);
@@ -78,7 +78,7 @@ public class CommandTeleport implements CommandManager.CommandRegistry {
 
                             return Command.SINGLE_SUCCESS;
                         }))));
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("tp")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("tp")
                 .requires(CommandSource::hasAdmin)
                 .redirect(command));
     }
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTellRaw.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTellRaw.java
index 008050db4..8f51ee16e 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTellRaw.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTellRaw.java
@@ -2,9 +2,9 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.StringArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeString;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.CommandManager;
@@ -16,10 +16,10 @@ import java.util.List;
 
 public class CommandTellRaw implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("tellraw")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("tellraw")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("targets", ArgumentTypeEntity.players())
-                        .then(RequiredArgumentBuilder.<CommandSource, String>argument("message", StringArgumentType.greedyString())
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("targets", ArgumentTypeEntity.usernames())
+                        .then(ArgumentBuilderRequired.<CommandSource, String>argument("message", ArgumentTypeString.greedyString())
                                 .executes(c -> {
                                     CommandSource source = c.getSource();
                                     EntitySelector entitySelector = c.getArgument("targets", EntitySelector.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTestFor.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTestFor.java
index 3da906f2f..397a99fdc 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTestFor.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTestFor.java
@@ -2,8 +2,8 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.entity.TileEntity;
@@ -20,18 +20,18 @@ import java.util.List;
 
 public class CommandTestFor implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("testfor")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("testfor")
                 .requires(CommandSource::hasAdmin)
-                .then(LiteralArgumentBuilder.<CommandSource>literal("entity")
-                        .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("entities", ArgumentTypeEntity.entities())
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("entity")
+                        .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("entities", ArgumentTypeEntity.entities())
                                 .executes(c -> {
                                     List<? extends Entity> entities = c.getArgument("entities", EntitySelector.class).get(c.getSource());
                                     c.getSource().sendTranslatableMessage("command.commands.testfor.entity." + (entities.isEmpty() ? "none" : entities.size() == 1 ? "single" : "multiple"), entities.size());
                                     return entities.size();
                                 })))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("block")
-                        .then(RequiredArgumentBuilder.<CommandSource, BlockInput>argument("block", ArgumentTypeBlock.block())
-                                .then(RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("second", ArgumentTypeIntegerCoordinates.intCoordinates())
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("block")
+                        .then(ArgumentBuilderRequired.<CommandSource, BlockInput>argument("block", ArgumentTypeBlock.block())
+                                .then(ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("second", ArgumentTypeIntegerCoordinates.intCoordinates())
                                         .executes(c -> {
                                             BlockInput block = c.getArgument("block", BlockInput.class);
                                             IntegerCoordinates secondPos = c.getArgument("second", IntegerCoordinates.class);
@@ -47,8 +47,8 @@ public class CommandTestFor implements CommandManager.CommandRegistry {
                                             c.getSource().sendTranslatableMessage("command.commands.testfor.block.failure");
                                             return 0;
                                         })))
-                        .then(RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("first", ArgumentTypeIntegerCoordinates.intCoordinates())
-                                .then(RequiredArgumentBuilder.<CommandSource, IntegerCoordinates>argument("second", ArgumentTypeIntegerCoordinates.intCoordinates())
+                        .then(ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("first", ArgumentTypeIntegerCoordinates.intCoordinates())
+                                .then(ArgumentBuilderRequired.<CommandSource, IntegerCoordinates>argument("second", ArgumentTypeIntegerCoordinates.intCoordinates())
                                         .executes(c -> {
                                             IntegerCoordinates firstPos = c.getArgument("first", IntegerCoordinates.class);
                                             IntegerCoordinates secondPos = c.getArgument("second", IntegerCoordinates.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTime.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTime.java
index 739e7e1c3..d996bc1d2 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTime.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandTime.java
@@ -2,9 +2,9 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.IntegerArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeInteger;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.Global;
 import net.minecraft.core.net.command.CommandManager;
 import net.minecraft.core.net.command.arguments.ArgumentTypeSeason;
@@ -18,63 +18,63 @@ import net.minecraft.core.world.season.Seasons;
 
 public class CommandTime implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("time")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("time")
             .requires(CommandSource::hasAdmin)
-            .then(LiteralArgumentBuilder.<CommandSource>literal("query")
-                .then(LiteralArgumentBuilder.<CommandSource>literal("daytime")
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("query")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("daytime")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         source.sendTranslatableMessage("command.commands.time.query", c.getSource().getWorld().getWorldTime() % 24000L);
 
                         return Command.SINGLE_SUCCESS;
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("gametime")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("gametime")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         source.sendTranslatableMessage("command.commands.time.query", source.getWorld().getWorldTime() % Integer.MAX_VALUE);
 
                         return Command.SINGLE_SUCCESS;
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("day")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("day")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         source.sendTranslatableMessage("command.commands.time.query", source.getWorld().getWorldTime() / 24000L % Integer.MAX_VALUE);
 
                         return Command.SINGLE_SUCCESS;
                         })))
-            .then(LiteralArgumentBuilder.<CommandSource>literal("set")
-                .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("time", ArgumentTypeTime.time())
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("set")
+                .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("time", ArgumentTypeTime.time())
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         int time = c.getArgument("time", Integer.class);
                         setWorldTime(source, source.getWorld(), time);
                         return Command.SINGLE_SUCCESS;
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("day")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("day")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         setDayTime(source, source.getWorld(), 1000);
                         return Command.SINGLE_SUCCESS;
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("noon")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("noon")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         setDayTime(source, source.getWorld(), 6000);
                         return Command.SINGLE_SUCCESS;
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("night")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("night")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         setDayTime(source, source.getWorld(), 13000);
                         return Command.SINGLE_SUCCESS;
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("midnight")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("midnight")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         setDayTime(source, source.getWorld(), 18000);
                         return Command.SINGLE_SUCCESS;
                     }))
-                .then(RequiredArgumentBuilder.<CommandSource, String>argument("season", ArgumentTypeSeason.season())
+                .then(ArgumentBuilderRequired.<CommandSource, String>argument("season", ArgumentTypeSeason.season())
                     .requires(c -> c.getWorld().getSeasonManager() instanceof SeasonManagerCycle)
                     .executes(c -> {
                         CommandSource source = c.getSource();
@@ -93,7 +93,7 @@ public class CommandTime implements CommandManager.CommandRegistry {
                         setWorldTime(source, source.getWorld(), source.getWorld().getWorldTime() - (source.getWorld().getWorldTime() % seasonManager.getYearLengthTicks()) + time);
                         return Command.SINGLE_SUCCESS;
                     })
-                    .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("day", IntegerArgumentType.integer())
+                    .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("day", ArgumentTypeInteger.integer())
                         .executes(c -> {
                             CommandSource source = c.getSource();
 
@@ -118,8 +118,8 @@ public class CommandTime implements CommandManager.CommandRegistry {
                     )
                 )
             )
-            .then(LiteralArgumentBuilder.<CommandSource>literal("add")
-                .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("time", ArgumentTypeTime.time())
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("add")
+                .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("time", ArgumentTypeTime.time())
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         int time = c.getArgument("time", Integer.class);
diff --git a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandWeather.java b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandWeather.java
index 5e64fe611..bfea50f68 100644
--- a/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandWeather.java
+++ b/game/core/src/main/java/net/minecraft/core/net/command/commands/CommandWeather.java
@@ -2,9 +2,9 @@ package net.minecraft.core.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.FloatArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeFloat;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.tree.CommandNode;
 import net.minecraft.core.net.command.CommandManager;
 import net.minecraft.core.world.World;
@@ -16,9 +16,9 @@ import net.minecraft.core.world.weather.Weathers;
 
 public class CommandWeather implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        CommandNode<CommandSource> command = dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("weather")
+        CommandNode<CommandSource> command = dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("weather")
                 .requires(CommandSource::hasAdmin)
-                .then(LiteralArgumentBuilder.<CommandSource>literal("clear")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("clear")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         World world = source.getWorld();
@@ -28,7 +28,7 @@ public class CommandWeather implements CommandManager.CommandRegistry {
                         source.sendTranslatableMessage("command.commands.weather.success", weather.getNameLanguageKey());
                         return Command.SINGLE_SUCCESS;
                     }))
-                .then(RequiredArgumentBuilder.<CommandSource, Weather>argument("weather", ArgumentTypeWeather.weather())
+                .then(ArgumentBuilderRequired.<CommandSource, Weather>argument("weather", ArgumentTypeWeather.weather())
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             World world = source.getWorld();
@@ -38,7 +38,7 @@ public class CommandWeather implements CommandManager.CommandRegistry {
                             source.sendTranslatableMessage("command.commands.weather.success", weather.getNameLanguageKey());
                             return Command.SINGLE_SUCCESS;
                         })
-                        .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("duration", ArgumentTypeTime.time())
+                        .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("duration", ArgumentTypeTime.time())
                                 .executes(c -> {
                                     CommandSource source = c.getSource();
                                     World world = source.getWorld();
@@ -48,7 +48,7 @@ public class CommandWeather implements CommandManager.CommandRegistry {
                                     source.sendTranslatableMessage("command.commands.weather.success", weather.getNameLanguageKey());
                                     return Command.SINGLE_SUCCESS;
                                 })
-                                .then(RequiredArgumentBuilder.<CommandSource, Float>argument("power", FloatArgumentType.floatArg())
+                                .then(ArgumentBuilderRequired.<CommandSource, Float>argument("power", ArgumentTypeFloat.floatArg())
                                         .executes(c -> {
                                             CommandSource source = c.getSource();
                                             World world = source.getWorld();
@@ -58,7 +58,7 @@ public class CommandWeather implements CommandManager.CommandRegistry {
                                             source.sendTranslatableMessage("command.commands.weather.success", weather.getNameLanguageKey());
                                             return Command.SINGLE_SUCCESS;
                                         })))));
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("w")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("w")
                 .requires(CommandSource::hasAdmin)
                 .redirect(command));
     }
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/Packet.java b/game/core/src/main/java/net/minecraft/core/net/packet/Packet.java
index c3d8ba23f..88a4042c9 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/Packet.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/Packet.java
@@ -127,7 +127,7 @@ public abstract class Packet
         packet.write(dos);
     }
 
-    public static void writeString(String string, DataOutputStream dos)
+    public static void writeStringUTF8(String string, DataOutputStream dos)
             throws IOException
     {
         if (string.length() > 32767)
@@ -142,7 +142,7 @@ public abstract class Packet
         }
     }
 
-    public static String readString(DataInputStream dis, int maxLength)
+    public static String readStringUTF8(DataInputStream dis, int maxLength)
             throws IOException
     {
         short length = dis.readShort();
@@ -159,7 +159,7 @@ public abstract class Packet
         return new String(data, StandardCharsets.UTF_8);
     }
 
-    public static void writeUTF16BEString(String string, DataOutputStream dos)
+    public static void writeStringUTF16BE(String string, DataOutputStream dos)
         throws IOException
     {
         if (string.length() > 32767)
@@ -174,7 +174,7 @@ public abstract class Packet
         }
     }
 
-    public static String readUTF16BEString(DataInputStream dis, int maxLength)
+    public static String readStringUTF16BE(DataInputStream dis, int maxLength)
         throws IOException
     {
         short length = dis.readShort();
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAESSendKey.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAESSendKey.java
index 27f4b6fcd..dd9d8bec9 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAESSendKey.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAESSendKey.java
@@ -23,14 +23,14 @@ public class PacketAESSendKey extends Packet
 	public void read(DataInputStream dis)
             throws IOException
     {
-        KEY = readString(dis, MAX_AES_KEY_SIZE);
+        KEY = readStringUTF8(dis, MAX_AES_KEY_SIZE);
     }
 
     @Override
 	public void write(DataOutputStream dos)
             throws IOException
     {
-        writeString(KEY, dos);
+        writeStringUTF8(KEY, dos);
     }
 
     @Override
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddMob.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddMob.java
index d9c2e5f9d..0724cb7b7 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddMob.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddMob.java
@@ -54,7 +54,7 @@ public class PacketAddMob extends Packet
         yaw = dis.readByte();
         pitch = dis.readByte();
         unpackedData = SynchedEntityData.unpack(dis);
-        nickname = readString(dis, MAX_NICKNAME_SIZE);
+        nickname = readStringUTF16BE(dis, MAX_NICKNAME_SIZE);
         chatColor = dis.readByte();
     }
 
@@ -70,7 +70,7 @@ public class PacketAddMob extends Packet
         dos.writeByte(yaw);
         dos.writeByte(pitch);
         metaData.packAll(dos);
-        writeString(nickname, dos);
+        writeStringUTF16BE(nickname, dos);
         dos.writeByte(chatColor);
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPainting.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPainting.java
index 0cc408516..2dc7e674e 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPainting.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPainting.java
@@ -36,7 +36,7 @@ public class PacketAddPainting extends Packet
         throws IOException
     {
         entityId = dis.readInt();
-        key = readString(dis, ArtType.getMaxArtKeyLength());
+        key = readStringUTF8(dis, ArtType.getMaxArtKeyLength());
         xPosition = dis.readInt();
         yPosition = dis.readInt();
         zPosition = dis.readInt();
@@ -50,7 +50,7 @@ public class PacketAddPainting extends Packet
         throws IOException
     {
         dos.writeInt(entityId);
-        writeString(key, dos);
+        writeStringUTF8(key, dos);
         dos.writeInt(xPosition);
         dos.writeInt(yPosition);
         dos.writeInt(zPosition);
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java
index e13e39b50..96e1b38d6 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java
@@ -62,7 +62,7 @@ public class PacketAddPlayer extends Packet
         throws IOException
     {
         this.entityId = dis.readInt();
-        this.name = readString(dis, MAX_USERNAME_SIZE);
+        this.name = readStringUTF8(dis, MAX_USERNAME_SIZE);
         this.uuid = readUUID(dis);
         this.xPosition = dis.readInt();
         this.yPosition = dis.readInt();
@@ -70,9 +70,8 @@ public class PacketAddPlayer extends Packet
         this.rotation = dis.readByte();
         this.pitch = dis.readByte();
         this.currentItem = dis.readShort();
-        this.nickname = readString(dis, MAX_NICKNAME_SIZE);
+        this.nickname = readStringUTF16BE(dis, MAX_NICKNAME_SIZE);
         this.chatColor = dis.readByte();
-        this.playerConfig = dis.readByte();
         this.gamemode = Byte.toUnsignedInt(dis.readByte());
 
         if (dis.readByte() == 1) {
@@ -87,7 +86,7 @@ public class PacketAddPlayer extends Packet
         throws IOException
     {
         dos.writeInt(this.entityId);
-        writeString(this.name, dos);
+        writeStringUTF8(this.name, dos);
         writeUUID(this.uuid, dos);
         dos.writeInt(this.xPosition);
         dos.writeInt(this.yPosition);
@@ -95,9 +94,8 @@ public class PacketAddPlayer extends Packet
         dos.writeByte(this.rotation);
         dos.writeByte(this.pitch);
         dos.writeShort(this.currentItem);
-        writeString(this.nickname, dos);
+        writeStringUTF16BE(this.nickname, dos);
         dos.writeByte(this.chatColor);
-        dos.writeByte(this.playerConfig);
         dos.writeByte(this.gamemode & 0xFF);
 
         if (this.heldObjectTag != null) {
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketChat.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketChat.java
index 42501348c..d5f3cb004 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketChat.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketChat.java
@@ -47,14 +47,14 @@ public class PacketChat extends Packet {
 	@Override
 	public void read(DataInputStream in) throws IOException {
 		type = in.readByte();
-		message = readString(in, MAX_MESSAGE_SIZE);
+		message = readStringUTF16BE(in, MAX_MESSAGE_SIZE);
 		encrypted = in.readBoolean();
 	}
 
 	@Override
 	public void write(DataOutputStream out) throws IOException {
 		out.writeByte(type);
-		writeString(message, out);
+		writeStringUTF16BE(message, out);
 		out.writeBoolean(encrypted);
 	}
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketCustomPayload.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketCustomPayload.java
index f69822da2..4fc4e41e8 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketCustomPayload.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketCustomPayload.java
@@ -29,7 +29,7 @@ public class PacketCustomPayload extends Packet {
 	
 	@Override
 	public void read(DataInputStream in) throws IOException {
-		this.channel = readString(in, MAX_CHANNEL_SIZE);
+		this.channel = readStringUTF8(in, MAX_CHANNEL_SIZE);
 		int length = in.readInt();
 		
 		if(length > 0 && length < 32768) {
@@ -40,7 +40,7 @@ public class PacketCustomPayload extends Packet {
 
 	@Override
 	public void write(DataOutputStream out) throws IOException {
-		writeString(channel, out);
+		writeStringUTF8(channel, out);
 		if(data != null) {
 			out.writeInt(data.length);
 			out.write(data);
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketDisconnect.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketDisconnect.java
index 5ce9975bd..647248536 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketDisconnect.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketDisconnect.java
@@ -26,14 +26,14 @@ public class PacketDisconnect extends Packet
 	public void read(DataInputStream dis)
         throws IOException
     {
-        reason = readUTF16BEString(dis, 255);
+        reason = readStringUTF16BE(dis, 255);
     }
 
     @Override
 	public void write(DataOutputStream dos)
         throws IOException
     {
-        writeUTF16BEString(reason, dos);
+        writeStringUTF16BE(reason, dos);
         if (image != null)
         {
             dos.write(image);
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java
index 0b53456c6..dfccd0666 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java
@@ -31,14 +31,14 @@ public class PacketEntityNickname extends Packet
     @Override
     public void read(DataInputStream dis) throws IOException
     {
-        nickname = readString(dis, MAX_NICKNAME_SIZE);
+        nickname = readStringUTF16BE(dis, MAX_NICKNAME_SIZE);
         chatColor = dis.readByte();
     }
 
     @Override
     public void write(DataOutputStream dos) throws IOException
     {
-        writeString(nickname, dos);
+        writeStringUTF16BE(nickname, dos);
         dos.writeByte(chatColor);
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketLogin.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketLogin.java
index 5d44681bb..4a849cb01 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketLogin.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketLogin.java
@@ -45,9 +45,9 @@ public class PacketLogin extends Packet
         throws IOException
     {
         playerEntityIdAndProtocolVersion = dis.readInt();
-        username = readString(dis, MAX_USERNAME_SIZE);
+        username = readStringUTF8(dis, MAX_USERNAME_SIZE);
         uuid = readUUID(dis);
-        publicKey = readString(dis, MAX_AES_KEY_SIZE);
+        publicKey = readStringUTF8(dis, MAX_AES_KEY_SIZE);
         worldSeed = dis.readLong();
         dimensionId = dis.readByte();
         worldTypeId = dis.readByte();
@@ -59,9 +59,9 @@ public class PacketLogin extends Packet
         throws IOException
     {
         dos.writeInt(playerEntityIdAndProtocolVersion);
-        writeString(username, dos);
+        writeStringUTF8(username, dos);
         writeUUID(uuid, dos);
-        writeString(publicKey, dos);
+        writeStringUTF8(publicKey, dos);
         dos.writeLong(worldSeed);
         dos.writeByte(dimensionId);
         dos.writeByte(worldTypeId);
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketPingHandshake.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketPingHandshake.java
index 662f5d974..f56fd78d2 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketPingHandshake.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketPingHandshake.java
@@ -34,10 +34,10 @@ public class PacketPingHandshake
     public void read(DataInputStream dis) throws IOException {
         payload = dis.readUnsignedByte();
         identifier = dis.readUnsignedByte();
-        pingHostString = readUTF16BEString(dis, 255);
+        pingHostString = readStringUTF16BE(dis, 255);
         dis.readUnsignedShort();
         protocolVersion = dis.readUnsignedByte();
-        hostname = readUTF16BEString(dis, 255);
+        hostname = readStringUTF16BE(dis, 255);
         port = dis.readInt();
     }
 
@@ -45,10 +45,10 @@ public class PacketPingHandshake
     public void write(DataOutputStream dos) throws IOException {
         dos.writeByte(payload);
         dos.writeByte(identifier);
-        writeUTF16BEString(pingHostString, dos);
+        writeStringUTF16BE(pingHostString, dos);
         dos.writeShort(1 + 2 + StandardCharsets.UTF_16BE.encode(pingHostString).array().length + 4);
         dos.writeByte(protocolVersion);
-        writeUTF16BEString(hostname, dos);
+        writeStringUTF16BE(hostname, dos);
         dos.writeInt(port);
         startTime = System.currentTimeMillis();
     }
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketPlayerList.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketPlayerList.java
index 04cfc9de4..42bf7705f 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketPlayerList.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketPlayerList.java
@@ -32,8 +32,8 @@ public class PacketPlayerList extends Packet {
 		scores = new String[count];
 		
 		for(int i=0; i < count; i++) {
-			players[i] = readString(in, MAX_NICKNAME_SIZE);
-			scores[i] = readString(in, MAX_SCORE_STRING_SIZE);
+			players[i] = readStringUTF16BE(in, MAX_NICKNAME_SIZE);
+			scores[i] = readStringUTF16BE(in, MAX_SCORE_STRING_SIZE);
 		}
 	}
 
@@ -42,8 +42,8 @@ public class PacketPlayerList extends Packet {
 		out.writeInt(count);
 		
 		for(int i=0; i < count; i++) {
-			writeString(players[i], out);
-			writeString(scores[i], out);
+			writeStringUTF16BE(players[i], out);
+			writeStringUTF16BE(scores[i], out);
 		}
 	}
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketPreLogin.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketPreLogin.java
index 7462f0c42..5d2c82af7 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketPreLogin.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketPreLogin.java
@@ -22,14 +22,14 @@ public class PacketPreLogin extends Packet
 	public void read(DataInputStream dis)
         throws IOException
     {
-        username = readString(dis, MAX_USERNAME_SIZE);
+        username = readStringUTF8(dis, MAX_USERNAME_SIZE);
     }
 
     @Override
 	public void write(DataOutputStream dos)
         throws IOException
     {
-        writeString(username, dos);
+        writeStringUTF8(username, dos);
     }
 
     @Override
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketSignUpdate.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketSignUpdate.java
index 667fec2e6..45d7853c3 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketSignUpdate.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketSignUpdate.java
@@ -34,7 +34,7 @@ public class PacketSignUpdate extends Packet
         signLines = new String[4];
         for(int i = 0; i < 4; i++)
         {
-            signLines[i] = readString(dis, TileEntitySign.MAX_LINE_SIZE);
+            signLines[i] = readStringUTF16BE(dis, TileEntitySign.MAX_LINE_SIZE);
         }
         picture = dis.readInt();
         color = dis.readInt();
@@ -49,7 +49,7 @@ public class PacketSignUpdate extends Packet
         dos.writeInt(zPosition);
         for(int i = 0; i < 4; i++)
         {
-            writeString(signLines[i], dos);
+            writeStringUTF16BE(signLines[i], dos);
         }
         dos.writeInt(picture);
         dos.writeInt(color);
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketStatistic.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketStatistic.java
index 610653289..a71558d9b 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketStatistic.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketStatistic.java
@@ -34,7 +34,7 @@ public class PacketStatistic extends Packet
         throws IOException
     {
         try {
-            statID = new NamespaceID(readString(dis, Integer.MAX_VALUE));
+            statID = new NamespaceID(readStringUTF8(dis, Integer.MAX_VALUE));
         } catch (HardIllegalArgumentException e) {
             statID = null;
         }
@@ -45,7 +45,7 @@ public class PacketStatistic extends Packet
 	public void write(DataOutputStream dos)
         throws IOException
     {
-        writeString(statID.toString(), dos);
+        writeStringUTF8(statID.toString(), dos);
         dos.writeByte(valueChange);
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketSyncIDs.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketSyncIDs.java
index 7b3c4b0e9..1504f896e 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketSyncIDs.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketSyncIDs.java
@@ -57,7 +57,7 @@ public class PacketSyncIDs extends Packet {
 		
 		for(int i=0; i < count; i++) {
 			int id = in.readShort() & 0xFFFF;
-			String name = readString(in, MAX_ID_STRING_SIZE);
+			String name = readStringUTF8(in, MAX_ID_STRING_SIZE);
 			mapping.put(id, name);
 		}
 		
@@ -73,7 +73,7 @@ public class PacketSyncIDs extends Packet {
 		
 		for(Entry<Integer, String> entry : mapping.entrySet()) {
 			out.writeShort(entry.getKey());
-			writeString(entry.getValue(), out);
+			writeStringUTF8(entry.getValue(), out);
 		}
 		
 		return bytesWritten;
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketUpdatePlayerProfile.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketUpdatePlayerProfile.java
index b5c348be6..c06bcf8de 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketUpdatePlayerProfile.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketUpdatePlayerProfile.java
@@ -29,8 +29,8 @@ public class PacketUpdatePlayerProfile extends Packet
 	public void read(DataInputStream dis)
             throws IOException
     {
-        username = readString(dis, MAX_USERNAME_SIZE);
-        nickname = readString(dis, MAX_NICKNAME_SIZE);
+        username = readStringUTF8(dis, MAX_USERNAME_SIZE);
+        nickname = readStringUTF16BE(dis, MAX_NICKNAME_SIZE);
         uuid = readUUID(dis);
         score = dis.readInt();
         chatColor = dis.readByte();
@@ -42,8 +42,8 @@ public class PacketUpdatePlayerProfile extends Packet
 	public void write(DataOutputStream dos)
             throws IOException
     {
-        writeString(username, dos);
-        writeString(nickname, dos);
+        writeStringUTF8(username, dos);
+        writeStringUTF16BE(nickname, dos);
         writeUUID(uuid, dos);
         dos.writeInt(score);
         dos.writeByte(chatColor);
diff --git a/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuInventoryCreative.java b/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuInventoryCreative.java
index 0ac46ab45..8edb31b85 100644
--- a/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuInventoryCreative.java
+++ b/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuInventoryCreative.java
@@ -161,7 +161,11 @@ public class MenuInventoryCreative extends MenuInventory
 		{
 			if (Item.itemsList[i] != null && !Item.itemsList[i].hasTag(ItemTags.NOT_IN_CREATIVE_MENU))
 			{
-				creativeItems.add(new ItemStack(Item.itemsList[i]));
+				if (i == Items.PAINTBRUSH.id) {
+					creativeItems.add(new ItemStack(Item.itemsList[i], 1, Items.PAINTBRUSH.getMaxDamage()));
+				} else {
+					creativeItems.add(new ItemStack(Item.itemsList[i]));
+				}
 				count++;
 
 				if (i == Items.COAL.id)
@@ -173,7 +177,7 @@ public class MenuInventoryCreative extends MenuInventory
 					}
 				}
 
-				if (i == Items.DYE.id || i == Items.DOOR_OAK_PAINTED.id)
+				if (i == Items.DYE.id || i == Items.DOOR_OAK_PAINTED.id || i == Items.SIGN_PAINTED.id)
 				{
 					for (int j = 1; j < 16; j++)
 					{
diff --git a/game/core/src/main/java/net/minecraft/core/world/ExplosionCannonball.java b/game/core/src/main/java/net/minecraft/core/world/ExplosionCannonball.java
index d6982dd7b..e833a79df 100644
--- a/game/core/src/main/java/net/minecraft/core/world/ExplosionCannonball.java
+++ b/game/core/src/main/java/net/minecraft/core/world/ExplosionCannonball.java
@@ -104,9 +104,7 @@ public class ExplosionCannonball extends Explosion{
                 double d12 = worldObj.getSeenPercent(vec3, entity.bb);
                 double d13 = (1.0D - d4) * d12;
                 entity.hurt(exploder, (int)(((d13 * d13 + d13) / 2D) * 8D * (double)explosionSize + 1.0D), DamageType.BLAST);
-                entity.xd += d6 * d13;
-                entity.yd += (d8 * d13) + 0.5F;
-                entity.zd += d10 * d13;
+                entity.fling(d6 * d13, (d8 * d13) + 0.5F, d10 * d13, 1);
             }
         }
 
diff --git a/game/core/src/main/java/net/minecraft/core/world/World.java b/game/core/src/main/java/net/minecraft/core/world/World.java
index 66a4014c8..0ba9e0f16 100644
--- a/game/core/src/main/java/net/minecraft/core/world/World.java
+++ b/game/core/src/main/java/net/minecraft/core/world/World.java
@@ -14,6 +14,7 @@ import java.util.UUID;
 import com.mojang.logging.LogUtils;
 import com.mojang.nbt.tags.CompoundTag;
 
+import net.minecraft.core.block.BlockLogicOreRedstone;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.animal.MobFireflyCluster;
@@ -2631,7 +2632,7 @@ public class World implements WorldSource {
 
     public boolean getSignal(int x, int y, int z, Side side) {
         Block<?> block = getBlock(x, y, z);
-        if(isBlockNormalCube(x, y, z) && block != Blocks.BLOCK_REDSTONE && block != Blocks.PUMPKIN_REDSTONE) {
+        if(isBlockNormalCube(x, y, z) && block != Blocks.BLOCK_REDSTONE && !Block.hasLogicClass(block, BlockLogicOreRedstone.class) && block != Blocks.PUMPKIN_REDSTONE) {
             return hasDirectSignal(x, y, z);
         }
         if(block == null) {
diff --git a/game/core/src/main/java/net/minecraft/core/world/WorldSource.java b/game/core/src/main/java/net/minecraft/core/world/WorldSource.java
index 6c4507283..1ebdfe1ef 100644
--- a/game/core/src/main/java/net/minecraft/core/world/WorldSource.java
+++ b/game/core/src/main/java/net/minecraft/core/world/WorldSource.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockLogic;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.LightLayer;
@@ -17,6 +18,16 @@ public interface WorldSource
 
     TileEntity getTileEntity(int x, int y, int z);
 
+    default <T> @Nullable T getBlockLogic(final int x, final int y, final int z, final Class<T> logicClass) {
+        final Block<?> block = getBlock(x, y, z);
+        if (block == null) return null;
+        final BlockLogic logic = block.getLogic();
+        if (logicClass.isAssignableFrom(logic.getClass())) {
+            return logicClass.cast(logic);
+        }
+        return null;
+    }
+
     float getBrightness(int x, int y, int z, int blockLightValue);
     
     int getLightmapCoord(int x, int y, int z, int blockLightValue);
diff --git a/game/core/src/main/java/net/minecraft/core/world/data/SynchedEntityData.java b/game/core/src/main/java/net/minecraft/core/world/data/SynchedEntityData.java
index 5ccf3447b..6291b81c6 100644
--- a/game/core/src/main/java/net/minecraft/core/world/data/SynchedEntityData.java
+++ b/game/core/src/main/java/net/minecraft/core/world/data/SynchedEntityData.java
@@ -256,7 +256,7 @@ public class SynchedEntityData
             case TYPE_STRING:
                 String s = (String)value;
                 dos.write(metadata);
-                Packet.writeString(s, dos);
+                Packet.writeStringUTF8(s, dos);
                 break;
             case TYPE_ITEMSTACK:
                 ItemStack itemStack = (ItemStack)value;
@@ -320,7 +320,7 @@ public class SynchedEntityData
                         di = new DataItem<>(type, id, dis.readFloat());
                         break;
                     case TYPE_STRING:
-                        di = new DataItem<>(type, id, Packet.readString(dis, MAX_STRING_SIZE));
+                        di = new DataItem<>(type, id, Packet.readStringUTF8(dis, MAX_STRING_SIZE));
                         break;
                     case TYPE_ITEMSTACK:
                         short itemId = dis.readShort();
diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureOre.java b/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureOre.java
index da6e2bc97..0c2586012 100644
--- a/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureOre.java
+++ b/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureOre.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.world.generate.feature;
 
+import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
@@ -12,7 +13,7 @@ public class WorldFeatureOre extends WorldFeature
 {
     private int minableBlockId;
     private int numberOfBlocks;
-    private final Map<Integer, Integer> variantMap;
+    private final OreMap variantMap;
     @MethodParametersAnnotation(names = {"blockId", "numberOfBlocks"})
     public WorldFeatureOre(int blockId, int numberOfBlocks)
     {
@@ -21,7 +22,7 @@ public class WorldFeatureOre extends WorldFeature
         this.variantMap = null;
     }
     @MethodParametersAnnotation(names = {"blockId", "numberOfBlocks", "variantMap"})
-    public WorldFeatureOre(@NotNull Map<Integer, Integer> variantMap, int numberOfBlocks)
+    public WorldFeatureOre(@NotNull OreMap variantMap, int numberOfBlocks)
     {
         this.numberOfBlocks = numberOfBlocks;
         this.variantMap = variantMap;
@@ -99,4 +100,62 @@ public class WorldFeatureOre extends WorldFeature
 
         return true;
     }
+
+    // Oremap class, created to quickly map ints to ints without having convert them to Integer Objects, size increasing performance isn't too good and should really only be used in cases where a map is created once then almost never expanded
+    public static class OreMap {
+        private int @NotNull [] keyArr = new int[0];
+        private int @NotNull [] valArr = new int[0];
+
+        private static int @NotNull [] increaseArraySize(final int @NotNull [] array) {
+            final int[] outArr = new int[array.length + 1];
+            System.arraycopy(array, 0, outArr, 0, array.length);
+            return outArr;
+        }
+
+
+        public void put(@NotNull final Block<?> stone, @NotNull final Block<?> ore) {
+            put(stone.id(), ore.id());
+        }
+
+        public void put(final int stoneId, final int oreId) {
+            final int index = indexForKey(stoneId);
+            if (index == -1) {
+                this.keyArr = increaseArraySize(this.keyArr);
+                this.keyArr[this.keyArr.length - 1] = stoneId;
+
+                this.valArr = increaseArraySize(this.valArr);
+                this.valArr[this.valArr.length - 1] = oreId;
+            } else {
+                this.valArr[index] = oreId;
+            }
+        }
+
+        public int get(@NotNull final Block<?> stone) {
+            return get(stone.id());
+        }
+
+        public int get(final int stoneId) {
+            final int index = indexForKey(stoneId);
+            if (index == -1) return index;
+            return this.valArr[index];
+        }
+
+        private int indexForKey(final int stoneId) {
+            for (int i = 0; i < this.keyArr.length; i++) {
+                if (this.keyArr[i] == stoneId) return i;
+            }
+            return -1;
+        }
+
+        public boolean containsKey(@NotNull final Block<?> stone) {
+            return containsKey(stone.id());
+        }
+
+        public boolean containsKey(final int stoneId) {
+            for (int i = 0; i < this.keyArr.length; i++) {
+                if (this.keyArr[i] == stoneId) return true;
+            }
+            return false;
+        }
+    }
 }
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 5a4ee7ac9..07fdc652d 100644
--- a/game/core/src/main/resources/lang/en_US/gui.lang
+++ b/game/core/src/main/resources/lang/en_US/gui.lang
@@ -389,6 +389,7 @@ model.category.entity.boat.button.flag=Flag: %s
 model.category.entity.boat.button.wind=Wind: %s degrees
 model.category.entity.slime.slider.size=Slime: %s
 model.category.entity.minecart.button.cycle=Cycle Minecart
+model.category.entity.minecart.slider.color=Color: %s
 
 model.category.block.name=Block
 model.category.block.info=Block: %s
diff --git a/game/core/src/main/resources/lang/en_US/item.lang b/game/core/src/main/resources/lang/en_US/item.lang
index a8165425c..e57bb67ee 100644
--- a/game/core/src/main/resources/lang/en_US/item.lang
+++ b/game/core/src/main/resources/lang/en_US/item.lang
@@ -166,6 +166,42 @@ item.food.apple.gold.name=Golden Apple
 item.food.apple.gold.desc=Invincible! No fear!
 item.sign.name=Sign
 item.sign.desc=Mark your land, or write a message.
+
+item.sign.painted.name=Painted Sign
+item.sign.painted.desc=How did you get this?!
+item.sign.painted.black.name=Black Sign
+item.sign.painted.black.desc=Mark your land, or write a message.
+item.sign.painted.red.name=Red Sign
+item.sign.painted.red.desc=Mark your land, or write a message.
+item.sign.painted.green.name=Green Sign
+item.sign.painted.green.desc=Mark your land, or write a message.
+item.sign.painted.brown.name=Brown Sign
+item.sign.painted.brown.desc=Mark your land, or write a message.
+item.sign.painted.blue.name=Blue Sign
+item.sign.painted.blue.desc=Mark your land, or write a message.
+item.sign.painted.purple.name=Purple Sign
+item.sign.painted.purple.desc=Mark your land, or write a message.
+item.sign.painted.cyan.name=Cyan Sign
+item.sign.painted.cyan.desc=Mark your land, or write a message.
+item.sign.painted.silver.name=Light Gray Sign
+item.sign.painted.silver.desc=Mark your land, or write a message.
+item.sign.painted.gray.name=Gray Sign
+item.sign.painted.gray.desc=Mark your land, or write a message.
+item.sign.painted.pink.name=Pink Sign
+item.sign.painted.pink.desc=Mark your land, or write a message.
+item.sign.painted.lime.name=Lime Sign
+item.sign.painted.lime.desc=Mark your land, or write a message.
+item.sign.painted.yellow.name=Yellow Sign
+item.sign.painted.yellow.desc=Mark your land, or write a message.
+item.sign.painted.lightblue.name=Light Blue Sign
+item.sign.painted.lightblue.desc=Mark your land, or write a message.
+item.sign.painted.magenta.name=Magenta Sign
+item.sign.painted.magenta.desc=Mark your land, or write a message.
+item.sign.painted.orange.name=Orange Sign
+item.sign.painted.orange.desc=Mark your land, or write a message.
+item.sign.painted.white.name=White Sign
+item.sign.painted.white.desc=Mark your land, or write a message.
+
 item.door.oak.name=Wooden Door
 item.door.oak.desc=Every house needs one.
 item.bucket.name=Bucket
diff --git a/game/core/src/main/resources/lang/en_US/options.lang b/game/core/src/main/resources/lang/en_US/options.lang
index 0ea6f1bf5..f85f82a36 100644
--- a/game/core/src/main/resources/lang/en_US/options.lang
+++ b/game/core/src/main/resources/lang/en_US/options.lang
@@ -258,6 +258,7 @@ key.switchPerspective=Switch Perspective
 key.screenshot=Take Screenshot
 key.cinematicCamera=Toggle Cinematic Camera
 key.autoWalk=Auto Walk
+key.easyBridge=Toggle Easy Bridge
 key.sprint=Sprint (if enabled)
 key.toggleDebug=Toggle Debug
 key.toggleOverlay=Toggle Overlays
diff --git a/game/core/src/main/resources/lang/en_US/strings.lang b/game/core/src/main/resources/lang/en_US/strings.lang
index 10cf51963..1accede2c 100644
--- a/game/core/src/main/resources/lang/en_US/strings.lang
+++ b/game/core/src/main/resources/lang/en_US/strings.lang
@@ -132,6 +132,10 @@ sign.image.craft=Craft
 sign.image.afk=AFK
 sign.image.brb=BRB
 sign.image.heart=Heart
+sign.image.arrows_left_right=Left Right Arrows
+sign.image.arrows_up_down=Up Down Arrows
+sign.image.check=Check
+sign.image.exit=Exit
 
 record.13=13
 record.cat=Cat
diff --git a/game/core/src/main/resources/lang/en_US/tile.lang b/game/core/src/main/resources/lang/en_US/tile.lang
index 378ea87d6..dd9f90954 100644
--- a/game/core/src/main/resources/lang/en_US/tile.lang
+++ b/game/core/src/main/resources/lang/en_US/tile.lang
@@ -833,10 +833,80 @@ tile.crops.pumpkin.desc=A ripening pumpkin, plucked from the ground.
 tile.farmland.dirt.name=Farmland
 tile.farmland.dirt.desc=Tilled soil for growing crops.
 
-tile.sign.post.planks.oak.name=Oak Signpost
-tile.sign.post.planks.oak.desc=A free-standing oak sign.
-tile.sign.wall.planks.oak.name=Oak Wall Sign
-tile.sign.wall.planks.oak.desc=An oak sign placed on a wall.
+tile.sign.post.planks.oak.name=Wooden Signpost
+tile.sign.post.planks.oak.desc=A free-standing wooden sign.
+tile.sign.wall.planks.oak.name=Wooden Wall Sign
+tile.sign.wall.planks.oak.desc=An wooden sign placed on a wall.
+
+tile.sign.wall.planks.oak.painted.name=Mystery Wooden Chest
+tile.sign.wall.planks.oak.painted.desc=How did you get this?!
+tile.sign.wall.planks.oak.painted.black.name=Black Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.black.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.red.name=Red Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.red.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.green.name=Green Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.green.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.brown.name=Brown Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.brown.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.blue.name=Blue Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.blue.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.purple.name=Purple Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.purple.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.cyan.name=Cyan Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.cyan.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.silver.name=Light Gray Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.silver.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.gray.name=Gray Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.gray.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.pink.name=Pink Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.pink.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.lime.name=Lime Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.lime.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.yellow.name=Yellow Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.yellow.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.lightblue.name=Light Blue Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.lightblue.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.magenta.name=Magenta Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.magenta.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.orange.name=Orange Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.orange.desc=An wooden sign placed on a wall.
+tile.sign.wall.planks.oak.painted.white.name=White Wooden Wall Sign
+tile.sign.wall.planks.oak.painted.white.desc=An wooden sign placed on a wall.
+
+tile.sign.post.planks.oak.painted.name=Mystery Wooden Chest
+tile.sign.post.planks.oak.painted.desc=How did you get this?!
+tile.sign.post.planks.oak.painted.black.name=Black Wooden Signpost
+tile.sign.post.planks.oak.painted.black.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.red.name=Red Wooden Signpost
+tile.sign.post.planks.oak.painted.red.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.green.name=Green Wooden Signpost
+tile.sign.post.planks.oak.painted.green.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.brown.name=Brown Wooden Signpost
+tile.sign.post.planks.oak.painted.brown.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.blue.name=Blue Wooden Signpost
+tile.sign.post.planks.oak.painted.blue.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.purple.name=Purple Wooden Signpost
+tile.sign.post.planks.oak.painted.purple.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.cyan.name=Cyan Wooden Signpost
+tile.sign.post.planks.oak.painted.cyan.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.silver.name=Light Gray Wooden Signpost
+tile.sign.post.planks.oak.painted.silver.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.gray.name=Gray Wooden Signpost
+tile.sign.post.planks.oak.painted.gray.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.pink.name=Pink Wooden Signpost
+tile.sign.post.planks.oak.painted.pink.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.lime.name=Lime Wooden Signpost
+tile.sign.post.planks.oak.painted.lime.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.yellow.name=Yellow Wooden Signpost
+tile.sign.post.planks.oak.painted.yellow.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.lightblue.name=Light Blue Wooden Signpost
+tile.sign.post.planks.oak.painted.lightblue.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.magenta.name=Magenta Wooden Signpost
+tile.sign.post.planks.oak.painted.magenta.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.orange.name=Orange Wooden Signpost
+tile.sign.post.planks.oak.painted.orange.desc=A free-standing wooden sign.
+tile.sign.post.planks.oak.painted.white.name=White Wooden Signpost
+tile.sign.post.planks.oak.painted.white.desc=A free-standing wooden sign.
 
 tile.layer.snow.name=Snow Layer
 tile.layer.snow.desc=A flat layer of snow.
diff --git a/game/server/build.gradle.kts b/game/server/build.gradle.kts
index 2d965b857..b527a5cd0 100644
--- a/game/server/build.gradle.kts
+++ b/game/server/build.gradle.kts
@@ -14,6 +14,15 @@ val include: Configuration by configurations.creating
 repositories {
     mavenCentral()
     maven("https://libraries.minecraft.net/")
+
+    ivy {
+        url = uri("https://github.com/Better-than-Adventure")
+        patternLayout {
+            artifact("[organisation]/releases/download/[revision]/brigadier-[revision].jar")
+            m2Compatible
+        }
+        metadataSources { artifact() }
+    }
 }
 
 dependencies {
@@ -30,6 +39,7 @@ dependencies {
     // </core dependencies>
 }
 
+
 java {
     sourceCompatibility = JavaVersion.VERSION_1_8
     targetCompatibility = JavaVersion.VERSION_1_8
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/ConsoleCommandSource.java b/game/server/src/main/java/net/minecraft/server/net/command/ConsoleCommandSource.java
index 6cdc9c42f..2d3a259a6 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/ConsoleCommandSource.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/ConsoleCommandSource.java
@@ -29,7 +29,7 @@ public class ConsoleCommandSource implements CommandSource, IServerCommandSource
     }
 
     @Override
-    public Collection<String> getPlayerNames() {
+    public Collection<String> getPlayerUsernames() {
         List<String> list = new ArrayList<>();
         for (Player player : server.playerList.playerEntities) {
             list.add(player.username);
@@ -37,9 +37,18 @@ public class ConsoleCommandSource implements CommandSource, IServerCommandSource
         return list;
     }
 
+    @Override
+    public Collection<String> getPlayerNicknames() {
+        List<String> list = new ArrayList<>();
+        for (Player player : server.playerList.playerEntities) {
+            list.add(player.nickname);
+        }
+        return list;
+    }
+
     @Override
     public Collection<String> getEntitySuggestions() {
-        return this.getPlayerNames();
+        return this.getPlayerUsernames();
     }
 
     @Override
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/ServerCommandSource.java b/game/server/src/main/java/net/minecraft/server/net/command/ServerCommandSource.java
index 7b041ec01..92053153e 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/ServerCommandSource.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/ServerCommandSource.java
@@ -27,7 +27,7 @@ public class ServerCommandSource implements CommandSource, IServerCommandSource
     }
 
     @Override
-    public Collection<String> getPlayerNames() {
+    public Collection<String> getPlayerUsernames() {
         List<String> list = new ArrayList<>();
         for (Player player : server.playerList.playerEntities) {
             list.add(player.username);
@@ -35,9 +35,18 @@ public class ServerCommandSource implements CommandSource, IServerCommandSource
         return list;
     }
 
+    @Override
+    public Collection<String> getPlayerNicknames() {
+        List<String> list = new ArrayList<>();
+        for (Player player : server.playerList.playerEntities) {
+            list.add(player.nickname);
+        }
+        return list;
+    }
+
     @Override
     public Collection<String> getEntitySuggestions() {
-        return this.getPlayerNames();
+        return this.getPlayerUsernames();
     }
 
     @Override
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandBan.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandBan.java
index bb32380bf..ce2f8743c 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandBan.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandBan.java
@@ -2,9 +2,9 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.StringArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeString;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.CommandManager;
@@ -22,10 +22,10 @@ public class CommandBan implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
         dispatcher.register
         (
-            LiteralArgumentBuilder.<CommandSource>literal("ban")
+            ArgumentBuilderLiteral.<CommandSource>literal("ban")
                 .requires(CommandSource::hasAdmin)
-                .then(LiteralArgumentBuilder.<CommandSource>literal("username")
-                    .then(RequiredArgumentBuilder.<CommandSource, String>argument("name", StringArgumentType.word()).executes(c -> {
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("username")
+                    .then(ArgumentBuilderRequired.<CommandSource, String>argument("name", ArgumentTypeString.word()).executes(c -> {
                         CommandSource source = c.getSource();
                         if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
 
@@ -51,8 +51,8 @@ public class CommandBan implements CommandManager.CommandRegistry {
                         }
                         return Command.SINGLE_SUCCESS;
                     })))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("ip")
-                    .then(RequiredArgumentBuilder.<CommandSource, String>argument("address", StringArgumentType.word()).executes(c -> {
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("ip")
+                    .then(ArgumentBuilderRequired.<CommandSource, String>argument("address", ArgumentTypeString.word()).executes(c -> {
                         CommandSource source = c.getSource();
                         if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
 
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java
index c90675bb9..33e7512a1 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java
@@ -2,8 +2,8 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 import com.mojang.brigadier.tree.CommandNode;
 import net.minecraft.core.entity.Entity;
@@ -22,8 +22,8 @@ import java.util.List;
 
 public class CommandColor implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        CommandNode<CommandSource> command = dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("color")
-            .then(LiteralArgumentBuilder.<CommandSource>literal("get")
+        CommandNode<CommandSource> command = dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("color")
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("get")
                 .executes(c -> {
                     CommandSource source = c.getSource();
                     if (!(source instanceof IServerCommandSource))
@@ -36,7 +36,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                     source.sendMessage(I18n.getInstance().translateKeyAndFormat("command.commands.color.get.success", color + color.getNames()[0]));
                     return Command.SINGLE_SUCCESS;
                 })
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.player())
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.username())
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         if (!(source instanceof IServerCommandSource))
@@ -49,90 +49,90 @@ public class CommandColor implements CommandManager.CommandRegistry {
                         source.sendMessage(I18n.getInstance().translateKeyAndFormat("command.commands.color.get.success_other", color + color.getNames()[0]));
                         return Command.SINGLE_SUCCESS;
                     })))
-            .then(LiteralArgumentBuilder.<CommandSource>literal("set")
-                .then(LiteralArgumentBuilder.<CommandSource>literal("white")
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("set")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("white")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 0);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("orange")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("orange")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 1);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("magenta")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("magenta")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 2);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("light_blue")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("light_blue")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 3);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("yellow")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("yellow")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 4);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("lime")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("lime")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 5);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("pink")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("pink")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 6);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("gray")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("gray")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 7);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("light_gray")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("light_gray")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 8);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("cyan")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("cyan")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 9);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("purple")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("purple")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 10);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("blue")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("blue")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 11);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("brown")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("brown")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 12);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("green")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("green")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 13);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("red")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("red")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 14);
                     }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("black")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("black")
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         return setColor((PlayerServer) source.getSender(), source, (byte) 15);
                     }))
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.players())
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.usernames())
                     .requires(CommandSource::hasAdmin)
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("white")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("white")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -142,7 +142,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("orange")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("orange")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -152,7 +152,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("magenta")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("magenta")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -162,7 +162,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("light_blue")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("light_blue")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -172,7 +172,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("yellow")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("yellow")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -182,7 +182,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("lime")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("lime")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -192,7 +192,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("pink")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("pink")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -202,7 +202,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("gray")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("gray")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -212,7 +212,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("light_gray")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("light_gray")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -222,7 +222,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("cyan")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("cyan")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -232,7 +232,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("purple")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("purple")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -242,7 +242,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("blue")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("blue")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -252,7 +252,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("brown")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("brown")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -262,7 +262,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("green")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("green")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -272,7 +272,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("red")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("red")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -282,7 +282,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("black")
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("black")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -292,7 +292,7 @@ public class CommandColor implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         })))));
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("colour")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("colour")
             .redirect(command));
     }
 
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandDeop.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandDeop.java
index 2ae778173..09216b13d 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandDeop.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandDeop.java
@@ -2,8 +2,8 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.lang.I18n;
@@ -22,9 +22,9 @@ public class CommandDeop implements CommandManager.CommandRegistry {
     private static final SimpleCommandExceptionType FAILURE = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("command.commands.deop.exception_failure"));
 
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("deop")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("deop")
             .requires(CommandSource::hasAdmin)
-            .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.players())
+            .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.usernames())
                 .executes(c -> {
                     CommandSource source = c.getSource();
                     if (!(source instanceof IServerCommandSource))
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandDifficulty.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandDifficulty.java
index 4d8c4610f..1c55c19d3 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandDifficulty.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandDifficulty.java
@@ -2,7 +2,7 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.CommandManager;
@@ -17,7 +17,7 @@ import java.util.List;
 
 public class CommandDifficulty implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("difficulty")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("difficulty")
                 .requires(CommandSource::hasAdmin)
                 .executes(c -> {
                     CommandSource source = c.getSource();
@@ -40,22 +40,22 @@ public class CommandDifficulty implements CommandManager.CommandRegistry {
                     }
                     return Command.SINGLE_SUCCESS;
                 })
-                .then(LiteralArgumentBuilder.<CommandSource>literal("peaceful")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("peaceful")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             return setDifficulty(source, 0);
                         }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("easy")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("easy")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             return setDifficulty(source, 1);
                         }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("normal")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("normal")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             return setDifficulty(source, 2);
                         }))
-                .then(LiteralArgumentBuilder.<CommandSource>literal("hard")
+                .then(ArgumentBuilderLiteral.<CommandSource>literal("hard")
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             return setDifficulty(source, 3);
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandEmotes.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandEmotes.java
index 42c2b9043..250f43fbc 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandEmotes.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandEmotes.java
@@ -1,7 +1,7 @@
 package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
 import net.minecraft.core.net.ChatEmotes;
 import net.minecraft.core.net.command.CommandManager;
 import net.minecraft.core.net.command.TextFormatting;
@@ -12,7 +12,7 @@ import java.util.Map;
 
 public class CommandEmotes implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("emotes")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("emotes")
             .executes(c -> {
                 CommandSource source = c.getSource();
                 source.sendTranslatableMessage("command.commands.emotes.success");
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandKick.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandKick.java
index ea6b0d048..9fdf736d0 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandKick.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandKick.java
@@ -2,8 +2,8 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.CommandManager;
@@ -21,9 +21,9 @@ public class CommandKick implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
         dispatcher.register
             (
-                LiteralArgumentBuilder.<CommandSource>literal("kick")
+                ArgumentBuilderLiteral.<CommandSource>literal("kick")
                     .requires(CommandSource::hasAdmin)
-                    .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("player", ArgumentTypeEntity.player()).executes(c -> {
+                    .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("player", ArgumentTypeEntity.username()).executes(c -> {
                             CommandSource source = c.getSource();
                             if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
 
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandList.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandList.java
index 56e822fbb..17b47e4cf 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandList.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandList.java
@@ -2,7 +2,7 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.CommandManager;
@@ -16,7 +16,7 @@ public class CommandList implements CommandManager.CommandRegistry {
     private static final SimpleCommandExceptionType FAILURE = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("command.commands.list.exception_failure"));
 
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("list")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("list")
                 .executes(c -> {
                     CommandSource source = c.getSource();
                     if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandMe.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandMe.java
index 14b26be7d..fab171f39 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandMe.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandMe.java
@@ -2,40 +2,41 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.BoolArgumentType;
-import com.mojang.brigadier.arguments.StringArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeBool;
+import com.mojang.brigadier.arguments.ArgumentTypeString;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import net.minecraft.core.net.command.CommandManager;
 import net.minecraft.core.net.command.CommandSource;
+import net.minecraft.core.net.command.TextFormatting;
+import net.minecraft.core.util.helper.LoggedPrintStream;
 import net.minecraft.server.net.command.IServerCommandSource;
 import net.minecraft.core.net.command.exceptions.CommandExceptions;
 import net.minecraft.core.net.packet.PacketChat;
 
 public class CommandMe implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("me")
-            .then(RequiredArgumentBuilder.<CommandSource, Boolean>argument("asterisk", BoolArgumentType.bool())
-                .then(RequiredArgumentBuilder.<CommandSource, String>argument("message", StringArgumentType.greedyString())
-                    .executes(c -> {
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("me")
+            .then(ArgumentBuilderRequired.<CommandSource, String>argument("message", ArgumentTypeString.greedyString())
+                .executes(c ->
+                    {
                         CommandSource source = c.getSource();
-                        String message = StringArgumentType.getString(c, "message");
-                        boolean asterisk = BoolArgumentType.getBool(c, "asterisk");
+                        String message = ArgumentTypeString.getString(c, "message");
                         if (!(source instanceof IServerCommandSource))
                             throw CommandExceptions.multiplayerWorldOnly().create();
-                        String senderName = source.getName();
-                        ((IServerCommandSource) source).getServer().playerList.sendPacketToAllPlayers(new PacketChat((asterisk ? "* " : "") + senderName + message));
+                        if(source.getSender() == null) return 0;
+                        String senderName = source.getSender().getDisplayName();
+
+                        ((IServerCommandSource) source).getServer().playerList.sendPacketToAllPlayers(
+                            new PacketChat(
+                            TextFormatting.LIGHT_GRAY + "* " + (source.getSender().nickname.isEmpty() ? "" : TextFormatting.ITALIC) + TextFormatting.removeAllFormatting(senderName) + " " + TextFormatting.RESET + TextFormatting.LIGHT_GRAY + message
+                            )
+                        );
+
                         return Command.SINGLE_SUCCESS;
-                    })))
-            .then(RequiredArgumentBuilder.<CommandSource, String>argument("message", StringArgumentType.greedyString())
-                .executes(c -> {
-                    CommandSource source = c.getSource();
-                    String message = StringArgumentType.getString(c, "message");
-                    if (!(source instanceof IServerCommandSource))
-                        throw CommandExceptions.multiplayerWorldOnly().create();
-                    String senderName = source.getName();
-                    ((IServerCommandSource) source).getServer().playerList.sendPacketToAllPlayers(new PacketChat("* " + senderName + message));
-                    return Command.SINGLE_SUCCESS;
-                })));
+                    }
+                )
+            )
+        );
     }
 }
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java
index a8d76ccf1..e33cd7990 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java
@@ -2,9 +2,9 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.StringArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeString;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 import com.mojang.brigadier.tree.CommandNode;
 import net.minecraft.core.entity.Entity;
@@ -23,11 +23,10 @@ public class CommandNickname implements CommandManager.CommandRegistry {
     private static final SimpleCommandExceptionType NICKNAME_TOO_SMALL = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("command.commands.nickname.exception_too_small"));
 
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        CommandNode<CommandSource> command = dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("nickname")
-            .then(LiteralArgumentBuilder.<CommandSource>literal("set")
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.player())
-                    .requires(CommandSource::hasAdmin)
-                    .then(RequiredArgumentBuilder.<CommandSource, String>argument("nickname", StringArgumentType.greedyString())
+        CommandNode<CommandSource> command = dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("nickname")
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("set")
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.username()).requires(CommandSource::hasAdmin)
+                    .then(ArgumentBuilderRequired.<CommandSource, String>argument("nickname", ArgumentTypeString.string())
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -49,7 +48,7 @@ public class CommandNickname implements CommandManager.CommandRegistry {
                             }
                             return Command.SINGLE_SUCCESS;
                         })))
-                .then(RequiredArgumentBuilder.<CommandSource, String>argument("nickname", StringArgumentType.greedyString())
+                .then(ArgumentBuilderRequired.<CommandSource, String>argument("nickname", ArgumentTypeString.string())
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         String nickname = c.getArgument("nickname", String.class);
@@ -68,8 +67,8 @@ public class CommandNickname implements CommandManager.CommandRegistry {
 
                         return Command.SINGLE_SUCCESS;
                     })))
-            .then(LiteralArgumentBuilder.<CommandSource>literal("get")
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.player())
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("get")
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.username())
                     .executes(c -> {
                         CommandSource source = c.getSource();
                         EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -79,8 +78,8 @@ public class CommandNickname implements CommandManager.CommandRegistry {
                         source.sendTranslatableMessage("command.commands.nickname.get.success", player.username, player.nickname);
                         return Command.SINGLE_SUCCESS;
                     })))
-            .then(LiteralArgumentBuilder.<CommandSource>literal("reset")
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.player())
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("reset")
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.username())
                     .requires(CommandSource::hasAdmin)
                     .executes(c -> {
                         CommandSource source = c.getSource();
@@ -115,7 +114,7 @@ public class CommandNickname implements CommandManager.CommandRegistry {
 
                     return Command.SINGLE_SUCCESS;
                 })));
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("nick")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("nick")
             .redirect(command));
     }
 }
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandOp.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandOp.java
index f715de74a..7a68b197e 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandOp.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandOp.java
@@ -2,8 +2,8 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.lang.I18n;
@@ -22,9 +22,9 @@ public class CommandOp implements CommandManager.CommandRegistry {
     private static final SimpleCommandExceptionType FAILURE = new SimpleCommandExceptionType(() -> I18n.getInstance().translateKey("command.commands.op.exception_failure"));
 
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("op")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("op")
             .requires(CommandSource::hasAdmin)
-            .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.players())
+            .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.usernames())
                 .executes(c -> {
                     CommandSource source = c.getSource();
                     if (!(source instanceof IServerCommandSource))
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandSave.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandSave.java
index 632b0e55f..86cd01244 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandSave.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandSave.java
@@ -2,9 +2,9 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.IntegerArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeInteger;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.CommandManager;
@@ -20,9 +20,9 @@ public class CommandSave implements CommandManager.CommandRegistry {
         new DynamicCommandExceptionType(arg -> () -> I18n.getInstance().translateKeyAndFormat("command.commands.save.exception_failure", arg));
 
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("save")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("save")
                     .requires(CommandSource::hasAdmin)
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("all").executes(c -> {
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("all").executes(c -> {
                         CommandSource source = c.getSource();
                         if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
 
@@ -39,7 +39,7 @@ public class CommandSave implements CommandManager.CommandRegistry {
 
                         return Command.SINGLE_SUCCESS;
                     }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("on").executes(c -> {
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("on").executes(c -> {
                         CommandSource source = c.getSource();
                         if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
 
@@ -52,7 +52,7 @@ public class CommandSave implements CommandManager.CommandRegistry {
 
                         return Command.SINGLE_SUCCESS;
                     }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("off").executes(c -> {
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("off").executes(c -> {
                         CommandSource source = c.getSource();
                         if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
 
@@ -65,8 +65,8 @@ public class CommandSave implements CommandManager.CommandRegistry {
 
                         return Command.SINGLE_SUCCESS;
                     }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("interval")
-                        .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("value", IntegerArgumentType.integer())
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("interval")
+                        .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("value", ArgumentTypeInteger.integer())
                             .executes(c -> {
                                 CommandSource source = c.getSource();
                                 if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
@@ -80,8 +80,8 @@ public class CommandSave implements CommandManager.CommandRegistry {
                                 c.getSource().sendTranslatableMessage("command.commands.save.interval", interval);
                                 return Command.SINGLE_SUCCESS;
                     })))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("amount")
-                        .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("value", IntegerArgumentType.integer())
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("amount")
+                        .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("value", ArgumentTypeInteger.integer())
                             .executes(c -> {
                                 CommandSource source = c.getSource();
                                 if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandScore.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandScore.java
index 791928995..e9273d40f 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandScore.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandScore.java
@@ -1,9 +1,9 @@
 package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.IntegerArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeInteger;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
@@ -21,8 +21,8 @@ import java.util.List;
 
 public class CommandScore implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("score")
-            .then(LiteralArgumentBuilder.<CommandSource>literal("get")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("score")
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("get")
                 .executes(c -> {
                     CommandSource source = c.getSource();
                     Player player = source.getSender();
@@ -30,7 +30,7 @@ public class CommandScore implements CommandManager.CommandRegistry {
                     source.sendTranslatableMessage("command.commands.score.get.success", player.score);
                     return player.score;
                 })
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.player())
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.username())
                     .requires(CommandSource::hasAdmin)
                     .executes(c -> {
                         CommandSource source = c.getSource();
@@ -43,10 +43,10 @@ public class CommandScore implements CommandManager.CommandRegistry {
                         }
                         return player.score;
                     })))
-            .then(LiteralArgumentBuilder.<CommandSource>literal("set")
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("set")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.players())
-                    .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("score", IntegerArgumentType.integer(0, Integer.MAX_VALUE))
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.usernames())
+                    .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("score", ArgumentTypeInteger.integer(0, Integer.MAX_VALUE))
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
@@ -57,10 +57,10 @@ public class CommandScore implements CommandManager.CommandRegistry {
                             }
                             return score;
                         }))))
-            .then(LiteralArgumentBuilder.<CommandSource>literal("add")
+            .then(ArgumentBuilderLiteral.<CommandSource>literal("add")
                 .requires(CommandSource::hasAdmin)
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.players())
-                    .then(RequiredArgumentBuilder.<CommandSource, Integer>argument("score", IntegerArgumentType.integer(0, Integer.MAX_VALUE))
+                .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.usernames())
+                    .then(ArgumentBuilderRequired.<CommandSource, Integer>argument("score", ArgumentTypeInteger.integer(0, Integer.MAX_VALUE))
                         .executes(c -> {
                             CommandSource source = c.getSource();
                             EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandStop.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandStop.java
index 79cdd1cc2..a47919d11 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandStop.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandStop.java
@@ -2,7 +2,7 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
 import net.minecraft.core.net.command.CommandManager;
 import net.minecraft.core.world.World;
 import net.minecraft.server.MinecraftServer;
@@ -12,7 +12,7 @@ import net.minecraft.core.net.command.exceptions.CommandExceptions;
 
 public class CommandStop implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("stop")
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("stop")
                 .requires(CommandSource::hasAdmin)
                 .executes(c -> {
                     CommandSource source = c.getSource();
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandUnban.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandUnban.java
index 9b28d8edd..07a382de5 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandUnban.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandUnban.java
@@ -2,9 +2,9 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.StringArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeString;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.CommandManager;
@@ -21,10 +21,10 @@ public class CommandUnban implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
         dispatcher.register
             (
-                LiteralArgumentBuilder.<CommandSource>literal("unban")
+                ArgumentBuilderLiteral.<CommandSource>literal("unban")
                     .requires(CommandSource::hasAdmin)
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("username")
-                        .then(RequiredArgumentBuilder.<CommandSource, String>argument("name", StringArgumentType.word()).executes(c -> {
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("username")
+                        .then(ArgumentBuilderRequired.<CommandSource, String>argument("name", ArgumentTypeString.word()).executes(c -> {
                             CommandSource source = c.getSource();
                             if (!(source instanceof IServerCommandSource))
                                 throw CommandExceptions.multiplayerWorldOnly().create();
@@ -40,8 +40,8 @@ public class CommandUnban implements CommandManager.CommandRegistry {
                             });
                             return Command.SINGLE_SUCCESS;
                         })))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("ip")
-                        .then(RequiredArgumentBuilder.<CommandSource, String>argument("address", StringArgumentType.word()).executes(c -> {
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("ip")
+                        .then(ArgumentBuilderRequired.<CommandSource, String>argument("address", ArgumentTypeString.word()).executes(c -> {
                             CommandSource source = c.getSource();
                             if (!(source instanceof IServerCommandSource))
                                 throw CommandExceptions.multiplayerWorldOnly().create();
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandWhitelist.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandWhitelist.java
index 066175427..ed00e48c8 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandWhitelist.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandWhitelist.java
@@ -2,9 +2,9 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.arguments.StringArgumentType;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.arguments.ArgumentTypeString;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.net.command.CommandManager;
@@ -25,9 +25,9 @@ public class CommandWhitelist implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
         dispatcher.register
             (
-                LiteralArgumentBuilder.<CommandSource>literal("whitelist")
+                ArgumentBuilderLiteral.<CommandSource>literal("whitelist")
                     .requires(CommandSource::hasAdmin)
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("on").executes(c -> {
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("on").executes(c -> {
                         CommandSource source = c.getSource();
                         if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
 
@@ -38,7 +38,7 @@ public class CommandWhitelist implements CommandManager.CommandRegistry {
                         server.playerList.whitelistEnforced = true;
                         return Command.SINGLE_SUCCESS;
                     }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("off").executes(c -> {
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("off").executes(c -> {
                         CommandSource source = c.getSource();
                         if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
 
@@ -49,7 +49,7 @@ public class CommandWhitelist implements CommandManager.CommandRegistry {
                         server.playerList.whitelistEnforced = false;
                         return Command.SINGLE_SUCCESS;
                     }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("list").executes(c -> {
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("list").executes(c -> {
                         CommandSource source = c.getSource();
                         if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
 
@@ -66,7 +66,7 @@ public class CommandWhitelist implements CommandManager.CommandRegistry {
                         c.getSource().sendTranslatableMessage("command.commands.whitelist.list", message);
                         return Command.SINGLE_SUCCESS;
                     }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("reload").executes(c -> {
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("reload").executes(c -> {
                         CommandSource source = c.getSource();
                         if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
 
@@ -75,8 +75,8 @@ public class CommandWhitelist implements CommandManager.CommandRegistry {
                         c.getSource().sendTranslatableMessage("command.commands.whitelist.reload");
                         return Command.SINGLE_SUCCESS;
                     }))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("add")
-                        .then(RequiredArgumentBuilder.<CommandSource, String>argument("name", StringArgumentType.word())
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("add")
+                        .then(ArgumentBuilderRequired.<CommandSource, String>argument("name", ArgumentTypeString.word())
                             .executes(c -> {
                         CommandSource source = c.getSource();
                         if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
@@ -97,8 +97,8 @@ public class CommandWhitelist implements CommandManager.CommandRegistry {
                         }
                         return Command.SINGLE_SUCCESS;
                     })))
-                    .then(LiteralArgumentBuilder.<CommandSource>literal("remove")
-                        .then(RequiredArgumentBuilder.<CommandSource, String>argument("name", StringArgumentType.word())
+                    .then(ArgumentBuilderLiteral.<CommandSource>literal("remove")
+                        .then(ArgumentBuilderRequired.<CommandSource, String>argument("name", ArgumentTypeString.word())
                             .executes(c -> {
                                 CommandSource source = c.getSource();
                                 if (!(source instanceof IServerCommandSource)) throw CommandExceptions.multiplayerWorldOnly().create();
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandWhoIs.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandWhoIs.java
index d8dcc8dbc..041a3734d 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandWhoIs.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandWhoIs.java
@@ -2,8 +2,8 @@ package net.minecraft.server.net.command.commands;
 
 import com.mojang.brigadier.Command;
 import com.mojang.brigadier.CommandDispatcher;
-import com.mojang.brigadier.builder.LiteralArgumentBuilder;
-import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.builder.ArgumentBuilderLiteral;
+import com.mojang.brigadier.builder.ArgumentBuilderRequired;
 import com.mojang.brigadier.tree.CommandNode;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.CommandManager;
@@ -14,17 +14,20 @@ import net.minecraft.core.net.command.helpers.EntitySelector;
 
 public class CommandWhoIs implements CommandManager.CommandRegistry {
     public void register(CommandDispatcher<CommandSource> dispatcher) {
-        CommandNode<CommandSource> command = dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("whois")
-                .then(RequiredArgumentBuilder.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.player())
-                        .executes(c -> {
-                            CommandSource source = c.getSource();
-                            EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
-                            Player player = (Player) entitySelector.get(source).get(0);
+        CommandNode<CommandSource> command = dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("whois")
+            .then(ArgumentBuilderRequired.<CommandSource, EntitySelector>argument("target", ArgumentTypeEntity.nickname())
+                .executes(c ->
+                    {
+                        CommandSource source = c.getSource();
+                        EntitySelector entitySelector = c.getArgument("target", EntitySelector.class);
+                        Player player = (Player) entitySelector.get(source).get(0);
 
-                            source.sendTranslatableMessage("command.commands.whois.success", CommandHelper.getEntityName(player), player.username);
-                            return Command.SINGLE_SUCCESS;
-                        })));
-        dispatcher.register(LiteralArgumentBuilder.<CommandSource>literal("realname")
-                .redirect(command));
+                        source.sendTranslatableMessage("command.commands.whois.success", CommandHelper.getEntityName(player), player.username);
+                        return Command.SINGLE_SUCCESS;
+                    }
+                )
+            )
+        );
+        dispatcher.register(ArgumentBuilderLiteral.<CommandSource>literal("realname").redirect(command));
     }
 }
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index c536f6277..1b50d95b0 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -5,7 +5,7 @@ lwjgl = "3.3.4"
 [libraries]
 jetbrains-annotations = { module = "org.jetbrains:annotations", version = "24.0.0" }
 gson = { module = "com.google.code.gson:gson", version = "2.10.1" }
-brigadier = { module = "com.mojang:brigadier", version = "1.0.18" }
+brigadier = { module = "bta-brigadier:bta-brigadier", version = "1.0.1"}
 slf4j-api = { module = "org.slf4j:slf4j-api", version = "2.0.7" }
 log4j-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" }
 log4j-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" }
diff --git a/util/datagen/build.gradle.kts b/util/datagen/build.gradle.kts
index 6f0db8857..b24a50db5 100644
--- a/util/datagen/build.gradle.kts
+++ b/util/datagen/build.gradle.kts
@@ -5,11 +5,20 @@ plugins {
 repositories {
     mavenCentral()
     maven("https://libraries.minecraft.net/")
+    ivy {
+        url = uri("https://github.com/Better-than-Adventure")
+        patternLayout {
+            artifact("[organisation]/releases/download/[revision]/brigadier-[revision].jar")
+            m2Compatible
+        }
+        metadataSources { artifact() }
+    }
 }
 
 dependencies {
     implementation(project(":game:core"))
 
+    implementation(libs.brigadier)
     implementation(libs.gson)
     implementation(libs.jetbrains.annotations)
 }
diff --git a/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java b/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
index 58feeca8d..0b64c0ae7 100644
--- a/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
+++ b/util/datagen/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
@@ -39,6 +39,7 @@ class WorkbenchGenerator {
         generateStairs();
 
         generateDoors();
+        generateSigns();
         generateTrapDoors();
         generateFences();
         generateFenceGates();
@@ -193,7 +194,7 @@ class WorkbenchGenerator {
                 "XXX")
             .addInput('X', Items.STICK)
             .addInput('W', "minecraft:wools")
-            .create("painting", Items.PAINTING.getDefaultStack());
+            .create("painting", new ItemStack(Items.PAINTING, 1, Items.PAINTING.getMaxDamage()));
 
         RecipeBuilder.Shaped(CORE_NAMESPACE)
             .setShape(
@@ -229,15 +230,6 @@ class WorkbenchGenerator {
             .addInput('X', Items.STICK)
             .create("ladder", new ItemStack(Blocks.LADDER_OAK, 2));
 
-        RecipeBuilder.Shaped(CORE_NAMESPACE)
-            .setShape(
-                "XXX",
-                "XXX",
-                " # ")
-            .addInput('X', "minecraft:planks")
-            .addInput('#', Items.STICK)
-            .create("sign", new ItemStack(Items.SIGN, 4));
-
         RecipeBuilder.Shaped(CORE_NAMESPACE)
             .setShape(
                 "# #",
@@ -383,6 +375,11 @@ class WorkbenchGenerator {
             .addInput(Items.BUCKET_WATER)
             .create("sponge_to_wet_sponge", Blocks.SPONGE_WET.getDefaultStack());
 
+        RecipeBuilder.Shapeless(CORE_NAMESPACE)
+            .addInput(Blocks.PUMICE_DRY)
+            .addInput(Items.BUCKET_LAVA)
+            .create("pumice_to_wet_pumice", Blocks.PUMICE_WET.getDefaultStack());
+
         RecipeBuilder.Shapeless(CORE_NAMESPACE)
             .addInput(Blocks.PUMPKIN)
             .create("pumpkin_to_pumpkin_seeds", new ItemStack(Items.SEEDS_PUMPKIN, 4));
@@ -872,6 +869,22 @@ class WorkbenchGenerator {
         door.addInput('X', Items.INGOT_STEEL_CRUDE).create("steel_door", new ItemStack(Items.DOOR_STEEL, stackSize));
     }
 
+    private static void generateSigns() {
+        RecipeBuilderShaped sign = RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "XXX",
+                "XXX",
+                " # ")
+            .addInput('#', Items.STICK);
+        final int stackSize = 4;
+
+        sign.addInput('X', Blocks.PLANKS_OAK)
+            .create("sign", new ItemStack(Items.SIGN, stackSize));
+        for (final DyeColor color : DyeColor.values()) {
+            sign.addInput('X', Blocks.PLANKS_OAK_PAINTED, color.blockMeta).create(color.colorID + "_sign", new ItemStack(Items.SIGN_PAINTED, stackSize, color.itemMeta));
+        }
+    }
+
     private static void generateTrapDoors() {
         RecipeBuilderShaped door = RecipeBuilder.Shaped(CORE_NAMESPACE)
             .setShape(
@@ -1335,12 +1348,15 @@ class WorkbenchGenerator {
         final String format = "%s_undyeing";
 
         Registries.RECIPES.WORKBENCH.register(String.format(format, "planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:planks"), new ItemStack(Blocks.PLANKS_OAK)));
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "signs"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:signs"), new ItemStack(Items.SIGN)));
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "doors"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:doors"), new ItemStack(Items.DOOR_OAK)));
         Registries.RECIPES.WORKBENCH.register(String.format(format, "stairs_planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:stairs_planks"), new ItemStack(Blocks.STAIRS_PLANKS_OAK)));
         Registries.RECIPES.WORKBENCH.register(String.format(format, "slabs_planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:slabs_planks"), new ItemStack(Blocks.SLAB_PLANKS_OAK)));
         Registries.RECIPES.WORKBENCH.register(String.format(format, "fences_planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:fences_planks"), new ItemStack(Blocks.FENCE_PLANKS_OAK)));
         Registries.RECIPES.WORKBENCH.register(String.format(format, "fence_gates_planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:fence_gates_planks"), new ItemStack(Blocks.FENCE_GATE_PLANKS_OAK)));
         Registries.RECIPES.WORKBENCH.register(String.format(format, "trapdoor_planks"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:trapdoor_planks"), new ItemStack(Blocks.TRAPDOOR_PLANKS_OAK)));
         Registries.RECIPES.WORKBENCH.register(String.format(format, "lamps"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:lamps"), new ItemStack(Blocks.LAMP_IDLE)));
+        Registries.RECIPES.WORKBENCH.register(String.format(format, "lamps_inverted"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:lamps_inverted"), new ItemStack(Blocks.LAMP_INVERTED_IDLE)));
         Registries.RECIPES.WORKBENCH.register(String.format(format, "wools"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:wools"), new ItemStack(Blocks.WOOL)));
         Registries.RECIPES.WORKBENCH.register(String.format(format, "chests"), new RecipeEntryUndyeing(new RecipeSymbol("minecraft:chests"), new ItemStack(Blocks.CHEST_PLANKS_OAK)));
     }
diff --git a/util/seed-viewer/build.gradle.kts b/util/seed-viewer/build.gradle.kts
index 460853a3b..b71d5edae 100644
--- a/util/seed-viewer/build.gradle.kts
+++ b/util/seed-viewer/build.gradle.kts
@@ -14,12 +14,22 @@ val include: Configuration by configurations.creating
 repositories {
     mavenCentral()
     maven("https://libraries.minecraft.net/")
+    ivy {
+        url = uri("https://github.com/Better-than-Adventure")
+        patternLayout {
+            artifact("[organisation]/releases/download/[revision]/brigadier-[revision].jar")
+            m2Compatible
+        }
+        metadataSources { artifact() }
+    }
 }
 
 dependencies {
     testImplementation(platform("org.junit:junit-bom:5.10.0"))
     testImplementation("org.junit.jupiter:junit-jupiter")
 
+    implementation(libs.brigadier)?.let { include(it) }
+
     implementation(project(":game:core"))?.let { include(it) }
     implementation(project(":util:logging"))?.let { include(it) }
     implementation(project(":util:nbt"))?.let { include(it) }
diff --git a/util/stellar/build.gradle.kts b/util/stellar/build.gradle.kts
index 539c067b5..27d57c62f 100644
--- a/util/stellar/build.gradle.kts
+++ b/util/stellar/build.gradle.kts
@@ -5,11 +5,21 @@ plugins {
 repositories {
     mavenCentral()
     maven("https://libraries.minecraft.net/")
+    ivy {
+        url = uri("https://github.com/Better-than-Adventure")
+        patternLayout {
+            artifact("[organisation]/releases/download/[revision]/brigadier-[revision].jar")
+            m2Compatible
+        }
+        metadataSources { artifact() }
+    }
 }
 
 dependencies {
     implementation(project(":game:core"))
 
+    implementation(libs.brigadier)
+
     implementation(libs.bundles.lwjgl)
     for (lib in libs.bundles.lwjgl.get()) {
         runtimeOnly(lib.group, lib.name, classifier = rootProject.ext["lwjglNatives"].toString())
