diff --git a/game/client/src/main/java/net/minecraft/client/gui/ControllerGlyphElement.java b/game/client/src/main/java/net/minecraft/client/gui/ControllerGlyphElement.java
index 636f9046e..b63e5c2bf 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ControllerGlyphElement.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ControllerGlyphElement.java
@@ -1,119 +1,76 @@
 package net.minecraft.client.gui;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.input.controller.Button;
 import net.minecraft.client.input.controller.ControllerInput;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.lwjgl.opengl.GL11;
 
 public class ControllerGlyphElement extends Gui {
-    private final Minecraft minecraft;
-
-    public ControllerGlyphElement(Minecraft minecraft) {
-        this.minecraft = minecraft;
-    }
-
-    public void drawButton(ControllerInput controller, Button button, int x, int y, boolean pressed) {
-        int u = getButtonU(controller, button);
-        int v = getButtonV(controller, button);
-        int sizeU = getButtonSizeU(controller, button);
-        int sizeV = getButtonSizeV(controller, button);
-        int vOffset = 0;
-        if (pressed) {
-            vOffset = sizeV;
-        }
+    public static final int GLYPH_WIDTH = 15;
+    public static final int GLYPH_HEIGHT = 15;
 
+    private static final int GLYPH_U = 0;
+    private static final int GLYPH_V = 118;
 
-        minecraft.textureManager.loadTexture("/assets/minecraft/textures/gui/controller/" + controller.getType().getAssetName() + ".png").bind();
+    public enum Glyph {
+        BUTTON_A(GLYPH_U + GLYPH_WIDTH * 0, GLYPH_V + GLYPH_HEIGHT * 0),
+        BUTTON_B(GLYPH_U + GLYPH_WIDTH * 1, GLYPH_V + GLYPH_HEIGHT * 0),
+        BUTTON_X(GLYPH_U + GLYPH_WIDTH * 2, GLYPH_V + GLYPH_HEIGHT * 0),
+        BUTTON_Y(GLYPH_U + GLYPH_WIDTH * 3, GLYPH_V + GLYPH_HEIGHT * 0),
+        D_PAD_UP(GLYPH_U + GLYPH_WIDTH * 4, GLYPH_V + GLYPH_HEIGHT * 0),
+        D_PAD_RIGHT(GLYPH_U + GLYPH_WIDTH * 5, GLYPH_V + GLYPH_HEIGHT * 0),
+        D_PAD_DOWN(GLYPH_U + GLYPH_WIDTH * 6, GLYPH_V + GLYPH_HEIGHT * 0),
+        D_PAD_LEFT(GLYPH_U + GLYPH_WIDTH * 7, GLYPH_V + GLYPH_HEIGHT * 0),
+        SHOULDER_LEFT(GLYPH_U + GLYPH_WIDTH * 0, GLYPH_V + GLYPH_HEIGHT * 1),
+        SHOULDER_RIGHT(GLYPH_U + GLYPH_WIDTH * 1, GLYPH_V + GLYPH_HEIGHT * 1),
+        TRIGGER_LEFT(GLYPH_U + GLYPH_WIDTH * 2, GLYPH_V + GLYPH_HEIGHT * 1),
+        TRIGGER_RIGHT(GLYPH_U + GLYPH_WIDTH * 3, GLYPH_V + GLYPH_HEIGHT * 1),
+        STICK_LEFT_PRESS(GLYPH_U + GLYPH_WIDTH * 4, GLYPH_V + GLYPH_HEIGHT * 1),
+        STICK_RIGHT_PRESS(GLYPH_U + GLYPH_WIDTH * 5, GLYPH_V + GLYPH_HEIGHT * 1),
+        BUTTON_START(GLYPH_U + GLYPH_WIDTH * 6, GLYPH_V + GLYPH_HEIGHT * 1),
+        BUTTON_BACK(GLYPH_U + GLYPH_WIDTH * 7, GLYPH_V + GLYPH_HEIGHT * 1),
+        STICK_LEFT_UP(GLYPH_U + GLYPH_WIDTH * 0, GLYPH_V + GLYPH_HEIGHT * 2),
+        STICK_LEFT_RIGHT(GLYPH_U + GLYPH_WIDTH * 1, GLYPH_V + GLYPH_HEIGHT * 2),
+        STICK_LEFT_DOWN(GLYPH_U + GLYPH_WIDTH * 2, GLYPH_V + GLYPH_HEIGHT * 2),
+        STICK_LEFT_LEFT(GLYPH_U + GLYPH_WIDTH * 3, GLYPH_V + GLYPH_HEIGHT * 2),
+        STICK_RIGHT_UP(GLYPH_U + GLYPH_WIDTH * 4, GLYPH_V + GLYPH_HEIGHT * 2),
+        STICK_RIGHT_RIGHT(GLYPH_U + GLYPH_WIDTH * 5, GLYPH_V + GLYPH_HEIGHT * 2),
+        STICK_RIGHT_DOWN(GLYPH_U + GLYPH_WIDTH * 6, GLYPH_V + GLYPH_HEIGHT * 2),
+        STICK_RIGHT_LEFT(GLYPH_U + GLYPH_WIDTH * 7, GLYPH_V + GLYPH_HEIGHT * 2);
 
-        drawTexturedModalRect(x, y, u, v + vOffset, sizeU, sizeV);
-    }
+        private final int u;
+        private final int v;
 
-    public void drawDPad(ControllerInput controllerInput, int x, int y, boolean up, boolean right, boolean down, boolean left) {
-        int u = 0;
-        int v = 72;
-        int sizeU = 46;
-        int sizeV = 46;
-
-        minecraft.textureManager.loadTexture("/assets/minecraft/textures/gui/controller/" + controllerInput.getType().getAssetName() + ".png").bind();
-
-        drawTexturedModalRect(x, y, u, v, sizeU, sizeV);
-
-        if (up) {
-            drawTexturedModalRect(x, y, 46, 72, 46, 15);
-        }
-        if (right) {
-            drawTexturedModalRect(x + 31, y, 77, 72, 15, 46);
-        }
-        if (down) {
-            drawTexturedModalRect(x, y + 31, 46, 103, 46, 15);
+        Glyph(final int u, final int v) {
+            this.u = u;
+            this.v = v;
         }
-        if (left) {
-            drawTexturedModalRect(x, y, 46, 72, 15, 46);
-        }
-    }
 
-    private int getButtonU(ControllerInput controller, Button button) {
-        if (button == controller.buttonA || button == controller.digitalPad.up) {
-            return 0;
-        } else if (button == controller.buttonB || button == controller.digitalPad.right) {
-            return 18;
-        } else if (button == controller.buttonX || button == controller.digitalPad.down) {
-            return 36;
-        } else if (button == controller.buttonY || button == controller.digitalPad.left) {
-            return 54;
-        } else if (button == controller.buttonLeftShoulder) {
-            return 97;
-        } else if (button == controller.buttonRightShoulder) {
-            return 72;
-        } else if (button == controller.buttonLeftTrigger) {
-            return 139;
-        } else if (button == controller.buttonRightTrigger) {
-            return 122;
-        } else if (button == controller.buttonStart) {
-            return 72;
-        } else if (button == controller.buttonBack) {
-            return 87;
-        } else {
-            return 0;
+        public int getU() {
+            return this.u;
         }
-    }
 
-    private int getButtonV(ControllerInput controller, Button button) {
-        if (button == controller.buttonA || button == controller.buttonB || button == controller.buttonX || button == controller.buttonY || button == controller.buttonLeftShoulder || button == controller.buttonRightShoulder || button == controller.buttonLeftTrigger || button == controller.buttonRightTrigger) {
-            return 0;
-        } else if (button == controller.digitalPad.up || button == controller.digitalPad.right || button == controller.digitalPad.down || button == controller.digitalPad.left) {
-            return 36;
-        } else if (button == controller.buttonStart || button == controller.buttonBack) {
-            return 26;
-        } else {
-            return 0;
+        public int getV() {
+            return this.v;
         }
     }
 
-    public int getButtonSizeU(ControllerInput controller, Button button) {
-        if (button == controller.buttonA || button == controller.buttonB || button == controller.buttonX || button == controller.buttonY || button == controller.digitalPad.up || button == controller.digitalPad.right || button == controller.digitalPad.down || button == controller.digitalPad.left) {
-            return 18;
-        } else if (button == controller.buttonLeftShoulder || button == controller.buttonRightShoulder) {
-            return 25;
-        } else if (button == controller.buttonLeftTrigger || button == controller.buttonRightTrigger) {
-            return 17;
-        } else if (button == controller.buttonStart || button == controller.buttonBack) {
-            return 15;
-        } else {
-            return 0;
-        }
+    private final @NotNull Minecraft minecraft;
+
+    public ControllerGlyphElement(final @NotNull Minecraft minecraft) {
+        this.minecraft = minecraft;
     }
 
-    public int getButtonSizeV(ControllerInput controller, Button button) {
-        if (button == controller.buttonA || button == controller.buttonB || button == controller.buttonX || button == controller.buttonY || button == controller.digitalPad.up || button == controller.digitalPad.right || button == controller.digitalPad.down || button == controller.digitalPad.left) {
-            return 18;
-        } else if (button == controller.buttonLeftShoulder || button == controller.buttonRightShoulder) {
-            return 13;
-        } else if (button == controller.buttonLeftTrigger || button == controller.buttonRightTrigger) {
-            return 15;
-        } else if (button == controller.buttonStart || button == controller.buttonBack) {
-            return 15;
+    public void drawGlyph(final @Nullable ControllerInput controller, final @NotNull Glyph glyph, final int x, final int y) {
+        if (controller == null) {
+            this.minecraft.textureManager.loadTexture("/assets/minecraft/textures/gui/controller/xbox_one.png").bind();
         } else {
-            return 0;
+            this.minecraft.textureManager.loadTexture("/assets/minecraft/textures/gui/controller/" + controller.getType().getAssetName() + ".png").bind();
         }
+
+        GL11.glEnable(GL11.GL_TEXTURE_2D);
+
+        drawTexturedModalRect(x, y, glyph.getU(), glyph.getV(), GLYPH_WIDTH, GLYPH_HEIGHT);
     }
 }
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 04e5939b2..c5045b9f9 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
@@ -47,10 +47,10 @@ public abstract class Screen extends Gui {
         return button;
     }
 
-    public void render(int xm, int ym, float partialTick) {
+    public void render(int mx, int my, float partialTick) {
         for (int i = 0; i < buttons.size(); i++) {
             ButtonElement button = buttons.get(i);
-            button.drawButton(mc, xm, ym);
+            button.drawButton(mc, mx, my);
         }
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenAddServer.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenAddServer.java
index 359bd1fdc..6be2b2ce9 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenAddServer.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenAddServer.java
@@ -131,7 +131,7 @@ public class ScreenAddServer extends Screen
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         I18n stringtranslate = I18n.getInstance();
         renderBackground();
@@ -140,6 +140,6 @@ public class ScreenAddServer extends Screen
         drawString(font, stringtranslate.translateKey("gui.add_server.label.ip_address"), ipTextField.xPosition, ipTextField.yPosition - 14, 0xa0a0a0);
         ipTextField.drawTextBox();
         serverNameTextField.drawTextBox();
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenBadJavaArch.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenBadJavaArch.java
index bc7442303..3449f27d0 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenBadJavaArch.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenBadJavaArch.java
@@ -54,7 +54,7 @@ public class ScreenBadJavaArch extends Screen
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         I18n i = I18n.getInstance();
         renderBackground();
@@ -63,7 +63,7 @@ public class ScreenBadJavaArch extends Screen
         drawString(font, i.translateKey("gui.bad_java_arch.label.body.2"), width / 2 - 170, (height / 4 - 60) + 60 + 18, 0xa0a0a0);
         drawString(font, i.translateKey("gui.bad_java_arch.label.body.3"), width / 2 - 170, (height / 4 - 60) + 60 + 27, 0xa0a0a0);
         drawString(font, i.translateKey("gui.bad_java_arch.label.body.4"), width / 2 - 170, (height / 4 - 60) + 60 + 45, 0xa0a0a0);
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenConflictWarning.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenConflictWarning.java
index ca305d79e..ddf85e1a4 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenConflictWarning.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenConflictWarning.java
@@ -30,7 +30,7 @@ public class ScreenConflictWarning extends Screen
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         I18n i = I18n.getInstance();
         renderBackground();
@@ -39,6 +39,6 @@ public class ScreenConflictWarning extends Screen
         drawString(font, i.translateKey("gui.conflict_warning.label.body.2"), width / 2 - 140, (height / 4 - 60) + 60 + 18, 0xa0a0a0);
         drawString(font, i.translateKey("gui.conflict_warning.label.body.3"), width / 2 - 140, (height / 4 - 60) + 60 + 27, 0xa0a0a0);
         drawString(font, i.translateKey("gui.conflict_warning.label.body.4"), width / 2 - 140, (height / 4 - 60) + 60 + 45, 0xa0a0a0);
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenConnectFailed.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenConnectFailed.java
index eccee5293..e5a2070b3 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenConnectFailed.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenConnectFailed.java
@@ -53,12 +53,12 @@ public class ScreenConnectFailed extends Screen
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         renderBackground();
         drawStringCentered(font, errorMessage, width / 2, height / 2 - 50, 0xffffff);
         drawStringCentered(font, errorDetail, width / 2, height / 2 - 10, 0xffffff);
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     private String errorMessage;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenConnectToIp.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenConnectToIp.java
index 935d1ddd2..57bfb92f1 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenConnectToIp.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenConnectToIp.java
@@ -80,14 +80,14 @@ public class ScreenConnectToIp extends Screen
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         I18n i18n = I18n.getInstance();
         renderBackground();
         drawStringCentered(font, i18n.translateKey("gui.connect_to_ip.label.title"), width / 2, (height / 4 - 60) + 20, 0xffffff);
         drawString(font, i18n.translateKey("gui.connect_to_ip.label.enter_ip"), width / 2 - 140, (height / 4 - 60) + 60 + 36, 0xa0a0a0);
         textField.drawTextBox();
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     private TextFieldElement textField;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenConnecting.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenConnecting.java
index db864d7c9..f2b6cf798 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenConnecting.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenConnecting.java
@@ -101,7 +101,7 @@ public class ScreenConnecting extends Screen
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         renderBackground();
         I18n stringtranslate = I18n.getInstance();
@@ -114,7 +114,7 @@ public class ScreenConnecting extends Screen
             drawStringCentered(font, stringtranslate.translateKey("gui.connecting.label.logging_in"), width / 2, height / 2 - 50, 0xffffff);
             drawStringCentered(font, clientHandler.message, width / 2, height / 2 - 10, 0xffffff);
         }
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     private PacketHandlerClient clientHandler;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenControllerSetup.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenControllerSetup.java
index 649630868..0f9288eff 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenControllerSetup.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenControllerSetup.java
@@ -2,6 +2,7 @@ package net.minecraft.client.gui;
 
 import net.minecraft.client.input.InputHandler;
 import net.minecraft.client.input.InputType;
+import net.minecraft.client.input.controller.Button;
 import net.minecraft.client.input.controller.ControllerInput;
 import net.minecraft.client.input.controller.ControllerType;
 import net.minecraft.client.input.controller.Joystick;
@@ -15,7 +16,6 @@ import static org.lwjgl.opengl.GL11.*;
 public class ScreenControllerSetup extends Screen {
     private ControllerInput lastController = null;
     private ButtonElement controllerButton;
-    private ControllerGlyphElement glyphRenderer;
 
     public ScreenControllerSetup(Screen parentScreen) {
         super(parentScreen);
@@ -33,8 +33,6 @@ public class ScreenControllerSetup extends Screen {
 
         buttons.add(new ButtonElement(-1, width / 2 - 100, height - 40, I18n.getInstance().translateKey("gui.controller_setup.button.back")).setListener((e) -> mc.displayScreen(parentScreen)));
 
-        this.glyphRenderer = new ControllerGlyphElement(mc);
-
         updateDisplay();
     }
 
@@ -48,88 +46,86 @@ public class ScreenControllerSetup extends Screen {
     }
 
     @Override
-    public void render(int xm, int ym, float partialTick) {
+    public void render(int mx, int my, float partialTick) {
         renderBackground();
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
 
         ControllerInput controller = mc.controllerInput;
 
         if (controller != null) {
             boolean swapJoystickAndDPad = controller.getType().getLayout() == ControllerType.Layout.XBOX || controller.getType().getLayout() == ControllerType.Layout.NINTENDO;
-            int y = height / 2 - 64;
 
-            int x1 = width / 2;
+            final int x = width / 2 - 232 / 2;
+            final int y = height / 2 - 164 / 2;
+
+            final int[][] slots = {
+                { 23, 36 },
+                { 64, 67 },
+                { 122, 67 },
+                { 163, 36 }
+            };
+            final int[][] shoulderSlots = {
+                { 28, 15 },
+                { 179, 15 }
+            };
+            final int[][] triggerSlots = {
+                { 36, 0 },
+                { 179, 0 }
+            };
+            final int[][] metaSlots = {
+                { 92, 40 },
+                { 125, 40 }
+            };
+
+            final int dPadSlot = swapJoystickAndDPad ? 1 : 0;
+            final int joyLeftSlot = swapJoystickAndDPad ? 0 : 1;
+            final int joyRightSlot = 2;
+            final int faceButtonsSlot = 3;
 
             glDisable(GL_DEPTH_TEST);
-            glDisable(GL_CULL_FACE);
-            glDisable(GL_TEXTURE_2D);
-            if (swapJoystickAndDPad) {
-                drawJoystick(controller.joyLeft, x1 - 100 + 8, y + 32 + 4 + 8);
-            } else {
-                drawJoystick(controller.joyLeft, x1 - 48, y + 96);
-            }
-            drawJoystick(controller.joyRight, x1 - 48 + 64, y + 96);
 
-            GL11.glEnable(GL_TEXTURE_2D);
             font.drawCenteredString("(" + controller.getType().getPrintableName() + ")", width / 2, 40, 0xFFFFFF);
 
-            int w = glyphRenderer.getButtonSizeU(controller, controller.buttonLeftTrigger);
-            glyphRenderer.drawButton(controller, controller.buttonLeftTrigger, x1 - 65 - w, y, controller.buttonLeftTrigger.isPressed());
-            glyphRenderer.drawButton(controller, controller.buttonRightTrigger, x1 + 65, y, controller.buttonRightTrigger.isPressed());
-            w = glyphRenderer.getButtonSizeU(controller, controller.buttonBack);
-            glyphRenderer.drawButton(controller, controller.buttonBack, x1 - 20 - w, y + 32, controller.buttonBack.isPressed());
-            glyphRenderer.drawButton(controller, controller.buttonStart, x1 + 20, y + 32, controller.buttonStart.isPressed());
-            w = glyphRenderer.getButtonSizeU(controller, controller.buttonLeftShoulder);
-            glyphRenderer.drawButton(controller, controller.buttonLeftShoulder, x1 - 65 - w, y + 15, controller.buttonLeftShoulder.isPressed());
-            glyphRenderer.drawButton(controller, controller.buttonRightShoulder, x1 + 65, y + 15, controller.buttonRightShoulder.isPressed());
+            mc.textureManager.loadTexture("/assets/minecraft/textures/gui/controller/layout.png").bind();
+
+            drawTexturedModalRect(x, y, 0, 0, 232, 164);
+
+            // Draw joysticks
+            drawJoystick(controller, x + slots[joyLeftSlot][0], y + slots[joyLeftSlot][1], controller.joyLeft.getX(), controller.joyLeft.getY(), controller.joyLeft.getButton().isPressed());
+            drawJoystick(controller, x + slots[joyRightSlot][0], y + slots[joyRightSlot][1], controller.joyRight.getX(), controller.joyRight.getY(), controller.joyRight.getButton().isPressed());
+
+            // Draw Back and Start buttons
+            drawButton(controller, controller.buttonBack, x + metaSlots[0][0], y + metaSlots[0][1], controller.buttonBack.isPressed());
+            drawButton(controller, controller.buttonStart, x + metaSlots[1][0], y + metaSlots[1][1], controller.buttonStart.isPressed());
+
+            // Draw triggers
+            drawButton(controller, controller.buttonLeftTrigger, x + triggerSlots[0][0], y + triggerSlots[0][1], controller.buttonLeftTrigger.isPressed());
+            drawButton(controller, controller.buttonRightTrigger, x + triggerSlots[1][0], y + triggerSlots[1][1], controller.buttonRightTrigger.isPressed());
+
+            // Draw shoulder buttons
+            drawButton(controller, controller.buttonLeftShoulder, x + shoulderSlots[0][0], y + shoulderSlots[0][1], controller.buttonLeftShoulder.isPressed());
+            drawButton(controller, controller.buttonRightShoulder, x + shoulderSlots[1][0], y + shoulderSlots[1][1], controller.buttonRightShoulder.isPressed());
 
             //Buttons
-            drawButtons(controller, width / 2 + 50, y + 32);
+            drawButtons(controller, x + slots[faceButtonsSlot][0], y + slots[faceButtonsSlot][1]);
 
             //Digital Pad
-            if (swapJoystickAndDPad) {
-                glyphRenderer.drawDPad(controller, x1 - 48 - 8, y + 96 - 8, controller.digitalPad.up.isPressed(), controller.digitalPad.right.isPressed(), controller.digitalPad.down.isPressed(), controller.digitalPad.left.isPressed());
-            } else {
-                glyphRenderer.drawDPad(controller, x1 - 100, y + 32 + 4, controller.digitalPad.up.isPressed(), controller.digitalPad.right.isPressed(), controller.digitalPad.down.isPressed(), controller.digitalPad.left.isPressed());
-            }
+            drawDPad(controller, x + slots[dPadSlot][0], y + slots[dPadSlot][1], controller.digitalPad.up.isPressed(), controller.digitalPad.right.isPressed(), controller.digitalPad.down.isPressed(), controller.digitalPad.left.isPressed());
 
         }
     }
 
     private void drawButtons(ControllerInput controller, int x, int y) {
-        int w = 20;
+        int w = 14;
 
-        glyphRenderer.drawButton(controller, controller.buttonA, x + w * 1, y + w * 2, controller.buttonA.isPressed());
-        glyphRenderer.drawButton(controller, controller.buttonB, x + w * 2, y + w * 1, controller.buttonB.isPressed());
-        glyphRenderer.drawButton(controller, controller.buttonX, x + w * 0, y + w * 1, controller.buttonX.isPressed());
-        glyphRenderer.drawButton(controller, controller.buttonY, x + w * 1, y + w * 0, controller.buttonY.isPressed());
+        drawButton(controller, controller.buttonA, x + w * 1, y + w * 2, controller.buttonA.isPressed());
+        drawButton(controller, controller.buttonB, x + w * 2, y + w * 1, controller.buttonB.isPressed());
+        drawButton(controller, controller.buttonX, x + w * 0, y + w * 1, controller.buttonX.isPressed());
+        drawButton(controller, controller.buttonY, x + w * 1, y + w * 0, controller.buttonY.isPressed());
     }
 
     @Override
-    public void keyPressed(char eventCharacter, int eventKey, int mx, int my) {
-
-    }
-
-    private void drawJoystick(Joystick joystick, int x, int y) {
-        glDisable(GL_TEXTURE_2D);
-
-        glBegin(GL_QUADS);
-        glColor3d(0.5, 0.5, 0.5);
-        rectangle(x, y, 32, 32);
-        glColor3d(0.0, 1.0, 0.0);
-        if (joystick.getButton().isPressed()) glColor3d(1.0, 0.0, 0.0);
-        rectangle(x + (joystick.getX() * 0.5 + 0.5) * 32 - 1, y + (joystick.getY() * 0.5 + 0.5) * 32 - 1, 2, 2);
-        glEnd();
-
-        glEnable(GL_TEXTURE_2D);
-    }
-
-    private void rectangle(double x, double y, double w, double h) {
-        glVertex2d(x, y);
-        glVertex2d(x + w, y);
-        glVertex2d(x + w, y + h);
-        glVertex2d(x, y + h);
-    }
+    public void keyPressed(char eventCharacter, int eventKey, int mx, int my) { }
 
     @Override
     protected void buttonClicked(ButtonElement button) {
@@ -188,4 +184,124 @@ public class ScreenControllerSetup extends Screen {
         mc.gameSettings.saveOptions();
     }
 
+    private void drawButton(ControllerInput controller, Button button, int x, int y, boolean pressed) {
+        int u = getButtonU(controller, button);
+        int v = getButtonV(controller, button);
+        int sizeU = getButtonSizeU(controller, button);
+        int sizeV = getButtonSizeV(controller, button);
+        int vOffset = 0;
+        if (pressed) {
+            vOffset = sizeV;
+        }
+
+        mc.textureManager.loadTexture("/assets/minecraft/textures/gui/controller/" + controller.getType().getAssetName() + ".png").bind();
+
+        drawTexturedModalRect(x, y, u, v + vOffset, sizeU, sizeV);
+    }
+
+    private void drawDPad(ControllerInput controllerInput, int x, int y, boolean up, boolean right, boolean down, boolean left) {
+        int u = 0;
+        int v = 72;
+        int sizeU = 46;
+        int sizeV = 46;
+
+        mc.textureManager.loadTexture("/assets/minecraft/textures/gui/controller/" + controllerInput.getType().getAssetName() + ".png").bind();
+
+        drawTexturedModalRect(x, y, u, v, sizeU, sizeV);
+
+        if (up) {
+            drawTexturedModalRect(x, y, 46, 72, 46, 15);
+        }
+        if (right) {
+            drawTexturedModalRect(x + 31, y, 77, 72, 15, 46);
+        }
+        if (down) {
+            drawTexturedModalRect(x, y + 31, 46, 103, 46, 15);
+        }
+        if (left) {
+            drawTexturedModalRect(x, y, 46, 72, 15, 46);
+        }
+    }
+
+    private void drawJoystick(ControllerInput controllerInput, int x, int y, float axisX, float axisY, boolean clicked) {
+        int u = 92;
+        int v = 72;
+        int sizeU = 46;
+        int sizeV = 46;
+
+        mc.textureManager.loadTexture("/assets/minecraft/textures/gui/controller/" + controllerInput.getType().getAssetName() + ".png").bind();
+
+        drawTexturedModalRect(x, y, u, v, sizeU, sizeV);
+
+        int thumbU = clicked ? 184 : 138;
+        int thumbV = 72;
+
+        drawTexturedModalRect((int) (x + (axisX * sizeU / 3)), (int) (y + (axisY * sizeV / 3)), thumbU, thumbV, sizeU, sizeV);
+    }
+
+    private int getButtonU(ControllerInput controller, Button button) {
+        if (button == controller.buttonA || button == controller.digitalPad.up) {
+            return 0;
+        } else if (button == controller.buttonB || button == controller.digitalPad.right) {
+            return 18;
+        } else if (button == controller.buttonX || button == controller.digitalPad.down) {
+            return 36;
+        } else if (button == controller.buttonY || button == controller.digitalPad.left) {
+            return 54;
+        } else if (button == controller.buttonLeftShoulder) {
+            return 97;
+        } else if (button == controller.buttonRightShoulder) {
+            return 72;
+        } else if (button == controller.buttonLeftTrigger) {
+            return 139;
+        } else if (button == controller.buttonRightTrigger) {
+            return 122;
+        } else if (button == controller.buttonStart) {
+            return 72;
+        } else if (button == controller.buttonBack) {
+            return 87;
+        } else {
+            return 0;
+        }
+    }
+
+    private int getButtonV(ControllerInput controller, Button button) {
+        if (button == controller.buttonA || button == controller.buttonB || button == controller.buttonX || button == controller.buttonY || button == controller.buttonLeftShoulder || button == controller.buttonRightShoulder || button == controller.buttonLeftTrigger || button == controller.buttonRightTrigger) {
+            return 0;
+        } else if (button == controller.digitalPad.up || button == controller.digitalPad.right || button == controller.digitalPad.down || button == controller.digitalPad.left) {
+            return 36;
+        } else if (button == controller.buttonStart || button == controller.buttonBack) {
+            return 26;
+        } else {
+            return 0;
+        }
+    }
+
+    private int getButtonSizeU(ControllerInput controller, Button button) {
+        if (button == controller.buttonA || button == controller.buttonB || button == controller.buttonX || button == controller.buttonY || button == controller.digitalPad.up || button == controller.digitalPad.right || button == controller.digitalPad.down || button == controller.digitalPad.left) {
+            return 18;
+        } else if (button == controller.buttonLeftShoulder || button == controller.buttonRightShoulder) {
+            return 25;
+        } else if (button == controller.buttonLeftTrigger || button == controller.buttonRightTrigger) {
+            return 17;
+        } else if (button == controller.buttonStart || button == controller.buttonBack) {
+            return 15;
+        } else {
+            return 0;
+        }
+    }
+
+    private int getButtonSizeV(ControllerInput controller, Button button) {
+        if (button == controller.buttonA || button == controller.buttonB || button == controller.buttonX || button == controller.buttonY || button == controller.digitalPad.up || button == controller.digitalPad.right || button == controller.digitalPad.down || button == controller.digitalPad.left) {
+            return 18;
+        } else if (button == controller.buttonLeftShoulder || button == controller.buttonRightShoulder) {
+            return 13;
+        } else if (button == controller.buttonLeftTrigger || button == controller.buttonRightTrigger) {
+            return 15;
+        } else if (button == controller.buttonStart || button == controller.buttonBack) {
+            return 15;
+        } else {
+            return 0;
+        }
+    }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenCreateWorld.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenCreateWorld.java
index 0de6dc236..bfcafe858 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenCreateWorld.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenCreateWorld.java
@@ -209,7 +209,7 @@ public class ScreenCreateWorld extends Screen {
     }
 
     @Override
-    public void render(int xm, int ym, float partialTick) {
+    public void render(int mx, int my, float partialTick) {
         I18n stringtranslate = I18n.getInstance();
         renderBackground();
         drawStringCentered(font, stringtranslate.translateKey("gui.create_world.label.title"), width / 2, 20, 0xffffff);
@@ -217,7 +217,7 @@ public class ScreenCreateWorld extends Screen {
         drawString(font, stringtranslate.translateKey("gui.create_world.label.seed"), width / 2 - 100, 88, 0xa0a0a0);
         textboxWorldName.drawTextBox();
         textboxSeed.drawTextBox();
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenCredits.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenCredits.java
index 473ec6d56..953bd40f0 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenCredits.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenCredits.java
@@ -104,7 +104,7 @@ public class ScreenCredits extends Screen {
     }
 
     @Override
-    public void render(int xm, int ym, float partialTick) {
+    public void render(int mx, int my, float partialTick) {
         // Handle scrolling
         if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
             scroll(Mouse.getDWheel() * -0.01f);
@@ -116,9 +116,9 @@ public class ScreenCredits extends Screen {
         overlayBackground(0, width, 0, top);
         overlayBackground(0, width, bottom, height);
 
-        drawScrollBar(xm, ym);
+        drawScrollBar(mx, my);
 
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
 
         font.drawCenteredString(I18n.getInstance().translateKey("gui.credits.label.title"), width / 2, 5, 0xFFFFFF);
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenDownloadTerrain.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenDownloadTerrain.java
index f83249655..c6ff2bb3f 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenDownloadTerrain.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenDownloadTerrain.java
@@ -45,12 +45,12 @@ public class ScreenDownloadTerrain extends Screen
 
     @Override
 
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         renderTexturedBackground();
         I18n i18n = I18n.getInstance();
         drawStringCentered(font, i18n.translateKey("gui.downloading_terrain.label.title"), width / 2, height / 2 - 50, 0xffffff);
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     private PacketHandlerClient netHandler;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenGameOver.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenGameOver.java
index 04f3aed52..2207e2514 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenGameOver.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenGameOver.java
@@ -62,7 +62,7 @@ public class ScreenGameOver extends Screen
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         I18n i18n = I18n.getInstance();
         drawGradientRect(0, 0, width, height, 0x60500000, 0xa0803030);
@@ -71,7 +71,7 @@ public class ScreenGameOver extends Screen
         drawStringCentered(font, i18n.translateKey("gui.game_over.label.title"), width / 2 / 2, 30, 0xffffff);
         GL11.glPopMatrix();
         drawStringCentered(font, i18n.translateKeyAndFormat("gui.game_over.label.score", TextFormatting.YELLOW.toString() + mc.thePlayer.getScore()), width / 2, 100, 0xffffff);
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenHudDesigner.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenHudDesigner.java
index 6e76c4964..0c358845b 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenHudDesigner.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenHudDesigner.java
@@ -234,16 +234,16 @@ public class ScreenHudDesigner
     }
 
     @Override
-    public void render(int xm, int ym, float partialTick) {
-        updateComponentsUnderMouse(xm, ym);
+    public void render(int mx, int my, float partialTick) {
+        updateComponentsUnderMouse(mx, my);
 
         if (heldComponent != null) {
-            updateHeldComponent(xm, ym);
+            updateHeldComponent(mx, my);
         }
 
         renderTexturedBackground();
 
-        drawHudComponents(xm, ym);
+        drawHudComponents(mx, my);
 
         Tessellator tessellator = Tessellator.instance;
         GL11.glDisable(GL_DEPTH_TEST);
@@ -265,7 +265,7 @@ public class ScreenHudDesigner
             }
         }
 
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java
index a308de9fc..5f85f19fa 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java
@@ -59,7 +59,7 @@ public class ScreenLabelEditor extends Screen
     }
 
     @Override
-    public void render(final int xm, final int ym, final float f)
+    public void render(final int mx, final int my, final float f)
     {
         renderBackground();
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
@@ -72,7 +72,7 @@ public class ScreenLabelEditor extends Screen
 
         drawStringCentered(font, TextFormatting.get(color) + "> " + text + " <", width / 2, 100, 0xffffff);
 
-        super.render(xm, ym, f);
+        super.render(mx, my, f);
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java
index e9d02a99d..11af275aa 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenMainMenu.java
@@ -315,7 +315,7 @@ public class ScreenMainMenu extends Screen
     }
 
     @Override
-    public void render(int xm, int ym, float partialTick)
+    public void render(int mx, int my, float partialTick)
     {
         I18n i18n = I18n.getInstance();
         renderBackground();
@@ -350,7 +350,7 @@ public class ScreenMainMenu extends Screen
         drawString(font, disclaimer1, width - font.getStringWidth(disclaimer1) - 2, height - 20, 0xffffff);
         String disclaimer2 = i18n.translateKey("gui.main_menu.label.disclaimer.2");
         drawString(font, disclaimer2, width - font.getStringWidth(disclaimer2) - 2, height - 10, 0xffffff);
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
         
     	if(mc.downloadResourcesThread.downloading) {
     		double b = java.lang.Math.sin((System.currentTimeMillis() / 1000.0) * 4);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenMissingMinecraft.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenMissingMinecraft.java
index 0326d3837..de969de3e 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenMissingMinecraft.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenMissingMinecraft.java
@@ -25,7 +25,7 @@ public class ScreenMissingMinecraft extends Screen {
         buttons.add(new ClickableLabelElement(2, 0,  height - font.fontHeight - 4, i.translateKey("gui.main_menu.button.discord"), 0x5865F2));
     }
     @Override
-    public void render(int xm, int ym, float partialTick)
+    public void render(int mx, int my, float partialTick)
     {
         I18n i = I18n.getInstance();
         drawBackground(partialTick);
@@ -35,7 +35,7 @@ public class ScreenMissingMinecraft extends Screen {
         drawString(font, i.translateKey("gui.no_minecraft.label.body.3"), width / 2 - 170, (height / 4 - 60) + 60 + 27, 0xdedede);
         drawString(font, i.translateKey("gui.no_minecraft.label.body.4"), width / 2 - 170, (height / 4 - 60) + 60 + 45, 0xdedede);
         drawString(font, i.translateKey("gui.no_minecraft.label.body.5"), width / 2 - 170, (height / 4 - 60) + 60 + 54, 0xdedede);
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
     @Override
     protected void buttonClicked(ButtonElement button)
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenOutOfMemory.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenOutOfMemory.java
index a6792eb7b..1c3e59e98 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenOutOfMemory.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenOutOfMemory.java
@@ -9,7 +9,7 @@ public class ScreenOutOfMemory extends Screen
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         I18n i18n = I18n.getInstance();
         renderBackground();
@@ -20,6 +20,6 @@ public class ScreenOutOfMemory extends Screen
         drawString(font, i18n.translateKey("gui.out_of_memory.label.body.4"), width / 2 - 140, (height / 4 - 60) + 60 + 36, 0xA0A0A0);
         drawString(font, i18n.translateKey("gui.out_of_memory.label.body.5"), width / 2 - 140, (height / 4 - 60) + 60 + 45, 0xA0A0A0);
         drawString(font, i18n.translateKey("gui.out_of_memory.label.body.6"), width / 2 - 140, (height / 4 - 60) + 60 + 63, 0xA0A0A0);
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenPaintingPicker.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenPaintingPicker.java
index ac2d487a4..6744edbca 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenPaintingPicker.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenPaintingPicker.java
@@ -37,9 +37,9 @@ public class ScreenPaintingPicker
     }
 
     @Override
-    public void render(int xm, int ym, float partialTick)
+    public void render(int mx, int my, float partialTick)
     {
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
 
         float dWheel = Mouse.getDWheel();
         if (dWheel < 0)
@@ -53,7 +53,7 @@ public class ScreenPaintingPicker
             updateArtEntries();
         }
 
-        drawPaintings(width, height, xm, ym);
+        drawPaintings(width, height, mx, my);
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenPause.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenPause.java
index 5a0016ec0..418ed37f2 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenPause.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenPause.java
@@ -105,7 +105,7 @@ public class ScreenPause extends Screen
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         I18n i = I18n.getInstance();
         renderBackground();
@@ -124,7 +124,7 @@ public class ScreenPause extends Screen
         drawStringCentered(font, i.translateKey("gui.ingame_menu.label.title"), width / 2, 40, 0xffffff);
         String score = TextFormatting.YELLOW.toString() + mc.thePlayer.getScore();
         drawStringCentered(font, i.translateKeyAndFormat("gui.ingame_menu.label.score", score), width / 2, 56, 0xfefefe);
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     private int updateCounter2;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenPhotoMode.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenPhotoMode.java
index db5c2933f..2dbd276e9 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenPhotoMode.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenPhotoMode.java
@@ -322,7 +322,7 @@ public class ScreenPhotoMode extends Screen
 
     protected long lastUpdateTime = 0;
     @Override
-    public void render(int xm, int ym, float partialTick)
+    public void render(int mx, int my, float partialTick)
     {
         GL11.glViewport(0, 0, mc.gameWindow.getWidthPixels(), mc.gameWindow.getHeightPixels());
         GL11.glMatrixMode(GL11.GL_PROJECTION);
@@ -403,7 +403,7 @@ public class ScreenPhotoMode extends Screen
 
         if (!shouldScreenshot)
         {
-            super.render(xm, ym, partialTick);
+            super.render(mx, my, partialTick);
         }
         else
         {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectServer.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectServer.java
index 139cb67b0..6095d0a70 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectServer.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectServer.java
@@ -211,10 +211,10 @@ public class ScreenSelectServer extends Screen {
 	}
 
 	@Override
-	public void render(int xm, int ym, float partialTick) {
-		worldSlotContainer.render(xm, ym, partialTick);
+	public void render(int mx, int my, float partialTick) {
+		worldSlotContainer.render(mx, my, partialTick);
 		drawStringCentered(font, screenTitle, width / 2, 20, 0xffffff);
-		super.render(xm, ym, partialTick);
+		super.render(mx, my, partialTick);
 	}
 	
 	class ServerSlot extends ScrolledSelectionList {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectWorld.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectWorld.java
index 0ccc52d15..02ca6352d 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectWorld.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenSelectWorld.java
@@ -253,11 +253,11 @@ public class ScreenSelectWorld extends Screen
     }
 
     @Override
-    public void render(int xm, int ym, float partialTick)
+    public void render(int mx, int my, float partialTick)
     {
-        worldSlotContainer.render(xm, ym, partialTick);
+        worldSlotContainer.render(mx, my, partialTick);
         drawStringCentered(font, stringTitle, width / 2, 20, 0xffffff);
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     class WorldSlot extends ScrolledSelectionList
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 18c377a5e..c30ab97cf 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
@@ -114,7 +114,7 @@ public class ScreenSignEditor extends Screen
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         renderBackground();
         drawStringCentered(font, screenTitle, width / 2, 40, 0xffffff);
@@ -158,7 +158,7 @@ public class ScreenSignEditor extends Screen
         
         drawStringCentered(font, I18n.getInstance().translateKey(entitySign.getPicture().getLanguageKey()), width / 2, 100 + 50 + yOffset, 0xFFFFFF);
 
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     protected String screenTitle;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java
index 410b6b9fc..64d74e5e5 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java
@@ -150,10 +150,10 @@ public class ScreenSoundTest extends Screen {
         entryIndex = index;
     }
 
-    public void render(int xm, int ym, float partialTick) {
+    public void render(int mx, int my, float partialTick) {
         renderBackground();
 
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
 
         font.drawCenteredString(I18n.getInstance().translateKey("gui.sound_test.label.title"), width/2, 5, 0xFFFFFF);
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenStats.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenStats.java
index b0451b2fa..8cf74de5f 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenStats.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenStats.java
@@ -95,11 +95,11 @@ public class ScreenStats extends Screen {
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
-        selectionList.render(xm, ym, partialTick);
+        selectionList.render(mx, my, partialTick);
         drawStringCentered(font, title, width / 2, 20, 0xffffff);
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     private void renderItemAsIcon(int x, int y, int itemID)
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenTextureViewer.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenTextureViewer.java
index 24bc5aa4f..13e350144 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenTextureViewer.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenTextureViewer.java
@@ -115,7 +115,7 @@ public class ScreenTextureViewer extends Screen {
         texIndex = texIndex % textureList.size();
     }
 
-    public void render(int xm, int ym, float partialTick) {
+    public void render(int mx, int my, float partialTick) {
         renderBackground();
 
         font.drawCenteredString(I18n.getInstance().translateKey("gui.texture_viewer.label.title"), width/2, 5, 0xFFFFFF);
@@ -181,7 +181,7 @@ public class ScreenTextureViewer extends Screen {
 
 //        drawGuiIcon((width - bw)/2, (height - bh)/2, bw, bh, TextureRegistry.getTexture("minecraft:gui/widgets/button"));
 
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
 
         GL11.glDisable(GL11.GL_DEPTH_TEST);
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java b/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
index 95fd2d77b..0ad9d515d 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
@@ -233,20 +233,20 @@ public class ScreenAchievements extends Screen
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
         if(Mouse.isButtonDown(0)) {
-            if(xm >= viewportLeft && xm < viewportRight && ym >= viewportTop && ym < viewportBottom) {
+            if(mx >= viewportLeft && mx < viewportRight && my >= viewportTop && my < viewportBottom) {
                 if(!draggingViewport) {
                     draggingViewport = true;
                 } else {
-                    targetShiftX -= (xm - mouseXOld) / viewportZoom;
-                    targetShiftY -= (ym - mouseYOld) / viewportZoom;
+                    targetShiftX -= (mx - mouseXOld) / viewportZoom;
+                    targetShiftY -= (my - mouseYOld) / viewportZoom;
                     currentShiftX = oldShiftX = targetShiftX;
                     currentShiftY = oldShiftY = targetShiftY;
                 }
-                mouseXOld = xm;
-                mouseYOld = ym;
+                mouseXOld = mx;
+                mouseYOld = my;
             }
             currentShiftX =  MathHelper.clamp(currentShiftX, shiftMinX, shiftMaxX);
             currentShiftY =  MathHelper.clamp(currentShiftY, shiftMinY, shiftMaxY);
@@ -271,22 +271,25 @@ public class ScreenAchievements extends Screen
             draggingViewport = false;
         }
 
-        if (drawSidebar() && xm >= pageListLeft && xm <= pageListRight) {
+        if (drawSidebar() && mx >= pageListLeft && mx <= pageListRight) {
             if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
                 scrollPagesList(Mouse.getDWheel() / -0.01f);
             } else {
                 scrollPagesList(Mouse.getDWheel() / -0.05f);
             }
             onScrollPagesList();
-        } else if (xm >= viewportLeft && xm <= viewportRight && ym >= viewportTop && ym <= viewportBottom){
-            viewportZoom = MathHelper.clamp(viewportZoom + (Mouse.getDWheel()/10d), 0.5d, 2);
+        } else if (mx >= viewportLeft && mx <= viewportRight && my >= viewportTop && my <= viewportBottom){
+            final double change = (Mouse.getDWheel()/10d);
+            viewportZoom = MathHelper.clamp(viewportZoom + change, 0.5d, 2);
 
             // Make zoom notch onto integer multiples
-            final double[] notches = new double[]{0.25, 0.5, 1, 2, 4};
-            for (double notch : notches){
-                if (Math.abs(viewportZoom - notch) < 0.05){
-                    viewportZoom = notch;
-                    break;
+            if (change != 0) {
+                final double[] notches = new double[]{0.25, 0.5, 1, 2, 4};
+                for (double notch : notches){
+                    if (Math.abs(viewportZoom - notch) < 0.05){
+                        viewportZoom = notch;
+                        break;
+                    }
                 }
             }
         }
@@ -298,7 +301,7 @@ public class ScreenAchievements extends Screen
             overlayBackground(0, pageListRight, top, bottom, 0x202020);
         }
 
-        renderAchievementsPanel(xm, ym, partialTick);
+        renderAchievementsPanel(mx, my, partialTick);
 
         overlayBackground(0, width, 0, top, 0x404040);
         overlayBackground(0, width, bottom, height, 0x404040);
@@ -310,7 +313,7 @@ public class ScreenAchievements extends Screen
         GL11.glShadeModel(GL11.GL_SMOOTH);
         GL11.glEnable(GL11.GL_TEXTURE_2D);
 
-        super.render(xm, ym, partialTick); // Draw Buttons
+        super.render(mx, my, partialTick); // Draw Buttons
         GL11.glEnable(GL11.GL_DEPTH_TEST);
         GL11.glEnable(GL11.GL_LIGHTING);
         Lighting.disable();
@@ -328,8 +331,8 @@ public class ScreenAchievements extends Screen
             if (pagesListHeight < bottom - top) {
                 pagesListY = top + (bottom - top - pagesListHeight) / 2;
             }
-            if (ym >= top && ym <= bottom) {
-                hoveredPage = drawPagesListItems(pageListLeft + PADDING - 4, pagesListY, pageListRight - PADDING, xm, ym);
+            if (my >= top && my <= bottom) {
+                hoveredPage = drawPagesListItems(pageListLeft + PADDING - 4, pagesListY, pageListRight - PADDING, mx, my);
             } else {
                 hoveredPage = drawPagesListItems(pageListLeft + PADDING - 4, pagesListY, pageListRight - PADDING, -1, -1);
             }
@@ -405,16 +408,16 @@ public class ScreenAchievements extends Screen
         }
 
         if (hoveredAchievement != null){
-            drawAchievementToolTip(hoveredAchievement, xm, ym);
+            drawAchievementToolTip(hoveredAchievement, mx, my);
         }
 
         if (drawSidebar()) {
-            drawPagesListScrollBar(xm, ym);
+            drawPagesListScrollBar(mx, my);
 
             if (hoveredPage != null){
                 String msg = font.wrapFormattedStringToWidth(hoveredPage.getDescription(), TOOLTIP_BOX_WIDTH_MIN);
                 msg += "\n" + TextFormatting.LIGHT_GRAY + I18n.getInstance().translateKeyAndFormat("gui.achievements.label.completion",  Math.round(hoveredPage.getCompletionFraction(statsCounter) * 100) + "%");
-                tooltip.render(msg, xm, ym, TOOLTIP_OFF_X, TOOLTIP_OFF_Y);
+                tooltip.render(msg, mx, my, TOOLTIP_OFF_X, TOOLTIP_OFF_Y);
             }
         }
 
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 e1dfdfe40..8fe6eb337 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
@@ -159,11 +159,11 @@ public class ScreenChat extends Screen implements ITextField {
 	}
 
 	@Override
-	public void render(int xm, int ym, float partialTick) {
+	public void render(int mx, int my, float partialTick) {
 		// Draw emote picker button
 		int emotePickerButtonColor = 0x80000000;
 		int emotePickerTextColor = 0xE0E0E0;
-		if (xm >= 2 && xm < 14 && ym >= height - 14 && ym < height - 2)
+		if (mx >= 2 && mx < 14 && my >= height - 14 && my < height - 2)
 		{
 			emotePickerButtonColor = 0x80ffffff;
 			emotePickerTextColor = 0xffffffa0;
@@ -188,10 +188,10 @@ public class ScreenChat extends Screen implements ITextField {
 		}
 
 		if (showEmotePicker) {
-			emotePicker.draw(2, height - 16 - emotePicker.getHeight(), xm, ym);
+			emotePicker.draw(2, height - 16 - emotePicker.getHeight(), mx, my);
 		}
 
-		super.render(xm, ym, partialTick);
+		super.render(mx, my, partialTick);
 		if (this.suggestionsElement != null) {
 			this.suggestionsElement.drawScreen();
 		}
diff --git a/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenSleepMP.java b/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenSleepMP.java
index 454f11fc3..e42b43a56 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenSleepMP.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenSleepMP.java
@@ -43,9 +43,9 @@ public class ScreenSleepMP extends ScreenChat
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java
index 74ce586b0..823ab8f48 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java
@@ -64,7 +64,7 @@ public abstract class ScreenContainerAbstract extends Screen
 	}
 
 	@Override
-	public void render(final int xm, final int ym, final float partialTick)
+	public void render(final int mx, final int my, final float partialTick)
 	{
 		renderBackground();
 		final int centerX = (width - xSize) / 2;
@@ -77,7 +77,7 @@ public abstract class ScreenContainerAbstract extends Screen
 		for (int i = 0; i < inventorySlots.slots.size(); i++)
 		{
 			final Slot slot1 = inventorySlots.slots.get(i);
-			boolean mouseOver = getIsMouseOverSlot(slot1, xm, ym);
+			boolean mouseOver = getIsMouseOverSlot(slot1, mx, my);
 			if(!itemDragHandler.isSlotDragged(slot1)) {
 				itemElement.render(slot1.getItem(), slot1.x, slot1.y, mouseOver, slot1);
 			}
@@ -90,7 +90,7 @@ public abstract class ScreenContainerAbstract extends Screen
 		final ContainerInventory inventoryplayer = mc.thePlayer.inventory;
 		ItemStack grabbedItem = inventoryplayer.getHeldItemStack();
 		if(mc.gameSettings.enableItemDragging.value) {
-			itemDragHandler.drawScreen(xm, ym, partialTick);
+			itemDragHandler.drawScreen(mx, my, partialTick);
 
 			ItemStack grabbedItemOverride = itemDragHandler.getHeldItemRenderOverride();
 			if(grabbedItemOverride != null) {
@@ -99,13 +99,13 @@ public abstract class ScreenContainerAbstract extends Screen
 		}
 		GL11.glPopMatrix();
 
-		super.render(xm, ym, partialTick);
+		super.render(mx, my, partialTick);
 
 		GL11.glPushMatrix();
 		if (grabbedItem != null)
 		{
 			GL11.glTranslatef(centerX, centerY, 100.0F);
-			itemElement.render(grabbedItem, xm - centerX - 8, ym - centerY - 8);
+			itemElement.render(grabbedItem, mx - centerX - 8, my - centerY - 8);
 		}
 		GL11.glPopMatrix();
 
@@ -116,7 +116,7 @@ public abstract class ScreenContainerAbstract extends Screen
 			String str = tooltipElement.getTooltipText(slot.getItem(), showDescription, slot);
 			if(str.length() > 0)
 			{
-				tooltipElement.render(str, xm, ym, 8, -8);
+				tooltipElement.render(str, mx, my, 8, -8);
 			}
 		}
 		GL11.glEnable(GL11.GL_DEPTH_TEST);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java
index d940e33a1..37e00bc48 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java
@@ -345,13 +345,13 @@ public class ScreenFlagEditor
     }
 
     @Override
-    public void render(int xm, int ym, float partialTick)
+    public void render(int mx, int my, float partialTick)
     {
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
         drawOverlaySurface.clear();
 
-        int xInCanvas = (xm - canvasX) / CANVAS_SCALE;
-        int yInCanvas = (ym - canvasY) / CANVAS_SCALE;
+        int xInCanvas = (mx - canvasX) / CANVAS_SCALE;
+        int yInCanvas = (my - canvasY) / CANVAS_SCALE;
         byte color = (byte) (selectedColor + 1);
         if (this.mouseButton == 1) color = 4;
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventory.java b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventory.java
index 5c9d87f51..02bdc5fac 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventory.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventory.java
@@ -144,14 +144,14 @@ public class ScreenInventory extends ScreenContainerAbstract
     }
 
     @Override
-	public void render(int xm, int ym, float partialTick)
+	public void render(int mx, int my, float partialTick)
     {
-        super.render(xm, ym, partialTick);
-        xSize_lo = xm;
-        ySize_lo = ym;
+        super.render(mx, my, partialTick);
+        xSize_lo = mx;
+        ySize_lo = my;
 
         if(mc.gameSettings.armorProtectionOverlay.value && armorButton.enabled) {
-        	drawProtectionOverlay(xm, ym);
+        	drawProtectionOverlay(mx, my);
         }
         mc.textureManager.loadTexture("/assets/minecraft/textures/gui/container/inventory.png").bind();
         
@@ -160,7 +160,7 @@ public class ScreenInventory extends ScreenContainerAbstract
         glEnable(GL_TEXTURE_2D);
         
         if(armorButton.enabled) {
-            if(armorButton.isHovered(xm, ym)) {
+            if(armorButton.isHovered(mx, my)) {
             	drawTexturedModalRect(armorButton.xPosition, armorButton.yPosition, 185, 0, armorButton.width, armorButton.height);
             }else {
             	drawTexturedModalRect(armorButton.xPosition, armorButton.yPosition, 176, 0, armorButton.width, armorButton.height);
@@ -177,9 +177,9 @@ public class ScreenInventory extends ScreenContainerAbstract
 
         for(int i=0; i < overlayButtonsLayout.elements.size(); i++) {
         	OverlayButtonElement<?> button = (OverlayButtonElement<?>) overlayButtonsLayout.elements.get(i);
-        	if(button.isHovered(xm, ym))
+        	if(button.isHovered(mx, my))
             {
-                tooltipElement.render(button.option.getDisplayStringName() + ": " + button.displayString, xm, ym, 8, -8);
+                tooltipElement.render(button.option.getDisplayStringName() + ": " + button.displayString, mx, my, 8, -8);
         	}
         }
         
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 bb352248b..80f2f2dca 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
@@ -141,7 +141,7 @@ public class ScreenGuidebook
     }
 
     @Override
-    public void render(int xm, int ym, float renderPartialTicks) {
+    public void render(int mx, int my, float renderPartialTicks) {
         lastPage = guidebookPageManager.getLeftPage();
         scroll(Mouse.getDWheel());
 
@@ -154,12 +154,12 @@ public class ScreenGuidebook
         }
 
         renderBackground();
-        drawTabs(xm, ym);
-        drawCurrentPages(xm, ym, xOffset, renderPartialTicks);
+        drawTabs(mx, my);
+        drawCurrentPages(mx, my, xOffset, renderPartialTicks);
         drawHeaders(xOffset);
-        drawCurrentPageOverlays(xm, ym,xOffset,renderPartialTicks);
-        drawPageTurnIndicator(xm, ym, xOffset);
-        drawTooltip(xm, ym);
+        drawCurrentPageOverlays(mx, my,xOffset,renderPartialTicks);
+        drawPageTurnIndicator(mx, my, xOffset);
+        drawTooltip(mx, my);
     }
 
     private void scroll(int direction) {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java
index 534729149..5190d4e47 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java
@@ -316,7 +316,7 @@ public class ScreenModelViewer extends ScreenPhotoMode implements ListenerTextFi
         return id;
     }
     @Override
-    public void render(int xm, int ym, float partialTick)
+    public void render(int mx, int my, float partialTick)
     {
         GL11.glViewport(0, 0, mc.gameWindow.getWidthPixels(), mc.gameWindow.getHeightPixels());
         GL11.glMatrixMode(GL11.GL_PROJECTION);
@@ -376,7 +376,7 @@ public class ScreenModelViewer extends ScreenPhotoMode implements ListenerTextFi
 
         List<ButtonElement> _buttons = new ArrayList<>(buttons);
         for (ButtonElement button : _buttons) {
-            button.drawButton(mc, xm, ym);
+            button.drawButton(mc, mx, my);
         }
 
         scroll(Mouse.getDWheel());
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/ScreenOptions.java b/game/client/src/main/java/net/minecraft/client/gui/options/ScreenOptions.java
index 65c9f64b6..e65fe006f 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/ScreenOptions.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/ScreenOptions.java
@@ -203,19 +203,19 @@ public class ScreenOptions
     }
 
     @Override
-    public void render(int xm, int ym, float renderPartialTicks)
+    public void render(int mx, int my, float renderPartialTicks)
     {
         if (pickingKeyBinding != null && pickingKeyBindingComponent != null) {
-            xm = -1;
-            ym = -1;
-        } else if (doOptionsScroll && xm > pagesListWidth + SEPARATOR_WIDTH + PADDING && xm < width) {
+            mx = -1;
+            my = -1;
+        } else if (doOptionsScroll && mx > pagesListWidth + SEPARATOR_WIDTH + PADDING && mx < width) {
             if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
                 scrollOptions(Mouse.getDWheel() / -0.01f);
             } else {
                 scrollOptions(Mouse.getDWheel() / -0.05f);
             }
             onScrollOptions();
-        } else if (doPagesListScroll && xm >= 0 && xm <= pagesListWidth) {
+        } else if (doPagesListScroll && mx >= 0 && mx <= pagesListWidth) {
             if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
                 scrollPagesList(Mouse.getDWheel() / -0.01f);
             } else {
@@ -244,8 +244,8 @@ public class ScreenOptions
         overlayBackground(0, width, bottom, height);
 
         Scissor.enable(0, top, width, bottom - top);
-        if (ym >= top && ym <= bottom) {
-            drawPageItems(pagesListWidth + SEPARATOR_WIDTH + PADDING, top - (int) optionsScrollAmount, pageWidth - 8, xm, ym);
+        if (my >= top && my <= bottom) {
+            drawPageItems(pagesListWidth + SEPARATOR_WIDTH + PADDING, top - (int) optionsScrollAmount, pageWidth - 8, mx, my);
         } else {
             drawPageItems(pagesListWidth + SEPARATOR_WIDTH + PADDING, top - (int) optionsScrollAmount, pageWidth - 8, -1, -1);
         }
@@ -257,8 +257,8 @@ public class ScreenOptions
         if (pagesListHeight < bottom - top) {
             pagesListY = top + (bottom - top - pagesListHeight) / 2;
         }
-        if (ym >= top && ym <= bottom) {
-            drawPagesListItems(PADDING - 4, pagesListY, pagesListWidth - PADDING, xm, ym);
+        if (my >= top && my <= bottom) {
+            drawPagesListItems(PADDING - 4, pagesListY, pagesListWidth - PADDING, mx, my);
         } else {
             drawPagesListItems(PADDING - 4, pagesListY, pagesListWidth - PADDING, -1, -1);
         }
@@ -305,10 +305,10 @@ public class ScreenOptions
         String titleLanguageKey = "gui.options.title";
         drawStringCentered(font, i18n.translateKey(titleLanguageKey), width / 2, 5, 0xffffff);
 
-        drawOptionsScrollBar(xm, ym);
-        drawPagesListScrollBar(xm, ym);
+        drawOptionsScrollBar(mx, my);
+        drawPagesListScrollBar(mx, my);
 
-        super.render(xm, ym, renderPartialTicks);
+        super.render(mx, my, renderPartialTicks);
 
         if (pickingKeyBinding != null && pickingKeyBindingComponent != null) {
             drawRect(0, 0, width, height, 0xA0000000);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java b/game/client/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java
index e3badc430..1c6e6ff62 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java
@@ -172,16 +172,16 @@ public class ScreenPaged
     }
 
     @Override
-    public void render(int xm, int ym, float renderPartialTicks)
+    public void render(int mx, int my, float renderPartialTicks)
     {
-        if (xm > leftWidth + SEPARATOR_WIDTH + PADDING && xm < width) {
+        if (mx > leftWidth + SEPARATOR_WIDTH + PADDING && mx < width) {
             if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
                 scrollRightPanel(Mouse.getDWheel() / -0.01f);
             } else {
                 scrollRightPanel(Mouse.getDWheel() / -0.05f);
             }
             onScrollRightPanel();
-        } else if (xm >= 0 && xm <= leftWidth) {
+        } else if (mx >= 0 && mx <= leftWidth) {
             if (Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL)) {
                 scrollLeftPanel(Mouse.getDWheel() / -0.01f);
             } else {
@@ -199,8 +199,8 @@ public class ScreenPaged
         overlayBackground(0, width, bottom, height);
 
         Scissor.enable(0, top, width, bottom - top);
-        if (ym >= top && ym <= bottom) {
-            drawPageItems(leftWidth + SEPARATOR_WIDTH + PADDING, top - (int) rightScrollAmount, pageWidth - 8, xm, ym);
+        if (my >= top && my <= bottom) {
+            drawPageItems(leftWidth + SEPARATOR_WIDTH + PADDING, top - (int) rightScrollAmount, pageWidth - 8, mx, my);
         } else {
             drawPageItems(leftWidth + SEPARATOR_WIDTH + PADDING, top - (int) rightScrollAmount, pageWidth - 8, -1, -1);
         }
@@ -212,8 +212,8 @@ public class ScreenPaged
         if (pagesListHeight < bottom - top) {
             pagesListY = top + (bottom - top - pagesListHeight) / 2;
         }
-        if (ym >= top && ym <= bottom) {
-            drawPagesListItems(PADDING - 4, pagesListY, leftWidth - PADDING, xm, ym);
+        if (my >= top && my <= bottom) {
+            drawPagesListItems(PADDING - 4, pagesListY, leftWidth - PADDING, mx, my);
         } else {
             drawPagesListItems(PADDING - 4, pagesListY, leftWidth - PADDING, -1, -1);
         }
@@ -259,10 +259,10 @@ public class ScreenPaged
 
         drawStringCentered(font, i18n.translateKey(titleTranslationKey), width / 2, 5, 0xffffff);
 
-        drawRightPanelScrollBar(xm, ym);
-        drawLeftPanelScrollBar(xm, ym);
+        drawRightPanelScrollBar(mx, my);
+        drawLeftPanelScrollBar(mx, my);
 
-        super.render(xm, ym, renderPartialTicks);
+        super.render(mx, my, renderPartialTicks);
     }
 
     protected void drawRightPanelScrollBar(int mouseX, int mouseY) {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java b/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java
index f569d36b0..b7554f350 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java
@@ -159,7 +159,7 @@ public final class PopupScreen
     }
 
     @Override
-    public void render(int xm, int ym, float partialTick)
+    public void render(int mx, int my, float partialTick)
     {
         int popupX = width / 2 - popupWidth / 2;
         int popupY = height / 2 - popupHeight / 2;
@@ -172,11 +172,11 @@ public final class PopupScreen
 
         for (PopupComponent component : components)
         {
-            component.render(popupX + HORIZONTAL_MARGIN, accY, xm, ym);
+            component.render(popupX + HORIZONTAL_MARGIN, accY, mx, my);
             accY += component.getHeight() + COMPONENT_GAP;
         }
 
-        super.render(xm, ym, partialTick);
+        super.render(mx, my, partialTick);
     }
 
     private void drawPopupBackground()
diff --git a/game/client/src/main/java/net/minecraft/client/input/Gamepad.java b/game/client/src/main/java/net/minecraft/client/input/Gamepad.java
new file mode 100644
index 000000000..fb7f8c7c4
--- /dev/null
+++ b/game/client/src/main/java/net/minecraft/client/input/Gamepad.java
@@ -0,0 +1,24 @@
+package net.minecraft.client.input;
+
+import org.jetbrains.annotations.NotNull;
+
+public interface Gamepad {
+
+    @NotNull String getGuid();
+
+    @NotNull String getName();
+
+    int getVendorId();
+
+    int getDeviceId();
+
+    void poll();
+
+    boolean hasAnyInput();
+
+    boolean isPresent();
+
+    float getAxisValue(final int axis);
+
+    boolean isButtonPressed(final int button);
+}
diff --git a/game/client/src/main/java/net/minecraft/client/input/InputHandler.java b/game/client/src/main/java/net/minecraft/client/input/InputHandler.java
index bc3ce90e0..603ca3d92 100644
--- a/game/client/src/main/java/net/minecraft/client/input/InputHandler.java
+++ b/game/client/src/main/java/net/minecraft/client/input/InputHandler.java
@@ -2,15 +2,12 @@ package net.minecraft.client.input;
 
 import com.mojang.logging.LogUtils;
 import net.minecraft.client.input.glfw.GlfwGamepad;
-import net.minecraft.client.input.glfw.GlfwJoystick;
 import org.lwjgl.glfw.GLFW;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.input.controller.ControllerInput;
 import org.slf4j.Logger;
 
-import java.io.IOException;
-
 public abstract class InputHandler {
 	private static final Logger LOGGER = LogUtils.getLogger();
 	private static Minecraft minecraft;
@@ -45,13 +42,11 @@ public abstract class InputHandler {
 					}
 				}
 			} else {
-				if (GLFW.glfwJoystickPresent(i)) {
-					GlfwGamepad gamepad = new GlfwJoystick(i).intoGamepad();
-					if (gamepad != null) {
-						ControllerInput input = new ControllerInput(minecraft, gamepad);
-						controllers[i] = input;
-						connected(input);
-					}
+				if (GLFW.glfwJoystickPresent(i) && GLFW.glfwJoystickIsGamepad(i)) {
+					GlfwGamepad gamepad = new GlfwGamepad(i);
+					ControllerInput input = new ControllerInput(minecraft, gamepad);
+					controllers[i] = input;
+					connected(input);
 				}
 			}
 		}
@@ -73,13 +68,11 @@ public abstract class InputHandler {
 	public static void initGLFW(Minecraft minecraft) throws Throwable {
 		int found = 0;
 		for (int i = GLFW.GLFW_JOYSTICK_1; i < GLFW.GLFW_JOYSTICK_LAST; i++) {
-			if (GLFW.glfwJoystickPresent(i)) {
-				GlfwGamepad gamepad = new GlfwJoystick(i).intoGamepad();
-				if (gamepad != null) {
-					ControllerInput input = new ControllerInput(minecraft, gamepad);
-					controllers[i] = input;
-					found++;
-				}
+			if (GLFW.glfwJoystickPresent(i) && GLFW.glfwJoystickIsGamepad(i)) {
+				GlfwGamepad gamepad = new GlfwGamepad(i);
+				ControllerInput input = new ControllerInput(minecraft, gamepad);
+				controllers[i] = input;
+				found++;
 			}
 		}
 //		int[] vids = { 0x0079, 0x0079, 0x054c, 0x0079, 0x03F0, 0x057e, 0x28de, 0x28de };
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 0d2bbe04a..322792f2b 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
@@ -39,7 +39,7 @@ public class PlayerInput {
 		}
 		
 		if(gameSettings.keySneak.isKeyboardKey(keyCode)) {
-			if(gameSettings.sneakToggle.value) {
+			if(gameSettings.sneakToggle.value && !mc.thePlayer.noPhysics) {
 				if(pressed) {
 					sneak = !sneak;
 				}
@@ -95,8 +95,12 @@ public class PlayerInput {
 			moveForward = -mc.controllerInput.joyLeft.getY();
 			moveStrafe = -mc.controllerInput.joyLeft.getX();
 			jump = mc.controllerInput.buttonA.isPressed();
-			if(mc.controllerInput.joyRight.getButton().pressedThisFrame()) {
-				sneak = !sneak;
+			if (mc.thePlayer.noPhysics) {
+				sneak = mc.controllerInput.joyRight.getButton().isPressed();
+			} else {
+				if(mc.controllerInput.joyRight.getButton().pressedThisFrame()) {
+					sneak = !sneak;
+				}
 			}
 		}
 
diff --git a/game/client/src/main/java/net/minecraft/client/input/controller/Joystick.java b/game/client/src/main/java/net/minecraft/client/input/controller/Joystick.java
index 8e257c057..d34d9bbfe 100644
--- a/game/client/src/main/java/net/minecraft/client/input/controller/Joystick.java
+++ b/game/client/src/main/java/net/minecraft/client/input/controller/Joystick.java
@@ -40,18 +40,21 @@ public class Joystick{
 		
 		float x = this.joystickListener.getValue(xAxis);
 		float y = this.joystickListener.getValue(yAxis);
+
+		float length = (float) Math.sqrt(x * x + y * y);
 		
-		boolean xInDeadzone = x < deadzone.value && x > -deadzone.value;
-		boolean yInDeadzone = y < deadzone.value && y > -deadzone.value;
-		
-		if(xInDeadzone) x = 0.0f;
-		if(yInDeadzone) y = 0.0f;
-		
+		boolean inDeadzone = length < deadzone.value;
+
+		if (inDeadzone) {
+			x = 0.0f;
+			y = 0.0f;
+		}
+
 		this.x = x;
 		this.y = y;
 		
 		moveLastFrame = moving;
-		moving = !(xInDeadzone && yInDeadzone);
+		moving = !inDeadzone;
 	}
 	
 	public boolean stoppedMoving() {
diff --git a/game/client/src/main/java/net/minecraft/client/input/glfw/FakeGamepad.java b/game/client/src/main/java/net/minecraft/client/input/glfw/FakeGamepad.java
index a76eaa804..d0dbe9f0f 100644
--- a/game/client/src/main/java/net/minecraft/client/input/glfw/FakeGamepad.java
+++ b/game/client/src/main/java/net/minecraft/client/input/glfw/FakeGamepad.java
@@ -1,5 +1,7 @@
 package net.minecraft.client.input.glfw;
 
+import org.jetbrains.annotations.NotNull;
+
 public class FakeGamepad extends GlfwGamepad {
     private final String name;
     private final int vid;
@@ -14,7 +16,7 @@ public class FakeGamepad extends GlfwGamepad {
     }
 
     @Override
-    public String getGuid() {
+    public @NotNull String getGuid() {
         return "00000000000000000000000000000000";
     }
 
@@ -39,7 +41,7 @@ public class FakeGamepad extends GlfwGamepad {
     }
 
     @Override
-    public String getName() {
+    public @NotNull String getName() {
         return name;
     }
 
@@ -52,14 +54,4 @@ public class FakeGamepad extends GlfwGamepad {
     public boolean isButtonPressed(int button) {
         return false;
     }
-
-    @Override
-    public int getHatValue(int hat) {
-        return 0;
-    }
-
-    @Override
-    public GlfwGamepad intoGamepad() {
-        return this;
-    }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwGamepad.java b/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwGamepad.java
index 5cc120b09..6c49c2dff 100644
--- a/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwGamepad.java
+++ b/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwGamepad.java
@@ -1,20 +1,70 @@
 package net.minecraft.client.input.glfw;
 
+import net.minecraft.client.input.Gamepad;
+import org.jetbrains.annotations.NotNull;
 import org.lwjgl.glfw.GLFW;
 import org.lwjgl.glfw.GLFWGamepadState;
 
 import java.nio.ByteBuffer;
+import java.nio.FloatBuffer;
 
-public class GlfwGamepad extends GlfwJoystick {
+public class GlfwGamepad implements Gamepad {
+    private final int id;
+    private final int vid;
+    private final int did;
     private GLFWGamepadState state = null;
 
     public GlfwGamepad(int id) {
-        super(id);
+        this.id = id;
+
+        String guid = this.getGuid();
+
+        int vid;
+        try {
+            String lower = guid.substring(8, 10);
+            String upper = guid.substring(10, 12);
+            vid = Integer.parseInt(upper + lower, 16);
+        } catch (Exception e) {
+            System.out.println("Controller " + id + " has weird GUID!");
+            this.vid = 0;
+            this.did = 0;
+            return;
+        }
+
+        int did;
+        try {
+            String lower = guid.substring(16, 18);
+            String upper = guid.substring(18, 20);
+            did = Integer.parseInt(upper + lower, 16);
+        } catch (Exception e) {
+            System.out.println("Controller " + id + " has weird GUID!");
+            this.vid = 0;
+            this.did = 0;
+            return;
+        }
+
+        this.vid = vid;
+        this.did = did;
+    }
+
+    public int getId() {
+        return this.id;
+    }
+
+    public @NotNull String getGuid() {
+        return GLFW.glfwGetJoystickGUID(this.id);
+    }
+
+    public int getVendorId() {
+        return this.vid;
+    }
+
+    public int getDeviceId() {
+        return this.did;
     }
 
     @Override
     public void poll() {
-        super.poll();
         this.state = new GLFWGamepadState(ByteBuffer.allocateDirect(GLFWGamepadState.SIZEOF));
         GLFW.glfwGetGamepadState(this.getId(), this.state);
     }
@@ -36,7 +86,12 @@ public class GlfwGamepad extends GlfwJoystick {
     }
 
     @Override
-    public String getName() {
+    public boolean isPresent() {
+        return GLFW.glfwJoystickPresent(this.id);
+    }
+
+    @Override
+    public @NotNull String getName() {
         if (this.getVendorId() == 0x7475) {
             return GLFW.glfwGetJoystickName(this.getId()) + " " + this.getId();
         }
@@ -60,9 +115,4 @@ public class GlfwGamepad extends GlfwJoystick {
 
         return false;
     }
-
-    @Override
-    public GlfwGamepad intoGamepad() {
-        return this;
-    }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwJoystick.java b/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwJoystick.java
deleted file mode 100644
index c8353c1ee..000000000
--- a/game/client/src/main/java/net/minecraft/client/input/glfw/GlfwJoystick.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package net.minecraft.client.input.glfw;
-
-import org.lwjgl.glfw.GLFW;
-
-import java.nio.ByteBuffer;
-import java.nio.FloatBuffer;
-
-public class GlfwJoystick {
-    private final int id;
-    private final int vid;
-    private final int did;
-    private FloatBuffer axes = null;
-    private ByteBuffer buttons = null;
-    private ByteBuffer hats = null;
-    private GlfwGamepad gamepad = null;
-
-    public GlfwJoystick(int id) {
-        this.id = id;
-
-        String guid = this.getGuid();
-
-        int vid;
-        try {
-            String lower = guid.substring(8, 10);
-            String upper = guid.substring(10, 12);
-            vid = Integer.parseInt(upper + lower, 16);
-        } catch (Exception e) {
-            System.out.println("Controller " + id + " has weird GUID!");
-            this.vid = 0;
-            this.did = 0;
-            return;
-        }
-
-        int did;
-        try {
-            String lower = guid.substring(16, 18);
-            String upper = guid.substring(18, 20);
-            did = Integer.parseInt(upper + lower, 16);
-        } catch (Exception e) {
-            System.out.println("Controller " + id + " has weird GUID!");
-            this.vid = 0;
-            this.did = 0;
-            return;
-        }
-
-        this.vid = vid;
-        this.did = did;
-    }
-
-    public int getId() {
-        return this.id;
-    }
-
-    public String getGuid() {
-        return GLFW.glfwGetJoystickGUID(this.id);
-    }
-
-    public int getVendorId() {
-        return this.vid;
-    }
-
-    public int getDeviceId() {
-        return this.did;
-    }
-
-    public void poll() {
-        this.axes = GLFW.glfwGetJoystickAxes(this.id);
-        this.buttons = GLFW.glfwGetJoystickButtons(this.id);
-        this.hats = GLFW.glfwGetJoystickHats(this.id);
-    }
-
-    public boolean hasAnyInput() {
-        for (int i = 0; i <= buttons.capacity(); i++) {
-            if (buttons.get(i) == GLFW.GLFW_PRESS) {
-                return true;
-            }
-        }
-        for (int i = 0; i < axes.capacity(); i++) {
-            if (Math.abs(axes.get(i)) > 0.5f) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public boolean isPresent() {
-        return GLFW.glfwJoystickPresent(this.id);
-    }
-
-    public String getName() {
-        return GLFW.glfwGetJoystickName(this.id);
-    }
-
-    public float getAxisValue(int axis) {
-        if (isPresent() && axes != null && axis >= 0 && axis < axes.capacity()) {
-            return axes.get(axis);
-        }
-
-        return 0.0F;
-    }
-
-    public boolean isButtonPressed(int button) {
-        if (isPresent() && buttons != null && button >= 0 && button < buttons.capacity()) {
-            return buttons.get(button) == GLFW.GLFW_PRESS;
-        }
-
-        return false;
-    }
-
-    public int getHatValue(int hat) {
-        if (isPresent() && hats != null && hat >= 0 && hat < hats.capacity()) {
-            return hats.get(hat);
-        }
-
-        return GLFW.GLFW_HAT_CENTERED;
-    }
-
-    public GlfwGamepad intoGamepad() {
-        if (gamepad == null && isPresent() && GLFW.glfwJoystickIsGamepad(this.id)) {
-            gamepad = new GlfwGamepad(id);
-        }
-
-        return gamepad;
-    }
-}
diff --git a/game/client/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java b/game/client/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java
index bf0635aa5..49e431012 100644
--- a/game/client/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java
+++ b/game/client/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java
@@ -196,7 +196,7 @@ public class PacketHandlerClient extends PacketHandler
         } else {
             owner = null;
         }
-        Entity newEntity = NetEntityHandler.getTypeEntry(addEntityPacket.type).getEntity(worldClientMP, xPosition, yPosition, zPosition, addEntityPacket.metaData, addEntityPacket.hasVelocity, addEntityPacket.xVelocity / 8000D, addEntityPacket.yVelocity / 8000D, addEntityPacket.zVelocity / 8000D, owner);
+        Entity newEntity = NetEntityHandler.getTypeEntry(addEntityPacket.type).getEntity(worldClientMP, xPosition, yPosition, zPosition, addEntityPacket.metaData, addEntityPacket.hasVelocity, addEntityPacket.xVelocity / 8000D, addEntityPacket.yVelocity / 8000D, addEntityPacket.zVelocity / 8000D, owner, addEntityPacket.tag);
         if (newEntity != null) {
             newEntity.serverPosX = addEntityPacket.xPosition;
             newEntity.serverPosY = addEntityPacket.yPosition;
diff --git a/game/client/src/main/java/net/minecraft/client/net/thread/ThreadPingServer.java b/game/client/src/main/java/net/minecraft/client/net/thread/ThreadPingServer.java
index f914ade77..9d14230d7 100644
--- a/game/client/src/main/java/net/minecraft/client/net/thread/ThreadPingServer.java
+++ b/game/client/src/main/java/net/minecraft/client/net/thread/ThreadPingServer.java
@@ -19,8 +19,11 @@ public class ThreadPingServer
     public ThreadPingServer(ScreenSelectServer screen, ServerData server) {
         this.screen = screen;
         this.server = server;
-        ServerAddress address = server.getServerAddress();
-        this.setName("ThreadPingServer - " + address.getIP() + ":" + address.getPort());
+//        Turns out getting the real address like this is horribly horribly slow, taking me sometime 40 seconds to process all of these set names
+//        ServerAddress address = server.getServerAddress();
+//        this.setName("ThreadPingServer - " + address.getIP() + ":" + address.getPort());
+
+        this.setName("ThreadPingServer - " + server.address);
     }
 
     public ServerData getServer() {
diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelLeaves.java b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelLeaves.java
index c155b498d..6a6fa7905 100644
--- a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelLeaves.java
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelLeaves.java
@@ -37,7 +37,7 @@ public class BlockModelLeaves<T extends BlockLogic> extends BlockModelStandard<T
     @Override
     public void renderBlockOnInventory(Tessellator tessellator, int metadata, float brightness, float alpha, @Nullable Integer lightmapCoordinate) {
         boolean invTint = renderBlocks.useInventoryTint;
-        renderBlocks.useInventoryTint = (canBeRetro && isRetro());
+        renderBlocks.useInventoryTint = !canBeRetro || !isRetro();
         super.renderBlockOnInventory(tessellator, metadata, brightness, alpha, lightmapCoordinate);
         renderBlocks.useInventoryTint = invTint;
     }
diff --git a/game/client/src/main/resources/assets/minecraft/textures/colormap/stars/default.png b/game/client/src/main/resources/assets/minecraft/textures/colormap/stars/default.png
index 1cc7e9000..c31b5d772 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/colormap/stars/default.png and b/game/client/src/main/resources/assets/minecraft/textures/colormap/stars/default.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/layout.png b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/layout.png
new file mode 100644
index 000000000..e54c301bf
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/layout.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps3.png b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps3.png
index e0123dbff..cf84b4565 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps3.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps3.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps4.png b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps4.png
index 6d1ae1c9d..46dcb6415 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps4.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps4.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps5.png b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps5.png
index 4c55ada85..8abeb4b38 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps5.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/ps5.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/steam.png b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/steam.png
index 6cd546f82..7bea36fd8 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/steam.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/steam.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/steam_deck.png b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/steam_deck.png
index f2eee7089..a8a17275f 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/steam_deck.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/steam_deck.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/switch.png b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/switch.png
index 98733710d..237e39890 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/switch.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/switch.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/template.png b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/template.png
index e4815496d..771f7f8a8 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/template.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/template.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/xbox_360.png b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/xbox_360.png
index 4cac4a1fd..f53aafd18 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/xbox_360.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/xbox_360.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/xbox_one.png b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/xbox_one.png
index d45c89e71..18747a917 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/controller/xbox_one.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/controller/xbox_one.png differ
diff --git a/game/core/src/main/java/net/minecraft/core/block/piston/BlockLogicPistonBaseSteel.java b/game/core/src/main/java/net/minecraft/core/block/piston/BlockLogicPistonBaseSteel.java
index d338c927d..dc3aaf49f 100644
--- a/game/core/src/main/java/net/minecraft/core/block/piston/BlockLogicPistonBaseSteel.java
+++ b/game/core/src/main/java/net/minecraft/core/block/piston/BlockLogicPistonBaseSteel.java
@@ -102,17 +102,19 @@ public class BlockLogicPistonBaseSteel extends BlockLogicPistonBase {
             TileEntity tileEntity = world.getBlockEntity(xo, yo, zo);
             world.removeBlockTileEntity(xo, yo, zo);
             world.setBlockWithNotify(xo, yo, zo, 0);
-            EntityFallingBlock entityFallingBlock = new EntityFallingBlock(world, xo + 0.5, yo + 0.5, zo + 0.5, block.id(), blockMeta, tileEntity);
-            entityFallingBlock.hasRemovedBlock = true;
-            if (tileEntity instanceof IVehicle) {
-                Entity rider = ((IVehicle) tileEntity).getPassenger();
-                ((IVehicle) tileEntity).ejectRider();
-                if (rider != null) rider.startRiding(entityFallingBlock);
+            if (!world.isClientSide) {
+                EntityFallingBlock entityFallingBlock = new EntityFallingBlock(world, xo + 0.5, yo + 0.5, zo + 0.5, block.id(), blockMeta, tileEntity);
+                entityFallingBlock.hasRemovedBlock = true;
+                if (tileEntity instanceof IVehicle) {
+                    Entity rider = ((IVehicle) tileEntity).getPassenger();
+                    ((IVehicle) tileEntity).ejectRider();
+                    if (rider != null) rider.startRiding(entityFallingBlock);
+                }
+                world.entityJoinedWorld(entityFallingBlock);
+                final double speed = 2;
+                entityFallingBlock.fling(direction.getOffsetX() * speed, direction.getOffsetY() * speed, direction.getOffsetZ() * speed, 1f);
+                flungBlock = entityFallingBlock;
             }
-            world.entityJoinedWorld(entityFallingBlock);
-            final double speed = 2;
-            entityFallingBlock.fling(direction.getOffsetX() * speed, direction.getOffsetY() * speed, direction.getOffsetZ() * speed, 1f);
-            flungBlock = entityFallingBlock;
         }
         return true;
     }
@@ -130,6 +132,66 @@ public class BlockLogicPistonBaseSteel extends BlockLogicPistonBase {
         return true;
     }
 
+    @Override
+    protected boolean tryExtend(World world, int x, int y, int z, Direction direction, int maxPushedBlocks) {
+        if (world.isClientSide) { // "Fixes" steel pistons appearing to push the block they just flung
+            int data = world.getBlockMetadata(x, y, z);
+            int xo = x + direction.getOffsetX();
+            int yo = y + direction.getOffsetY();
+            int zo = z + direction.getOffsetZ();
+            int blocks = 0;
+            while (true) {
+                if (blocks >= maxPushedBlocks + 1) {
+                    break;
+                }
+                if (yo < 0 || yo >= world.getHeightBlocks()) {
+                    return false;
+                }
+                int blockId = world.getBlockId(xo, yo, zo);
+                if (blockId == 0) {
+                    break;
+                }
+                if (!isPushable(blockId, world, xo, yo, zo, true)) {
+                    return false;
+                }
+                if (Blocks.blocksList[blockId].getPistonPushReaction(world, xo, yo, zo) == Material.PISTON_DESTROY_ON_PUSH) {
+                    Blocks.blocksList[blockId].dropBlockWithCause(world, EnumDropCause.WORLD, xo, yo, zo, world.getBlockMetadata(xo, yo, zo), world.getBlockEntity(xo, yo, zo), null);
+                    break;
+                }
+                if (blocks == maxPushedBlocks) {
+                    return false;
+                }
+                xo += direction.getOffsetX();
+                yo += direction.getOffsetY();
+                zo += direction.getOffsetZ();
+                blocks++;
+            }
+            if (blocks == 1) {
+                while (xo != x || yo != y || zo != z) {
+                    int px = xo - direction.getOffsetX();
+                    int py = yo - direction.getOffsetY();
+                    int pz = zo - direction.getOffsetZ();
+                    int pushId = world.getBlockId(px, py, pz);
+                    TileEntity pushEntity = world.getBlockEntity(px, py, pz);
+                    if (pushEntity instanceof TileEntityMovingPistonBlock && px == x && py == y && pz == z) {
+                        break;
+                    }
+                    if(pushId == block.id() && px == x && py == y && pz == z)
+                    {
+                        createPistonHeadAt(world, xo, yo, zo, data, direction);
+                    }
+                    if (!(px == x && py == y && pz == z))
+                        world.setBlockAndMetadataRaw(px, py, pz, 0, 0);
+                    xo = px;
+                    yo = py;
+                    zo = pz;
+                }
+                return true;
+            }
+        }
+        return super.tryExtend(world, x, y, z, direction, maxPushedBlocks);
+    }
+
     @Override
     public void extendEvent(World world, int x, int y, int z, int data, Direction direction) {
         List<Entity> entityList = new ArrayList<>(world.getEntitiesWithinAABBExcludingEntity(null, AABB.getTemporaryBB((double)x + direction.getOffsetX(), (double)y + direction.getOffsetY(), (double)z + direction.getOffsetZ(), (double)x + direction.getOffsetX() + 1, (double)y + direction.getOffsetY() + 1, (double)z + direction.getOffsetZ() + 1)));
diff --git a/game/core/src/main/java/net/minecraft/core/entity/monster/MobSkeleton.java b/game/core/src/main/java/net/minecraft/core/entity/monster/MobSkeleton.java
index eb78c91ca..bed83081e 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/monster/MobSkeleton.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/monster/MobSkeleton.java
@@ -9,6 +9,7 @@ import net.minecraft.core.util.collection.NamespaceID;
 import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.world.World;
+import net.minecraft.core.world.weather.Weather;
 import net.minecraft.core.world.weather.Weathers;
 import org.jetbrains.annotations.NotNull;
 
@@ -60,8 +61,9 @@ public class MobSkeleton extends MobMonster
         if(world.isDaytime())
         {
             float f = getBrightness(1.0F);
+            Weather weather;
             if(f > 0.5F && world.canBlockSeeTheSky(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z)) && random.nextFloat() * 30F < (f - 0.4F) * 2.0F
-                && !world.getCurrentWeather().isDamp && (world.getCurrentWeather() != Weathers.OVERWORLD_FOG || world.weatherManager.getWeatherPower() < 0.75F))
+                && (weather = world.getCurrentWeather()) != null &&  !weather.isDamp && (weather != Weathers.OVERWORLD_FOG || world.weatherManager.getWeatherPower() < 0.75F))
             {
                 remainingFireTicks = 300;
             }
diff --git a/game/core/src/main/java/net/minecraft/core/entity/monster/MobZombie.java b/game/core/src/main/java/net/minecraft/core/entity/monster/MobZombie.java
index 6d34b806e..92a769a7c 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/monster/MobZombie.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/monster/MobZombie.java
@@ -26,10 +26,10 @@ public class MobZombie extends MobMonster
     {
         if(world.isDaytime())
         {
-            Weather currentWeather = world.getCurrentWeather();
             float f = getBrightness(1.0F);
+            Weather weather = world.getCurrentWeather();
             if(f > 0.5F && world.canBlockSeeTheSky(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z)) && random.nextFloat() * 30F < (f - 0.4F) * 2.0F
-                && !world.getCurrentWeather().isDamp && (world.getCurrentWeather() != Weathers.OVERWORLD_FOG || world.weatherManager.getWeatherPower() < 0.75F))
+                && weather != null && !weather.isDamp && (world.getCurrentWeather() != Weathers.OVERWORLD_FOG || world.weatherManager.getWeatherPower() < 0.75F))
             {
                 remainingFireTicks = 300;
             }
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/IVehicleEntry.java b/game/core/src/main/java/net/minecraft/core/net/entity/IVehicleEntry.java
index 61a436ba7..786e1d73c 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/IVehicleEntry.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/IVehicleEntry.java
@@ -1,10 +1,12 @@
 package net.minecraft.core.net.entity;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public interface IVehicleEntry<T> extends IPacketEntry<T> {
-    Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner);
+    Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag);
     PacketAddEntity getSpawnPacket(EntityTrackerEntry tracker, T trackedObject);
 }
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryArrow.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryArrow.java
index ce5099a08..fae34dacf 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryArrow.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryArrow.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.entity.entries;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.projectile.ProjectileArrow;
@@ -12,6 +13,7 @@ import net.minecraft.core.net.entity.IVehicleEntry;
 import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class NetEntryArrow implements IVehicleEntry<ProjectileArrow>, ITrackedEntry<ProjectileArrow> {
     @Override
@@ -40,7 +42,7 @@ public class NetEntryArrow implements IVehicleEntry<ProjectileArrow>, ITrackedEn
     }
 
     @Override
-    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag) {
         if (metadata == 2) {
             return new ProjectileArrowGolden(world, x, y, z);
         } else if (metadata == 1) {
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java
index e7177fae9..5460a9ada 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.entity.entries;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.net.entity.EntityTracker;
@@ -9,6 +10,7 @@ import net.minecraft.core.net.entity.IVehicleEntry;
 import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class NetEntryBoat implements IVehicleEntry<EntityBoat>, ITrackedEntry<EntityBoat> {
     @Override
@@ -37,7 +39,7 @@ public class NetEntryBoat implements IVehicleEntry<EntityBoat>, ITrackedEntry<En
     }
 
     @Override
-    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag) {
         return new EntityBoat(world, x, y, z);
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBobber.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBobber.java
index 266e98d12..14fa5cf4e 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBobber.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBobber.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.entity.entries;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityFishingBobber;
 import net.minecraft.core.entity.player.Player;
@@ -10,6 +11,7 @@ import net.minecraft.core.net.entity.IVehicleEntry;
 import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class NetEntryBobber implements IVehicleEntry<EntityFishingBobber>, ITrackedEntry<EntityFishingBobber> {
     @Override
@@ -38,7 +40,7 @@ public class NetEntryBobber implements IVehicleEntry<EntityFishingBobber>, ITrac
     }
 
     @Override
-    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag) {
         EntityFishingBobber bobber = new EntityFishingBobber(world, x, y, z);
         if (owner != null) {
             bobber.owner = (Player) owner;
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryCannonball.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryCannonball.java
index 1b8ad3ad9..d205b6ce6 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryCannonball.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryCannonball.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.entity.entries;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.projectile.ProjectileCannonball;
@@ -10,6 +11,7 @@ import net.minecraft.core.net.entity.IVehicleEntry;
 import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class NetEntryCannonball implements IVehicleEntry<ProjectileCannonball>, ITrackedEntry<ProjectileCannonball> {
     @Override
@@ -38,7 +40,7 @@ public class NetEntryCannonball implements IVehicleEntry<ProjectileCannonball>,
     }
 
     @Override
-    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag) {
         return new ProjectileCannonball(world, x, y, z);
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryEgg.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryEgg.java
index af9aef5cf..15eb1e43f 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryEgg.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryEgg.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.entity.entries;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.projectile.ProjectileEgg;
 import net.minecraft.core.net.entity.EntityTracker;
@@ -9,6 +10,7 @@ import net.minecraft.core.net.entity.IVehicleEntry;
 import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class NetEntryEgg implements IVehicleEntry<ProjectileEgg>, ITrackedEntry<ProjectileEgg> {
     @Override
@@ -37,7 +39,7 @@ public class NetEntryEgg implements IVehicleEntry<ProjectileEgg>, ITrackedEntry<
     }
 
     @Override
-    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag) {
         return new ProjectileEgg(world, x, y, z);
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFallingBlock.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFallingBlock.java
index a2cf723ce..5c4893e04 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFallingBlock.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFallingBlock.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.entity.entries;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityFallingBlock;
@@ -11,6 +12,7 @@ import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class NetEntryFallingBlock implements IVehicleEntry<EntityFallingBlock>, ITrackedEntry<EntityFallingBlock> {
     @Override
@@ -39,12 +41,18 @@ public class NetEntryFallingBlock implements IVehicleEntry<EntityFallingBlock>,
     }
 
     @Override
-    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
-        return new EntityFallingBlock(world, x, y, z, MathHelper.clamp(metadata, 0, Blocks.blocksList.length), 0, null);
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag) {
+        EntityFallingBlock fallingBlock = new EntityFallingBlock(world, x, y, z, MathHelper.clamp(metadata, 0, Blocks.blocksList.length), 0, null);
+        if (tag != null) {
+            fallingBlock.readAdditionalSaveData(tag);
+        }
+        return fallingBlock;
     }
 
     @Override
     public PacketAddEntity getSpawnPacket(EntityTrackerEntry tracker, EntityFallingBlock trackedObject) {
-        return new PacketAddEntity(trackedObject, trackedObject.carriedBlock.blockId);
+        CompoundTag tag = new CompoundTag();
+        trackedObject.addAdditionalSaveData(tag);
+        return new PacketAddEntity(trackedObject, -1, -1, null, null, null, tag);
     }
 }
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFireball.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFireball.java
index acae630e1..e5742d591 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFireball.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFireball.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.entity.entries;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.projectile.ProjectileFireball;
 import net.minecraft.core.net.entity.EntityTracker;
@@ -9,6 +10,7 @@ import net.minecraft.core.net.entity.IVehicleEntry;
 import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class NetEntryFireball implements IVehicleEntry<ProjectileFireball>, ITrackedEntry<ProjectileFireball> {
     @Override
@@ -37,7 +39,7 @@ public class NetEntryFireball implements IVehicleEntry<ProjectileFireball>, ITra
     }
 
     @Override
-    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag) {
         return new ProjectileFireball(world, x, y, z, xd, yd, zd);
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryMinecart.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryMinecart.java
index 792989d65..0493cf1ad 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryMinecart.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryMinecart.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.entity.entries;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.vehicle.MinecartEntity;
 import net.minecraft.core.net.entity.EntityTracker;
@@ -9,6 +10,7 @@ import net.minecraft.core.net.entity.IVehicleEntry;
 import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class NetEntryMinecart implements IVehicleEntry<MinecartEntity>, ITrackedEntry<MinecartEntity> {
     @Override
@@ -37,7 +39,7 @@ public class NetEntryMinecart implements IVehicleEntry<MinecartEntity>, ITracked
     }
 
     @Override
-    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag) {
         return new MinecartEntity(world, x, y, z, metadata);
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPebble.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPebble.java
index b80ce2cd5..8604301b5 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPebble.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPebble.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.entity.entries;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.projectile.ProjectilePebble;
 import net.minecraft.core.net.entity.EntityTracker;
@@ -9,6 +10,7 @@ import net.minecraft.core.net.entity.IVehicleEntry;
 import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class NetEntryPebble implements IVehicleEntry<ProjectilePebble>, ITrackedEntry<ProjectilePebble> {
     @Override
@@ -37,7 +39,7 @@ public class NetEntryPebble implements IVehicleEntry<ProjectilePebble>, ITracked
     }
 
     @Override
-    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag) {
         return new ProjectilePebble(world, x, y, z);
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPrimedTNT.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPrimedTNT.java
index 722cca273..05da53498 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPrimedTNT.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPrimedTNT.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.entity.entries;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityPrimedTNT;
 import net.minecraft.core.net.entity.EntityTracker;
@@ -9,6 +10,7 @@ import net.minecraft.core.net.entity.IVehicleEntry;
 import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class NetEntryPrimedTNT implements IVehicleEntry<EntityPrimedTNT>, ITrackedEntry<EntityPrimedTNT> {
     @Override
@@ -37,7 +39,7 @@ public class NetEntryPrimedTNT implements IVehicleEntry<EntityPrimedTNT>, ITrack
     }
 
     @Override
-    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag) {
         return new EntityPrimedTNT(world, x, y, z);
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntrySnowball.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntrySnowball.java
index 414e3f1df..e5387b5de 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntrySnowball.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntrySnowball.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.net.entity.entries;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.projectile.ProjectileSnowball;
 import net.minecraft.core.net.entity.EntityTracker;
@@ -9,6 +10,7 @@ import net.minecraft.core.net.entity.IVehicleEntry;
 import net.minecraft.core.net.packet.PacketAddEntity;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class NetEntrySnowball implements IVehicleEntry<ProjectileSnowball>, ITrackedEntry<ProjectileSnowball> {
     @Override
@@ -37,7 +39,7 @@ public class NetEntrySnowball implements IVehicleEntry<ProjectileSnowball>, ITra
     }
 
     @Override
-    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner, @Nullable CompoundTag tag) {
         return new ProjectileSnowball(world, x, y, z);
     }
 
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 4fdc21288..5fd4d72c0 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
@@ -194,7 +194,7 @@ public abstract class Packet
         return result;
     }
 
-    public static void writeCompressedCompoundTag(CompoundTag tag, DataOutputStream dos)
+    public static void writeCompressedCompoundTag(@NotNull CompoundTag tag, DataOutputStream dos)
             throws IOException
     {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddEntity.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddEntity.java
index c8b51221d..5f5b30928 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddEntity.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddEntity.java
@@ -1,14 +1,21 @@
 package net.minecraft.core.net.packet;
 
+import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.Nullable;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 
 public class PacketAddEntity extends Packet {
+    public static final int MASK_OWNER = 0b0000_0001;
+    public static final int MASK_META = 0b0000_0010;
+    public static final int MASK_VELOCITY = 0b0000_0100;
+    public static final int MASK_TAG = 0b000_1000;
+
     public int entityId;
     public int xPosition;
     public int yPosition;
@@ -22,14 +29,16 @@ public class PacketAddEntity extends Packet {
     public short type = -1;
     public int ownerId = -1;
     public int metaData = -1;
+    public @Nullable CompoundTag tag;
     public PacketAddEntity() {}
     public PacketAddEntity(Entity entity)
     {
-        this(entity, -1, -1, null, null, null);
+        this(entity, -1, -1, null, null, null, null);
     }
-    public PacketAddEntity(Entity entity, int metaData){ this(entity, metaData, -1, null, null, null); }
-    public PacketAddEntity(Entity entity, int metaData, int ownerId){ this(entity, metaData, ownerId, null, null, null); }
-    public PacketAddEntity(Entity entity, int metaData, int ownerId, Double xVelocity, Double yVelocity, Double zVelocity) {
+    public PacketAddEntity(Entity entity, int metaData){ this(entity, metaData, -1, null, null, null, null); }
+    public PacketAddEntity(Entity entity, int metaData, int ownerId){ this(entity, metaData, ownerId, null, null, null, null); }
+    public PacketAddEntity(Entity entity, int metaData, int ownerId, Double xVelocity, Double yVelocity, Double zVelocity) { this(entity, metaData, ownerId, xVelocity, yVelocity, zVelocity, null); }
+    public PacketAddEntity(Entity entity, int metaData, int ownerId, Double xVelocity, Double yVelocity, Double zVelocity, @Nullable CompoundTag tag) {
         this.entityId = entity.id;
         this.xPosition = MathHelper.floor(entity.x * 32D);
         this.yPosition = MathHelper.floor(entity.y * 32D);
@@ -46,6 +55,7 @@ public class PacketAddEntity extends Packet {
         } else {
             this.hasVelocity = false;
         }
+        this.tag = tag;
     }
     public PacketAddEntity setType(int type){
         this.type = (short) type;
@@ -76,6 +86,9 @@ public class PacketAddEntity extends Packet {
         if (hasMeta(optionals)){
             metaData = dis.readInt();
         }
+        if (hasTag(optionals)) {
+            tag = readCompressedCompoundTag(dis);
+        }
     }
 
     @Override
@@ -87,7 +100,7 @@ public class PacketAddEntity extends Packet {
         dos.writeInt(zPosition);
         dos.writeFloat(pitch);
         dos.writeFloat(yaw);
-        byte optionals = makeOptionalsByte(hasVelocity, ownerId >= 0, metaData >= 0);
+        byte optionals = makeOptionalsByte(hasVelocity, ownerId >= 0, metaData >= 0, tag != null);
         dos.writeByte(optionals);
 
         if(hasVelocity(optionals)) {
@@ -101,26 +114,35 @@ public class PacketAddEntity extends Packet {
         if(hasMeta(optionals)) {
             dos.writeInt(metaData);
         }
+        if (hasTag(optionals)) {
+            writeCompressedCompoundTag(tag, dos);
+        }
     }
     public boolean hasOwner(byte val){
-        return (val &   0b1) != 0;
+        return (val & MASK_OWNER) != 0;
     }
     public boolean hasMeta(byte val){
-        return (val &  0b10) != 0;
+        return (val & MASK_META) != 0;
     }
     public boolean hasVelocity(byte val){
-        return (val & 0b100) != 0;
+        return (val & MASK_VELOCITY) != 0;
     }
-    public byte makeOptionalsByte(boolean hasVelocity, boolean hasOwner, boolean hasMeta){
+    public boolean hasTag(byte val){
+        return (val & MASK_TAG) != 0;
+    }
+    public byte makeOptionalsByte(boolean hasVelocity, boolean hasOwner, boolean hasMeta, boolean hasCompound){
         byte val = 0;
         if (hasOwner){
-            val |=   0b1;
+            val |= MASK_OWNER;
         }
         if (hasMeta){
-            val |=  0b10;
+            val |= MASK_META;
         }
         if (hasVelocity){
-            val |= 0b100;
+            val |= MASK_VELOCITY;
+        }
+        if (hasCompound){
+            val |= MASK_TAG;
         }
         return val;
     }
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 9029ed847..2aefe2c52 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
@@ -419,7 +419,7 @@ public class World implements WorldSource {
         return chunkProvider.saveChunks(false, null);
     }
 
-    public Weather getCurrentWeather()
+    public @Nullable Weather getCurrentWeather()
     {
         return (weatherManager == null) ? null : weatherManager.getCurrentWeather();
     }
diff --git a/util/stellar/src/main/java/org/useless/stellar/StarUtil.java b/util/stellar/src/main/java/org/useless/stellar/StarUtil.java
index 0bc779eea..a0ec3d058 100644
--- a/util/stellar/src/main/java/org/useless/stellar/StarUtil.java
+++ b/util/stellar/src/main/java/org/useless/stellar/StarUtil.java
@@ -102,7 +102,7 @@ public class StarUtil {
 
             glBegin(GL_QUADS);
 
-            final int startOffset = 1000;
+            final int startOffset = 1500;
             final int tempRange = 17500;
             final int bandWidth = 4;
             final int iterations = tempRange/bandWidth;
