diff --git a/src/common/resources/lang/en_US/options.lang b/src/common/resources/lang/en_US/options.lang
index 5ddc13e90..05c5b165e 100644
--- a/src/common/resources/lang/en_US/options.lang
+++ b/src/common/resources/lang/en_US/options.lang
@@ -233,6 +233,8 @@ key.sprint=Sprint (if enabled)
 key.toggleDebug=Toggle Debug
 key.toggleOverlay=Toggle Overlays
 key.sortInventory=Sort Inventory
+key.openAchievements=Open Achievements Menu
+key.openStatistics=Open Statistics Menu
 key.disabled=Disabled
 key.debug.textureAtlas=Show Texture Atlas
 key.debug.reload=Reload textures
diff --git a/src/main/java/net/minecraft/client/GameResolution.java b/src/main/java/net/minecraft/client/GameResolution.java
deleted file mode 100644
index 85b24e0b4..000000000
--- a/src/main/java/net/minecraft/client/GameResolution.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package net.minecraft.client;
-
-import static java.lang.Math.*;
-
-public class GameResolution {
-	
-	public static int defaultWidth = 854;
-	public static int defaultHeight = 480;
-	
-	public final Minecraft minecraft;
-	
-	//The actual size of the game window
-	public int width;
-	public int height;
-	
-	//Used GUI scale
-	public int scale;
-	
-	//GUI size
-	public int scaledWidth;
-	public int scaledHeight;
-	
-	//Exact size (Used so the GUI doesn't get stretched, used by glOrtho)
-	public double scaledWidthExact;
-	public double scaledHeightExact;
-	
-	public GameResolution(Minecraft minecraft) {
-		this.minecraft = minecraft;
-	}
-	
-	public void update() {
-		this.width = minecraft.gameWindow.getWidth();
-		this.height = minecraft.gameWindow.getHeight();
-		
-		setSize(width, height);
-		
-		if(minecraft.controllerInput != null) {
-			minecraft.controllerInput.cursorX = scaledWidth / 2f;
-			minecraft.controllerInput.cursorY = scaledHeight / 2f;
-		}
-	}
-	
-	public void setSize(int w, int h) {
-		//Prevent crashes I guess
-		width = max(w, 1);
-		height = max(h, 1);
-		
-		scale = getMaxScale(width, height);
-		int setScale = getSetGuiScale();
-		if(setScale > 0) scale = Math.min(scale, setScale);
-		
-		double dscale = scale;
-		
-		this.scaledWidthExact = width / dscale;
-		this.scaledHeightExact = height / dscale;
-		
-		//Ceil so the GUI fills the entire screen
-		this.scaledWidth = (int) ceil(scaledWidthExact);
-		this.scaledHeight = (int) ceil(scaledHeightExact);
-		
-		//Prevent crashes I guess
-		scaledWidth = max(scaledWidth, 1);
-		scaledHeight = max(scaledHeight, 1);
-	}
-	
-	public int getSetGuiScale() {
-		if(minecraft.gameSettings != null) {
-			return minecraft.gameSettings.guiScale.value;
-		}else {
-			return 0;
-		}
-	}
-	
-	public int getMaxScale() {
-		return getMaxScale(width, height);
-	}
-	
-	public static int getMaxScale(int width, int height) {
-		//Minimum of game window size divided by 320 x 240, not less than 1
-		return max(min(width / 320, height / 240), 1);
-	}
-	
-}
diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
index 030fc07fc..73400c5fa 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -19,6 +19,8 @@ import java.util.*;
 import com.mojang.logging.LogUtils;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.client.entity.ClientSkinVariantList;
+import net.minecraft.client.gui.*;
+import net.minecraft.client.gui.achievements.AchievementsScreen;
 import net.minecraft.client.gui.toasts.HudToastsElement;
 import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.util.helper.LoggedPrintStream;
@@ -43,26 +45,9 @@ import org.lwjgl.opengl.GL11;
 import net.minecraft.client.discord.RichPresenceHandlerThread;
 import net.minecraft.client.entity.player.LocalPlayer;
 import net.minecraft.client.entity.player.MultiplayerLocalPlayer;
-import net.minecraft.client.gui.BadJavaArchScreen;
-import net.minecraft.client.gui.ChatScreen;
-import net.minecraft.client.gui.ConflictWarningScreen;
-import net.minecraft.client.gui.ConnectingScreen;
-import net.minecraft.client.gui.CreateWorldScreen;
-import net.minecraft.client.gui.ExceptionPopupElement;
-import net.minecraft.client.gui.GameOverScreen;
 import net.minecraft.client.gui.hud.IngameHud;
-import net.minecraft.client.gui.PauseScreen;
 import net.minecraft.client.gui.container.InventoryScreen;
 import net.minecraft.client.gui.container.InventoryScreenCreative;
-import net.minecraft.client.gui.MainMenuScreen;
-import net.minecraft.client.gui.MissingMinecraftScreen;
-import net.minecraft.client.gui.OutOfMemoryScreen;
-import net.minecraft.client.gui.PhotoModeScreen;
-import net.minecraft.client.gui.Screen;
-import net.minecraft.client.gui.SelectWorldScreen;
-import net.minecraft.client.gui.SleepScreenMP;
-import net.minecraft.client.gui.SleepScreenSP;
-import net.minecraft.client.gui.MainMenuBackground;
 import net.minecraft.client.gui.modelviewer.ModelViewerScreen;
 import net.minecraft.client.gui.popup.PopupScreen;
 import net.minecraft.client.input.InputDevice;
@@ -253,7 +238,7 @@ public class Minecraft
     protected boolean toggleFlyPressed = false;
     protected long flyPressedTime = 0;
     public float hotbarSwapAnimationProgress = 0.0f;
-    public final GameResolution resolution = new GameResolution(this);
+    public ScaledResolution resolution;
     public final ClientCommandHandler commandHandler = new ClientCommandHandler(this);
     public boolean fullbright = false;
     public Renderer renderer;
@@ -278,6 +263,7 @@ public class Minecraft
     public Minecraft(GameWindow gameWindow)
     {
     	this.gameWindow = gameWindow;
+        this.resolution = new ScaledResolution(this.gameWindow);
     	
         Global.accessor = this;
         LoggedPrintStream.wrapStreams();
@@ -426,17 +412,15 @@ public class Minecraft
 
 		gameSettings = new GameSettings(this, mcDataDir);
 
-		GameResolution.defaultWidth = gameSettings.windowWidth.value;
-		GameResolution.defaultHeight = gameSettings.windowHeight.value;
-
-        LOGGER.info("Resolution: {} x {}", GameResolution.defaultWidth, GameResolution.defaultHeight);
         LOGGER.info("Java Version: {}", System.getProperty("java.version"));
 
 		printWrongJavaVersionInfo();
 		
-		gameWindow.init(this);
+		gameWindow.init(this, gameSettings.windowWidth.value, gameSettings.windowHeight.value);
+
+        LOGGER.info("Resolution: {} x {}", gameWindow.getWidthPixels(), gameWindow.getHeightPixels());
 
-		resolution.update();
+        resolution.setScale(gameSettings.guiScale.value);
 
 		saveFormat = new SaveFormat19134(new File(mcDataDir, "saves"));
 		I18n.initialize(gameSettings.language.value);
@@ -445,8 +429,7 @@ public class Minecraft
 			gameSettings.fullscreen.value = false;
 		}
 
-		resolution.getSetGuiScale();
-		resolution.update();
+        resolution.setScale(gameSettings.guiScale.value);
 		
         OpenGLHelper.testCapabilities(this);
         
@@ -531,7 +514,7 @@ public class Minecraft
         
         TextureRegistry.blockAtlas.bind();
         renderGlobal = new RenderGlobal(this, textureManager);
-        glViewport(0, 0, resolution.width, resolution.height);
+        glViewport(0, 0, gameWindow.getWidthPixels(), gameWindow.getHeightPixels());
         particleEngine = new ParticleEngine(theWorld);
         try
         {
@@ -654,11 +637,11 @@ public class Minecraft
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
         glMatrixMode(GL11.GL_PROJECTION);
         glLoadIdentity();
-        glOrtho(0.0D, resolution.scaledWidthExact, resolution.scaledHeightExact, 0.0D, 1000D, 3000D);
+        glOrtho(0.0D, resolution.getExactScaledWidthScreenCoords(), resolution.getExactScaledHeightScreenCoords(), 0.0D, 1000D, 3000D);
         glMatrixMode(GL11.GL_MODELVIEW);
         glLoadIdentity();
         glTranslatef(0.0F, 0.0F, -2000F);
-        glViewport(0, 0, resolution.width, resolution.height);
+        glViewport(0, 0, gameWindow.getWidthPixels(), gameWindow.getHeightPixels());
         glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
         Tessellator tessellator = Tessellator.instance;
         glDisable(GL11.GL_LIGHTING);
@@ -672,9 +655,9 @@ public class Minecraft
         
         tessellator.startDrawingQuads();
         tessellator.setColorOpaque_I(0xffffff);
-        tessellator.addVertexWithUV(0.0D, resolution.height, 0.0D, 0.0D, 0.0D);
-        tessellator.addVertexWithUV(resolution.width, resolution.height, 0.0D, 0.0D, 0.0D);
-        tessellator.addVertexWithUV(resolution.width, 0.0D, 0.0D, 0.0D, 0.0D);
+        tessellator.addVertexWithUV(0.0D, gameWindow.getHeightPixels(), 0.0D, 0.0D, 0.0D);
+        tessellator.addVertexWithUV(gameWindow.getWidthPixels(), gameWindow.getHeightPixels(), 0.0D, 0.0D, 0.0D);
+        tessellator.addVertexWithUV(gameWindow.getWidthPixels(), 0.0D, 0.0D, 0.0D, 0.0D);
         tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
         tessellator.draw();
         
@@ -683,7 +666,7 @@ public class Minecraft
         
         glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         
-        drawMojangLogoVertices((resolution.scaledWidth - width) / 2, (resolution.scaledHeight - height) / 2, 0, 0, width, height);
+        drawMojangLogoVertices((resolution.getScaledWidthScreenCoords() - width) / 2, (resolution.getScaledHeightScreenCoords() - height) / 2, 0, 0, width, height);
         
         glDisable(GL11.GL_LIGHTING);
         glDisable(GL11.GL_FOG);
@@ -802,8 +785,8 @@ public class Minecraft
         {
             if(controllerInput != null)
             {
-                controllerInput.cursorX = resolution.scaledWidth / 2D;
-                controllerInput.cursorY = resolution.scaledHeight / 2D;
+                controllerInput.cursorX = resolution.getScaledWidthScreenCoords() / 2D;
+                controllerInput.cursorY = resolution.getScaledHeightScreenCoords() / 2D;
             }
         }
         if(currentScreen != null)
@@ -833,7 +816,7 @@ public class Minecraft
         if(screen != null)
         {
             setIngameNotInFocus();
-            screen.init(this, resolution.scaledWidth, resolution.scaledHeight);
+            screen.init(this, resolution.getScaledWidthScreenCoords(), resolution.getScaledHeightScreenCoords());
             skipRenderWorld = false;
         } else
         {
@@ -1106,7 +1089,7 @@ public class Minecraft
 						}
 					}
 				}else {
-					ingameHud.addChatMessage(ScreenShot.saveScreenshot(minecraftDir, resolution.width, resolution.height));
+					ingameHud.addChatMessage(ScreenShot.saveScreenshot(minecraftDir, gameWindow.getWidthPixels(), gameWindow.getHeightPixels()));
 				}
 				Debug.pop();
 			}
@@ -1313,9 +1296,9 @@ public class Minecraft
 
     public void resize()
     {
-        resolution.update();
+        resolution.setScale(gameSettings.guiScale.value);
         if(currentScreen != null) {
-            currentScreen.init(this, resolution.scaledWidth, resolution.scaledHeight);
+            currentScreen.init(this, resolution.getScaledWidthScreenCoords(), resolution.getScaledHeightScreenCoords());
         }
     }
 
@@ -1937,6 +1920,16 @@ public class Minecraft
         	worldRenderer.zooming = false;
         	return true;
         }
+
+        // Open Achievements
+        if (gameSettings.keyOpenAchievements.isPressEvent(currentInputDevice)) {
+            displayScreen(new AchievementsScreen(null, statsCounter));
+        }
+
+        // Open Statistics
+        if (gameSettings.keyOpenStatistics.isPressEvent(currentInputDevice)) {
+            displayScreen(new StatsScreen(null, statsCounter));
+        }
         
         return false;
     }
diff --git a/src/main/java/net/minecraft/client/ScaledResolution.java b/src/main/java/net/minecraft/client/ScaledResolution.java
new file mode 100644
index 000000000..c20cee447
--- /dev/null
+++ b/src/main/java/net/minecraft/client/ScaledResolution.java
@@ -0,0 +1,82 @@
+package net.minecraft.client;
+
+import net.minecraft.client.render.window.GameWindow;
+
+import static java.lang.Math.*;
+
+public class ScaledResolution {
+	private final GameWindow gameWindow;
+
+	// GUI size
+	private int scaledWidth;
+	private int scaledHeight;
+	
+	//Exact size (Used so the GUI doesn't get stretched, used by glOrtho)
+	private double scaledWidthExact;
+	private double scaledHeightExact;
+
+	private int scale = 1;
+	
+	public ScaledResolution(GameWindow gameWindow) {
+		this.gameWindow = gameWindow;
+	}
+
+	public int getScale() {
+		return scale;
+	}
+
+	public int getWidthScreenCoords() {
+		return this.gameWindow.getWidthScreenCoords();
+	}
+
+	public int getHeightScreenCoords() {
+		return this.gameWindow.getHeightScreenCoords();
+	}
+
+	public int getScaledWidthScreenCoords() {
+		return scaledWidth;
+	}
+
+	public int getScaledHeightScreenCoords() {
+		return scaledHeight;
+	}
+
+	public double getExactScaledWidthScreenCoords() {
+		return scaledWidthExact;
+	}
+
+	public double getExactScaledHeightScreenCoords() {
+		return scaledHeightExact;
+	}
+	
+	public void setScale(int scale) {
+		int width = getWidthScreenCoords();
+		int height = getHeightScreenCoords();
+		
+		int maxScale = getMaxScale(width, height);
+		if (scale == 0) {
+			scale = maxScale;
+		} else {
+			scale = Math.min(maxScale, scale);
+		}
+
+		double dscale = scale;
+		this.scaledWidthExact = width / dscale;
+		this.scaledHeightExact = height / dscale;
+		
+		// Ceil so the GUI fills the entire screen
+		this.scaledWidth = (int) ceil(scaledWidthExact);
+		this.scaledHeight = (int) ceil(scaledHeightExact);
+		
+		scaledWidth = max(scaledWidth, 1);
+		scaledHeight = max(scaledHeight, 1);
+
+		this.scale = scale;
+	}
+
+	public static int getMaxScale(int width, int height) {
+		//Minimum of game window size divided by 320 x 240, not less than 1
+		return max(min(width / 320, height / 240), 1);
+	}
+	
+}
diff --git a/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java b/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java
index 81b614e77..5fd55fda4 100644
--- a/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java
+++ b/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java
@@ -17,7 +17,7 @@ import java.util.Map;
 public class ExceptionPopupElement {
 
     public static PopupScreen create(Screen parent, Throwable e, Minecraft mc){
-        int scale = Math.max(mc.resolution.scale,1);
+        int scale = Math.max(mc.resolution.getScale(),1);
         StringBuilder s = new StringBuilder("Minecraft ran into an unexpected problem!\n\n");
         s.append("To prevent more problems, the current game has quit, but you can try to keep playing.\n\n");
         s.append("If you wish to report this, please copy this entire text and post it on the forum thread at ")
@@ -60,7 +60,7 @@ public class ExceptionPopupElement {
     }
 
     public static PopupScreen createFatal(Throwable e, Minecraft mc){
-        int scale = Math.max(mc.resolution.scale,1);
+        int scale = Math.max(mc.resolution.getScale(),1);
         StringBuilder s = new StringBuilder("Minecraft ran into an unexpected problem that it cannot recover from!\n\n");
         s.append("The current game has quit, please restart the game.\n\n");
         s.append("If you wish to report this, please copy this entire text and post it on the forum thread at ")
@@ -105,7 +105,7 @@ public class ExceptionPopupElement {
     }
 
     public static PopupScreen createStartupError(Throwable e, Minecraft mc){
-        int scale = Math.max(mc.resolution.scale,1);
+        int scale = Math.max(mc.resolution.getScale(),1);
         StringBuilder s = new StringBuilder("An error has prevented Minecraft from starting up correctly!\n\n");
         s.append("The game cannot continue, please restart the game.\n\n");
         s.append("If you wish to report this, please copy this entire text and post it on the forum thread at ")
diff --git a/src/main/java/net/minecraft/client/gui/MainMenuBackground.java b/src/main/java/net/minecraft/client/gui/MainMenuBackground.java
index 3758e1822..12d80c1fc 100644
--- a/src/main/java/net/minecraft/client/gui/MainMenuBackground.java
+++ b/src/main/java/net/minecraft/client/gui/MainMenuBackground.java
@@ -129,8 +129,8 @@ public class MainMenuBackground {
 
 		int border = 1;
 
-		int displayWidth = mc.resolution.scaledWidth;
-		int displayHeight = mc.resolution.scaledHeight;
+		int displayWidth = mc.resolution.getScaledWidthScreenCoords();
+		int displayHeight = mc.resolution.getScaledHeightScreenCoords();
 		
 		int imageWidth = background.width - 2 * border;
 		int imageHeight = background.height - 2 * border;
diff --git a/src/main/java/net/minecraft/client/gui/MainMenuScreen.java b/src/main/java/net/minecraft/client/gui/MainMenuScreen.java
index c6b61ee89..4edcdc490 100644
--- a/src/main/java/net/minecraft/client/gui/MainMenuScreen.java
+++ b/src/main/java/net/minecraft/client/gui/MainMenuScreen.java
@@ -378,9 +378,10 @@ public class MainMenuScreen extends Screen
         GL11.glMatrixMode(GL11.GL_PROJECTION);
         GL11.glPushMatrix();
         GL11.glLoadIdentity();
-        var3 = 120 * mc.resolution.scale;
-        GLU.gluPerspective(70.0F, (float)this.mc.resolution.width / (float)var3, 0.05F, 100.0F);
-        GL11.glViewport(0, this.mc.resolution.height - var3, this.mc.resolution.width, var3);
+        int delta = mc.gameWindow.getWidthPixels() / mc.resolution.getScaledWidthScreenCoords();
+        var3 = 120 * delta;
+        GLU.gluPerspective(70.0F, (float)this.mc.gameWindow.getWidthPixels() / (float)var3, 0.05F, 100.0F);
+        GL11.glViewport(0, this.mc.gameWindow.getHeightPixels() - var3, this.mc.gameWindow.getWidthPixels(), var3);
         GL11.glMatrixMode(GL11.GL_MODELVIEW);
         GL11.glPushMatrix();
         GL11.glLoadIdentity();
@@ -452,7 +453,7 @@ public class MainMenuScreen extends Screen
         GL11.glPopMatrix();
         GL11.glMatrixMode(GL11.GL_MODELVIEW);
         GL11.glPopMatrix();
-        GL11.glViewport(0, 0, this.mc.resolution.width, this.mc.resolution.height);
+        GL11.glViewport(0, 0, this.mc.gameWindow.getWidthPixels(), this.mc.gameWindow.getHeightPixels());
         GL11.glEnable(GL11.GL_CULL_FACE);
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/PaintingPickerScreen.java b/src/main/java/net/minecraft/client/gui/PaintingPickerScreen.java
index 3361b836f..7031ba613 100644
--- a/src/main/java/net/minecraft/client/gui/PaintingPickerScreen.java
+++ b/src/main/java/net/minecraft/client/gui/PaintingPickerScreen.java
@@ -174,7 +174,7 @@ public class PaintingPickerScreen
     }
     public int getScale(int width, int height)
     {
-        return Math.min((int)((height * 0.9f)/tallestSize), mc.resolution.scale);
+        return Math.min((int)((height * 0.9f)/tallestSize), mc.resolution.getScale());
     }
 
     private static final class ArtEntry
diff --git a/src/main/java/net/minecraft/client/gui/PhotoModeScreen.java b/src/main/java/net/minecraft/client/gui/PhotoModeScreen.java
index ec048745e..7690118f9 100644
--- a/src/main/java/net/minecraft/client/gui/PhotoModeScreen.java
+++ b/src/main/java/net/minecraft/client/gui/PhotoModeScreen.java
@@ -322,7 +322,7 @@ public class PhotoModeScreen extends Screen
     @Override
     public void render(int xm, int ym, float partialTick)
     {
-        GL11.glViewport(0, 0, mc.resolution.width, mc.resolution.height);
+        GL11.glViewport(0, 0, mc.gameWindow.getWidthPixels(), mc.gameWindow.getHeightPixels());
         GL11.glMatrixMode(GL11.GL_PROJECTION);
         GL11.glLoadIdentity();
         GL11.glMatrixMode(GL11.GL_MODELVIEW);
@@ -330,7 +330,7 @@ public class PhotoModeScreen extends Screen
         GL11.glClear(256);
         GL11.glMatrixMode(GL11.GL_PROJECTION);
         GL11.glLoadIdentity();
-        GL11.glOrtho(0.0D, mc.resolution.scaledWidth, mc.resolution.scaledHeight, 0.0D, 1000D, 3000D);
+        GL11.glOrtho(0.0D, mc.resolution.getExactScaledWidthScreenCoords(), mc.resolution.getExactScaledHeightScreenCoords(), 0.0D, 1000D, 3000D);
         GL11.glMatrixMode(GL11.GL_MODELVIEW);
         GL11.glLoadIdentity();
         GL11.glTranslatef(0.0F, 0.0F, -2000F);
@@ -390,7 +390,7 @@ public class PhotoModeScreen extends Screen
         }
         else
         {
-            ScreenShot.saveScreenshot(Global.accessor.getMinecraftDir(), mc.resolution.width, mc.resolution.height);
+            ScreenShot.saveScreenshot(Global.accessor.getMinecraftDir(), mc.gameWindow.getWidthPixels(), mc.gameWindow.getHeightPixels());
             shouldScreenshot = false;
         }
         scroll(Mouse.getDWheel());
diff --git a/src/main/java/net/minecraft/client/gui/Screen.java b/src/main/java/net/minecraft/client/gui/Screen.java
index 154e71dc7..e0f15a306 100644
--- a/src/main/java/net/minecraft/client/gui/Screen.java
+++ b/src/main/java/net/minecraft/client/gui/Screen.java
@@ -108,8 +108,8 @@ public abstract class Screen extends Gui {
     }
 
     public void updateEvents() {
-        int mouseX = (Mouse.getEventX() * width) / mc.resolution.width;
-        int mouseY = height - (Mouse.getEventY() * height) / mc.resolution.height - 1;
+        int mouseX = (Mouse.getEventX() * width) / mc.resolution.getWidthScreenCoords();
+        int mouseY = height - (Mouse.getEventY() * height) / mc.resolution.getHeightScreenCoords() - 1;
 
         while (Mouse.next()) {
             if (mc.inputType == InputType.CONTROLLER) break;
diff --git a/src/main/java/net/minecraft/client/gui/TooltipElement.java b/src/main/java/net/minecraft/client/gui/TooltipElement.java
index 54353f1d0..a323d73db 100644
--- a/src/main/java/net/minecraft/client/gui/TooltipElement.java
+++ b/src/main/java/net/minecraft/client/gui/TooltipElement.java
@@ -45,13 +45,13 @@ public class TooltipElement extends Gui
         int height = lines.length * 8 + (lines.length - 1) * LINE_SPACING;
 
         // Flip tooltip X if it goes offscreen to the right
-        if(x + offsetX + width + BASE_PADDING * 2 > mc.resolution.scaledWidth)
+        if(x + offsetX + width + BASE_PADDING * 2 > mc.resolution.getScaledWidthScreenCoords())
         {
             offsetX = -offsetX - width;
         }
 
         // Move tooltip up when it goes offscreen to the bottom
-        offsetY -= Math.max(0, y + height + offsetY + BASE_PADDING * 2 - mc.resolution.scaledHeight);
+        offsetY -= Math.max(0, y + height + offsetY + BASE_PADDING * 2 - mc.resolution.getScaledHeightScreenCoords());
 
 
         x += offsetX;
@@ -78,7 +78,7 @@ public class TooltipElement extends Gui
     public int[] drawBackground(int x, int y, int offsetX, int offsetY, int width, int height){
         int targetOffset = 0;
         // Flip tooltip X if it goes offscreen to the right
-        if(x + offsetX + width + BASE_PADDING * 2 > mc.resolution.scaledWidth)
+        if(x + offsetX + width + BASE_PADDING * 2 > mc.resolution.getScaledWidthScreenCoords())
         {
             int _offsetX = offsetX;
             offsetX = -offsetX - width;
@@ -86,7 +86,7 @@ public class TooltipElement extends Gui
         }
 
         // Move tooltip up when it goes offscreen to the bottom
-        offsetY -= Math.max(0, y + height + offsetY + BASE_PADDING * 2 - mc.resolution.scaledHeight);
+        offsetY -= Math.max(0, y + height + offsetY + BASE_PADDING * 2 - mc.resolution.getScaledHeightScreenCoords());
 
         x += offsetX;
         y += offsetY;
diff --git a/src/main/java/net/minecraft/client/gui/hud/DoomIngameHud.java b/src/main/java/net/minecraft/client/gui/hud/DoomIngameHud.java
index a736165e0..73e6788cb 100644
--- a/src/main/java/net/minecraft/client/gui/hud/DoomIngameHud.java
+++ b/src/main/java/net/minecraft/client/gui/hud/DoomIngameHud.java
@@ -30,8 +30,8 @@ public class DoomIngameHud
     {
         if (mc.currentScreen instanceof PhotoModeScreen) return;
 
-        int width = mc.resolution.scaledWidth;
-        int height = mc.resolution.scaledHeight;
+        int width = mc.resolution.getScaledWidthScreenCoords();
+        int height = mc.resolution.getScaledHeightScreenCoords();
 
         mc.worldRenderer.setupScaledResolution();
 
@@ -81,8 +81,8 @@ public class DoomIngameHud
 
     private void drawBackground()
     {
-        int width = mc.resolution.scaledWidth;
-        int height = mc.resolution.scaledHeight;
+        int width = mc.resolution.getScaledWidthScreenCoords();
+        int height = mc.resolution.getScaledHeightScreenCoords();
 
         GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
         mc.textureManager.loadTexture("/assets/minecraft/textures/gui/hud/doom.png").bind();
@@ -98,8 +98,8 @@ public class DoomIngameHud
 
     private void drawFace()
     {
-        int width = mc.resolution.scaledWidth;
-        int height = mc.resolution.scaledHeight;
+        int width = mc.resolution.getScaledWidthScreenCoords();
+        int height = mc.resolution.getScaledHeightScreenCoords();
 
         Face face = Face.NEUTRAL;
         if (mc.thePlayer.getGamemode().isPlayerInvulnerable())
@@ -128,8 +128,8 @@ public class DoomIngameHud
 
     private void drawAmmo()
     {
-        int width = mc.resolution.scaledWidth;
-        int height = mc.resolution.scaledHeight;
+        int width = mc.resolution.getScaledWidthScreenCoords();
+        int height = mc.resolution.getScaledHeightScreenCoords();
 
         ItemStack stack = mc.thePlayer.getHeldItem();
         if (stack == null) return;
@@ -140,8 +140,8 @@ public class DoomIngameHud
 
     private void drawHealth()
     {
-        int width = mc.resolution.scaledWidth;
-        int height = mc.resolution.scaledHeight;
+        int width = mc.resolution.getScaledWidthScreenCoords();
+        int height = mc.resolution.getScaledHeightScreenCoords();
 
         float healthPercentage = mc.thePlayer.getHealth() / (float)mc.thePlayer.getMaxHealth();
         int health = (int)(healthPercentage * 100);
@@ -181,8 +181,8 @@ public class DoomIngameHud
 
     private void drawArmsButtons()
     {
-        int width = mc.resolution.scaledWidth;
-        int height = mc.resolution.scaledHeight;
+        int width = mc.resolution.getScaledWidthScreenCoords();
+        int height = mc.resolution.getScaledHeightScreenCoords();
 
         int i = 1;
         int activeSlot = mc.thePlayer.inventory.currentItem % 9;
@@ -223,8 +223,8 @@ public class DoomIngameHud
 
     private void drawArmor()
     {
-        int width = mc.resolution.scaledWidth;
-        int height = mc.resolution.scaledHeight;
+        int width = mc.resolution.getScaledWidthScreenCoords();
+        int height = mc.resolution.getScaledHeightScreenCoords();
 
         float armorPercentage = mc.thePlayer.getPlayerProtectionAmount() / 20f;
         int armor = (int)(armorPercentage * 100);
@@ -237,8 +237,8 @@ public class DoomIngameHud
 //        GL11.glColor4f(1f, 1f, 1f, 1f);
 //        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/doom.png"));
 
-        int width = mc.resolution.scaledWidth;
-        int height = mc.resolution.scaledHeight;
+        int width = mc.resolution.getScaledWidthScreenCoords();
+        int height = mc.resolution.getScaledHeightScreenCoords();
 
         int x = width / 2 + 76;
         int y = height - 36;
@@ -250,8 +250,8 @@ public class DoomIngameHud
 
     private void drawStacks()
     {
-        int width = mc.resolution.scaledWidth;
-        int height = mc.resolution.scaledHeight;
+        int width = mc.resolution.getScaledWidthScreenCoords();
+        int height = mc.resolution.getScaledHeightScreenCoords();
 
         int currentItem = mc.thePlayer.inventory.currentItem;
         int wrappedCurrentItem = mc.thePlayer.inventory.currentItem % 9;
diff --git a/src/main/java/net/minecraft/client/gui/hud/IngameHud.java b/src/main/java/net/minecraft/client/gui/hud/IngameHud.java
index 81ef82248..49aea0227 100644
--- a/src/main/java/net/minecraft/client/gui/hud/IngameHud.java
+++ b/src/main/java/net/minecraft/client/gui/hud/IngameHud.java
@@ -83,8 +83,8 @@ public class IngameHud extends Gui
         if (mc.currentScreen instanceof PhotoModeScreen) return;
 
         I18n stringtranslate = I18n.getInstance();
-        int width = mc.resolution.scaledWidth;
-        int height = mc.resolution.scaledHeight;
+        int width = mc.resolution.getScaledWidthScreenCoords();
+        int height = mc.resolution.getScaledHeightScreenCoords();
         int sp = (int) (mc.gameSettings.screenPadding.value * height / 8);
         Font font = mc.font;
         mc.worldRenderer.setupScaledResolution();
@@ -210,7 +210,7 @@ public class IngameHud extends Gui
                 drawDebugScreenLineRight(GL11.glGetString(GL11.GL_VENDOR));
                 drawDebugScreenLineRight(GL11.glGetString(GL11.GL_RENDERER));
                 drawDebugScreenLineRight(GL11.glGetString(GL11.GL_VERSION));
-                drawDebugScreenLineRight("Resolution: " + mc.resolution.width + "x" + mc.resolution.height);
+                drawDebugScreenLineRight("Resolution: " + mc.gameWindow.getWidthPixels() + "x" + mc.gameWindow.getHeightPixels());
                 drawDebugScreenLineRight("Render Resolution: " + mc.renderer.getRenderWidth() + "x" + mc.renderer.getRenderHeight());
                 
                 drawDebugScreenLine("Better than Adventure! " + Minecraft.VERSION);
@@ -644,7 +644,7 @@ public class IngameHud extends Gui
     {
         int width = font.getStringWidth(string);
         int height = debugLineHeight;
-        int x = right ? mc.resolution.scaledWidth - width - 2 : 2;
+        int x = right ? mc.resolution.getScaledWidthScreenCoords() - width - 2 : 2;
         int y = 3 + line * debugLineHeight + offset;
 
         glDisable(GL_TEXTURE_2D);
diff --git a/src/main/java/net/minecraft/client/gui/hud/component/layout/AbsoluteLayout.java b/src/main/java/net/minecraft/client/gui/hud/component/layout/AbsoluteLayout.java
index 21c1a17b0..07e10764a 100644
--- a/src/main/java/net/minecraft/client/gui/hud/component/layout/AbsoluteLayout.java
+++ b/src/main/java/net/minecraft/client/gui/hud/component/layout/AbsoluteLayout.java
@@ -42,13 +42,13 @@ public class AbsoluteLayout
 
     @Override
     public int getComponentX(Minecraft mc, HudComponent component, int xSizeScreen) {
-        int sp = (int) (mc.gameSettings.screenPadding.value * mc.resolution.scaledHeight / 8);
+        int sp = (int) (mc.gameSettings.screenPadding.value * mc.resolution.getScaledWidthScreenCoords() / 8);
         return (int) (xPosition * xSizeScreen) - component.getAnchorX(anchor) + sp;
     }
 
     @Override
     public int getComponentY(Minecraft mc, HudComponent component, int ySizeScreen) {
-        int sp = (int) (mc.gameSettings.screenPadding.value * mc.resolution.scaledHeight / 8);
+        int sp = (int) (mc.gameSettings.screenPadding.value * mc.resolution.getScaledHeightScreenCoords() / 8);
         return (int) (yPosition * ySizeScreen) - component.getAnchorY(anchor) + sp;
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/hud/component/layout/SnapLayout.java b/src/main/java/net/minecraft/client/gui/hud/component/layout/SnapLayout.java
index f86a493a2..0f1cc5f93 100644
--- a/src/main/java/net/minecraft/client/gui/hud/component/layout/SnapLayout.java
+++ b/src/main/java/net/minecraft/client/gui/hud/component/layout/SnapLayout.java
@@ -44,7 +44,7 @@ public class SnapLayout
     @Override
     public int getComponentX(Minecraft mc, HudComponent component, int xSizeScreen) {
         if (parent == null) {
-            int sp = (int) (mc.gameSettings.screenPadding.value * mc.resolution.scaledHeight / 8);
+            int sp = (int) (mc.gameSettings.screenPadding.value * mc.resolution.getScaledWidthScreenCoords() / 8);
             return (int) (xSizeScreen * parentAnchor.xPosition) - component.getAnchorX(anchor) + sp;
         }
         return parent.getLayout().getComponentX(mc, parent, xSizeScreen) - component.getAnchorX(anchor) + parent.getAnchorX(parentAnchor);
@@ -53,7 +53,7 @@ public class SnapLayout
     @Override
     public int getComponentY(Minecraft mc, HudComponent component, int ySizeScreen) {
         if (parent == null) {
-            int sp = (int) (mc.gameSettings.screenPadding.value * mc.resolution.scaledHeight / 8);
+            int sp = (int) (mc.gameSettings.screenPadding.value * mc.resolution.getScaledHeightScreenCoords() / 8);
             return (int) (ySizeScreen * parentAnchor.yPosition) - component.getAnchorY(anchor) + sp;
         }
         return parent.getLayout().getComponentY(mc, parent, ySizeScreen) - component.getAnchorY(anchor) + parent.getAnchorY(parentAnchor);
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/ModelViewerScreen.java b/src/main/java/net/minecraft/client/gui/modelviewer/ModelViewerScreen.java
index 388d47ef9..fa26cf0c9 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/ModelViewerScreen.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/ModelViewerScreen.java
@@ -318,7 +318,7 @@ public class ModelViewerScreen extends PhotoModeScreen implements ListenerTextFi
     @Override
     public void render(int xm, int ym, float partialTick)
     {
-        GL11.glViewport(0, 0, mc.resolution.width, mc.resolution.height);
+        GL11.glViewport(0, 0, mc.gameWindow.getWidthPixels(), mc.gameWindow.getHeightPixels());
         GL11.glMatrixMode(GL11.GL_PROJECTION);
         GL11.glLoadIdentity();
         GL11.glMatrixMode(GL11.GL_MODELVIEW /*GL_MODELVIEW0_ARB*/);
@@ -326,7 +326,7 @@ public class ModelViewerScreen extends PhotoModeScreen implements ListenerTextFi
         GL11.glClear(256);
         GL11.glMatrixMode(GL11.GL_PROJECTION);
         GL11.glLoadIdentity();
-        GL11.glOrtho(0.0D, mc.resolution.scaledWidth, mc.resolution.scaledHeight, 0.0D, 1000D, 3000D);
+        GL11.glOrtho(0.0D, mc.resolution.getExactScaledWidthScreenCoords(), mc.resolution.getExactScaledHeightScreenCoords(), 0.0D, 1000D, 3000D);
         GL11.glMatrixMode(GL11.GL_MODELVIEW /*GL_MODELVIEW0_ARB*/);
         GL11.glLoadIdentity();
         GL11.glTranslatef(0.0F, 0.0F, -2000F);
diff --git a/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
index bdd4fed5d..706121948 100644
--- a/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
+++ b/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
@@ -177,6 +177,8 @@ public abstract class OptionsPages
             .withComponent(new KeyBindingComponent(mc.gameSettings.keyGuidebook))
             .withComponent(new KeyBindingComponent(mc.gameSettings.keyShowRecipe))
             .withComponent(new KeyBindingComponent(mc.gameSettings.keyShowUsage))
+            .withComponent(new KeyBindingComponent(mc.gameSettings.keyOpenAchievements))
+            .withComponent(new KeyBindingComponent(mc.gameSettings.keyOpenStatistics))
             .withComponent(new KeyBindingComponent(mc.gameSettings.keyPlayerList))
             .withComponent(new KeyBindingComponent(mc.gameSettings.keyHideGui))
             .withComponent(new KeyBindingComponent(mc.gameSettings.keyToggleDebug))
diff --git a/src/main/java/net/minecraft/client/gui/toasts/HudToastsElement.java b/src/main/java/net/minecraft/client/gui/toasts/HudToastsElement.java
index 4109c35e2..5dbbe5dba 100644
--- a/src/main/java/net/minecraft/client/gui/toasts/HudToastsElement.java
+++ b/src/main/java/net/minecraft/client/gui/toasts/HudToastsElement.java
@@ -67,7 +67,7 @@ public class HudToastsElement extends Gui {
     }
 
     private void updateScale() {
-        GL11.glViewport(0, 0, mc.resolution.width, mc.resolution.height);
+        GL11.glViewport(0, 0, mc.gameWindow.getWidthPixels(), mc.gameWindow.getHeightPixels());
         GL11.glMatrixMode(GL11.GL_PROJECTION);
         GL11.glLoadIdentity();
         GL11.glMatrixMode(GL11.GL_MODELVIEW);
@@ -75,7 +75,7 @@ public class HudToastsElement extends Gui {
         GL11.glClear(256);
         GL11.glMatrixMode(GL11.GL_PROJECTION);
         GL11.glLoadIdentity();
-        GL11.glOrtho(0.0D, mc.resolution.scaledWidth, mc.resolution.scaledHeight, 0.0D, 1000D, 3000D);
+        GL11.glOrtho(0.0D, mc.resolution.getExactScaledWidthScreenCoords(), mc.resolution.getExactScaledHeightScreenCoords(), 0.0D, 1000D, 3000D);
         GL11.glMatrixMode(GL11.GL_MODELVIEW);
         GL11.glLoadIdentity();
         GL11.glTranslatef(0.0F, 0.0F, -2000F);
@@ -144,7 +144,7 @@ public class HudToastsElement extends Gui {
             }
             hideAmount *= hideAmount;
             hideAmount *= hideAmount;
-            int toastLeft = mc.resolution.scaledWidth - TOAST_WIDTH;
+            int toastLeft = mc.resolution.getScaledWidthScreenCoords() - TOAST_WIDTH;
             int toastTop = (int) (-hideAmount * TOAST_HEIGHT);
             if (toastTop < 0) {
                 Scissor.enable(toastLeft, yOff, TOAST_WIDTH, TOAST_HEIGHT);
diff --git a/src/main/java/net/minecraft/client/input/MouseInput.java b/src/main/java/net/minecraft/client/input/MouseInput.java
index 5a25e5b8a..e88669dda 100644
--- a/src/main/java/net/minecraft/client/input/MouseInput.java
+++ b/src/main/java/net/minecraft/client/input/MouseInput.java
@@ -22,12 +22,12 @@ public class MouseInput {
 	
 	public void grabCursor() {
 		Mouse.setGrabbed(true);
-		Mouse.setCursorPosition(minecraft.resolution.width / 2, minecraft.resolution.height / 2);
+		Mouse.setCursorPosition(minecraft.resolution.getWidthScreenCoords() / 2, minecraft.resolution.getHeightScreenCoords() / 2);
 	}
 	
 	public void releaseCursor() {
 		Mouse.setGrabbed(false);
-		Mouse.setCursorPosition(minecraft.resolution.width / 2, minecraft.resolution.height / 2);
+		Mouse.setCursorPosition(minecraft.resolution.getWidthScreenCoords() / 2, minecraft.resolution.getHeightScreenCoords() / 2);
 	}
 	
 	public void update() {
diff --git a/src/main/java/net/minecraft/client/input/controller/ControllerInput.java b/src/main/java/net/minecraft/client/input/controller/ControllerInput.java
index 080dfd0d2..1b3cfdd7a 100644
--- a/src/main/java/net/minecraft/client/input/controller/ControllerInput.java
+++ b/src/main/java/net/minecraft/client/input/controller/ControllerInput.java
@@ -122,8 +122,8 @@ public class ControllerInput {
         cursorX = Math.max(cursorX, 0);
         cursorY = Math.max(cursorY, 0);
 
-        cursorX = Math.min(cursorX, minecraft.resolution.scaledWidth);
-        cursorY = Math.min(cursorY, minecraft.resolution.scaledHeight);
+        cursorX = Math.min(cursorX, minecraft.resolution.getScaledWidthScreenCoords());
+        cursorY = Math.min(cursorY, minecraft.resolution.getScaledHeightScreenCoords());
     }
 
     public GlfwGamepad getController() {
@@ -154,8 +154,8 @@ public class ControllerInput {
             int mx = (int) cursorX;
             int my = (int) cursorY;
 
-            int slotX = (slot.x + (minecraft.resolution.scaledWidth - screen.xSize) / 2) - 2;
-            int slotY = (slot.y + (minecraft.resolution.scaledHeight - screen.ySize) / 2) - 2;
+            int slotX = (slot.x + (minecraft.resolution.getScaledWidthScreenCoords() - screen.xSize) / 2) - 2;
+            int slotY = (slot.y + (minecraft.resolution.getScaledHeightScreenCoords() - screen.ySize) / 2) - 2;
 
             if (mx > slotX && my > slotY && mx < slotX + 20 && my < slotY + 20) {
                 return slot;
@@ -171,8 +171,8 @@ public class ControllerInput {
     public void snapToSlot(AbstractContainerScreen screen, Slot slot) {
         if (slot == null) return;
 
-        int slotX = (slot.x + (minecraft.resolution.scaledWidth - screen.xSize) / 2) - 1;
-        int slotY = (slot.y + (minecraft.resolution.scaledHeight - screen.ySize) / 2) - 1;
+        int slotX = (slot.x + (minecraft.resolution.getScaledWidthScreenCoords() - screen.xSize) / 2) - 1;
+        int slotY = (slot.y + (minecraft.resolution.getScaledHeightScreenCoords() - screen.ySize) / 2) - 1;
 
         //Snap to Slot
         cursorX = slotX + 8;
diff --git a/src/main/java/net/minecraft/client/option/GameSettings.java b/src/main/java/net/minecraft/client/option/GameSettings.java
index 8449cfe20..e22ff9c99 100644
--- a/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -155,7 +155,6 @@ public class GameSettings {
 	public BooleanOption fullscreen = new BooleanOption(this, "fullscreen", false);
 	public BooleanOption borderlessFullscreen = new BooleanOption(this, "borderlessFullscreen", true);
 	public BooleanOption startInFullscreen = new BooleanOption(this, "startInFullscreen", true);
-	public BooleanOption osxFullscreenModeAPI = new BooleanOption(this, "osxFullscreenModeAPI", true);
 	public EnumOption<TooltipStyle> tooltipStyle = new EnumOption<>(this, "tooltipStyle", TooltipStyle.class);
 	public EnumOption<LightmapStyle> lightmapStyle = new EnumOption<>(this, "lightmapStyle", LightmapStyle.class, LightmapStyle.GRAY);
 	public BooleanOption customLightmap = new BooleanOption(this, "customLightmap", true);
@@ -217,6 +216,8 @@ public class GameSettings {
 	public KeyBinding keyAutoWalk = new KeyBinding("key.autoWalk");
 	public KeyBinding keySprint = new KeyBinding("key.sprint");
 	public KeyBinding keyToggleOverlay = new KeyBinding("key.toggleOverlay").setDefault(InputDevice.keyboard, KEY_F4);
+	public KeyBinding keyOpenAchievements = new KeyBinding("key.openAchievements");
+	public KeyBinding keyOpenStatistics = new KeyBinding("key.openStatistics");
 	public List<KeyBinding> debugsKeys = new ArrayList<>();
 	public KeyBinding keyToggleDebug = new KeyBinding("key.toggleDebug").setDefault(InputDevice.keyboard, KEY_F3);
 	public KeyBinding keyReload = new KeyBinding("key.debug.reload").setDefault(InputDevice.keyboard, KEY_R);
@@ -432,11 +433,11 @@ public class GameSettings {
 		if(option == fullscreen) mc.gameWindow.updateWindowState();
 		if(option == borderlessFullscreen && fullscreen.value) mc.gameWindow.updateWindowState();
 		if(option == guiScale) {
-			int max = mc.resolution.getMaxScale();
+			int max = mc.resolution.getMaxScale(mc.gameWindow.getWidthScreenCoords(), mc.gameWindow.getHeightScreenCoords());
 			guiScale.value = (guiScale.value + max) % max;
-			mc.resolution.update();
+			mc.resolution.setScale(guiScale.value);
 			if (mc.currentScreen != null) {
-				mc.currentScreen.init(mc, mc.resolution.scaledWidth, mc.resolution.scaledHeight);
+				mc.currentScreen.init(mc, mc.resolution.getScaledWidthScreenCoords(), mc.resolution.getScaledHeightScreenCoords());
 			}
 		}
 		if(option == mipmapType || option == mipmapLevels) {
@@ -456,7 +457,7 @@ public class GameSettings {
 		}
 		if(option == language) {
 			if (mc.currentScreen != null) {
-				mc.currentScreen.init(mc, mc.resolution.scaledWidth, mc.resolution.scaledHeight);
+				mc.currentScreen.init(mc, mc.resolution.getScaledWidthScreenCoords(), mc.resolution.getScaledHeightScreenCoords());
 			}
 		}
 		if(option == lightmapStyle) {
diff --git a/src/main/java/net/minecraft/client/render/FallbackRenderer.java b/src/main/java/net/minecraft/client/render/FallbackRenderer.java
index c1926da15..1084b93d6 100644
--- a/src/main/java/net/minecraft/client/render/FallbackRenderer.java
+++ b/src/main/java/net/minecraft/client/render/FallbackRenderer.java
@@ -57,12 +57,12 @@ public class FallbackRenderer implements Renderer {
 
 	@Override
 	public int getRenderWidth() {
-		return mc.resolution.width;
+		return mc.gameWindow.getWidthPixels();
 	}
 
 	@Override
 	public int getRenderHeight() {
-		return mc.resolution.height;
+		return mc.gameWindow.getHeightPixels();
 	}
 
 }
diff --git a/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java b/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java
index 88b56cca5..b65761693 100644
--- a/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java
+++ b/src/main/java/net/minecraft/client/render/LoadingScreenRenderer.java
@@ -98,7 +98,7 @@ public class LoadingScreenRenderer
             GL11.glClear(GL_DEPTH_BUFFER_BIT);
             GL11.glMatrixMode(GL_PROJECTION);
             GL11.glLoadIdentity();
-            GL11.glOrtho(0.0D, minecraft.resolution.scaledWidthExact, minecraft.resolution.scaledHeightExact, 0.0D, 100D, 300D);
+            GL11.glOrtho(0.0D, minecraft.resolution.getExactScaledWidthScreenCoords(), minecraft.resolution.getExactScaledHeightScreenCoords(), 0.0D, 100D, 300D);
             GL11.glMatrixMode(GL_MODELVIEW);
             GL11.glLoadIdentity();
             GL11.glTranslatef(0.0F, 0.0F, -200F);
@@ -161,12 +161,12 @@ public class LoadingScreenRenderer
     	glEnable(GL_ALPHA_TEST);
 
         // Set up background
-        int width = minecraft.resolution.scaledWidth;
-        int height = minecraft.resolution.scaledHeight;
+        int width = minecraft.resolution.getScaledWidthScreenCoords();
+        int height = minecraft.resolution.getScaledHeightScreenCoords();
         GL11.glDisable(GL11.GL_DEPTH_TEST);
         GL11.glMatrixMode(GL_PROJECTION);
         GL11.glLoadIdentity();
-        GL11.glOrtho(0.0D, minecraft.resolution.scaledWidthExact, minecraft.resolution.scaledHeightExact, 0.0D, 100D, 300D);
+        GL11.glOrtho(0.0D, minecraft.resolution.getExactScaledWidthScreenCoords(), minecraft.resolution.getExactScaledHeightScreenCoords(), 0.0D, 100D, 300D);
         GL11.glMatrixMode(GL_MODELVIEW);
         GL11.glLoadIdentity();
         GL11.glTranslatef(0.0F, 0.0F, -200F);
diff --git a/src/main/java/net/minecraft/client/render/Scissor.java b/src/main/java/net/minecraft/client/render/Scissor.java
index 98ce7458f..e339eb950 100644
--- a/src/main/java/net/minecraft/client/render/Scissor.java
+++ b/src/main/java/net/minecraft/client/render/Scissor.java
@@ -1,7 +1,8 @@
 package net.minecraft.client.render;
 
-import net.minecraft.client.GameResolution;
+import net.minecraft.client.ScaledResolution;
 import net.minecraft.client.Minecraft;
+import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
 
 import static org.lwjgl.opengl.GL11.GL_SCISSOR_TEST;
@@ -10,13 +11,15 @@ public abstract class Scissor {
 	private static Minecraft mc = Minecraft.getMinecraft(Scissor.class);
 	
     public static void enable(int x, int y, int xSize, int ySize) {
-        GameResolution resolution = mc.resolution;
-        int xScaled = x * resolution.scale;
-        int yScaled = resolution.height - ((y + ySize) * resolution.scale);
-        int xSizeScaled = xSize * resolution.scale;
-        int ySizeScaled = ySize * resolution.scale;
+        int xScale = MathHelper.floor(mc.gameWindow.getWidthPixels() / mc.resolution.getExactScaledWidthScreenCoords());
+        int yScale = MathHelper.floor(mc.gameWindow.getHeightPixels() / mc.resolution.getExactScaledHeightScreenCoords());
 
-        GL11.glScissor(xScaled, yScaled, xSizeScaled, ySizeScaled);
+        int xPixels = x * xScale;
+        int yPixels = mc.gameWindow.getHeightPixels() - ((y + ySize) * yScale);
+        int xSizePixels = xSize * xScale;
+        int ySizePixels = ySize * yScale;
+
+        GL11.glScissor(xPixels, yPixels, xSizePixels, ySizePixels);
         GL11.glEnable(GL_SCISSOR_TEST);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/TextureManager.java b/src/main/java/net/minecraft/client/render/TextureManager.java
index 6b60ab460..2cec7bbed 100644
--- a/src/main/java/net/minecraft/client/render/TextureManager.java
+++ b/src/main/java/net/minecraft/client/render/TextureManager.java
@@ -298,11 +298,11 @@ public class TextureManager {
         	String string = createErrorString(errors);
         	
         	if(mc.currentScreen != null) {
-                PopupBuilder builder = new PopupBuilder(mc.currentScreen, mc.resolution.scaledWidth - 40);
+                PopupBuilder builder = new PopupBuilder(mc.currentScreen, mc.resolution.getScaledWidthScreenCoords() - 40);
                 builder.closeOnClickOut(0);
                 builder.closeOnEnter(0);
                 builder.closeOnEsc(0);
-                builder.withMessageBox("what", mc.resolution.scaledHeight - 120, string, Integer.MAX_VALUE);
+                builder.withMessageBox("what", mc.resolution.getScaledHeightScreenCoords() - 120, string, Integer.MAX_VALUE);
                 builder.withButtonGroup("ok", new String[] {"gui.options.button.done"}, new int[] {0});
             	PopupScreen popup = builder.build();
             	
diff --git a/src/main/java/net/minecraft/client/render/WorldRenderer.java b/src/main/java/net/minecraft/client/render/WorldRenderer.java
index bda14c8c8..019e5ecd4 100644
--- a/src/main/java/net/minecraft/client/render/WorldRenderer.java
+++ b/src/main/java/net/minecraft/client/render/WorldRenderer.java
@@ -328,11 +328,11 @@ public class WorldRenderer
         {
             double div = java.lang.Math.pow(2, ((PhotoModeScreen)mc.currentScreen).getZoom(partialTick));
             glTranslatef(1, 1, 0);
-            glOrtho(0, mc.resolution.width / div, 0, mc.resolution.height / div, farPlaneDistance * -2.0f, farPlaneDistance * 2.0f);
+            glOrtho(0, mc.gameWindow.getWidthPixels() / div, 0, mc.gameWindow.getHeightPixels() / div, farPlaneDistance * -2.0f, farPlaneDistance * 2.0f);
             glTranslatef(((PhotoModeScreen)mc.currentScreen).getPanX(partialTick), -((PhotoModeScreen)mc.currentScreen).getPanY(partialTick), 0);
         } else
         {
-            GLU.gluPerspective(fov, (float)mc.resolution.width / (float)mc.resolution.height, 0.05F, farPlaneDistance * 2.0F);
+            GLU.gluPerspective(fov, (float)mc.gameWindow.getWidthPixels() / (float)mc.gameWindow.getHeightPixels(), 0.05F, farPlaneDistance * 2.0F);
         }
         glMatrixMode(GL_MODELVIEW);
         glLoadIdentity();
@@ -367,7 +367,7 @@ public class WorldRenderer
         glTranslatef(0.0f, 0.0f, -1.0f);
         glScalef(1.0f, 1.0f, 0.1f);
         
-        GLU.gluPerspective(fov, (float)mc.resolution.width / (float)mc.resolution.height, 0.05F, farPlaneDistance * 2.0F);
+        GLU.gluPerspective(fov, (float)mc.gameWindow.getWidthPixels() / (float)mc.gameWindow.getHeightPixels(), 0.05F, farPlaneDistance * 2.0F);
         glMatrixMode(GL_MODELVIEW);
         glLoadIdentity();
 
@@ -490,10 +490,10 @@ public class WorldRenderer
         {
             return;
         }
-        int width = mc.resolution.scaledWidth;
-        int height = mc.resolution.scaledHeight;
-        int mouseX = (Mouse.getX() * width) / mc.resolution.width;
-        int mouseY = height - (Mouse.getY() * height) / mc.resolution.height - 1;
+        int width = mc.resolution.getScaledWidthScreenCoords();
+        int height = mc.resolution.getScaledHeightScreenCoords();
+        int mouseX = (Mouse.getX() * width) / mc.resolution.getWidthScreenCoords();
+        int mouseY = height - (Mouse.getY() * height) / mc.resolution.getHeightScreenCoords() - 1;
         int c = 200;
         if(mc.gameSettings.enableVsync.value) // VSync
         {
@@ -503,7 +503,7 @@ public class WorldRenderer
             c = mc.gameSettings.customFpsLimit.value;
         }
         if (c <= 0) c = 1;
-        glViewport(0, 0, mc.resolution.width, mc.resolution.height);
+        glViewport(0, 0, mc.gameWindow.getWidthPixels(), mc.gameWindow.getHeightPixels());
         if(mc.theWorld != null)
         {
             Debug.change("world");
@@ -1031,7 +1031,7 @@ public class WorldRenderer
         glClear(256);
         glMatrixMode(GL11.GL_PROJECTION);
         glLoadIdentity();
-        glOrtho(0.0D, mc.resolution.scaledWidthExact, mc.resolution.scaledHeightExact, 0.0D, 1000D, 3000D);
+        glOrtho(0.0D, mc.resolution.getExactScaledWidthScreenCoords(), mc.resolution.getExactScaledHeightScreenCoords(), 0.0D, 1000D, 3000D);
         glMatrixMode(GL11.GL_MODELVIEW);
         glLoadIdentity();
         glTranslatef(0.0F, 0.0F, -2000F);
diff --git a/src/main/java/net/minecraft/client/render/shader/Shaders.java b/src/main/java/net/minecraft/client/render/shader/Shaders.java
index 7ad75a21e..9314f3eb7 100644
--- a/src/main/java/net/minecraft/client/render/shader/Shaders.java
+++ b/src/main/java/net/minecraft/client/render/shader/Shaders.java
@@ -63,8 +63,8 @@ public abstract class Shaders {
 		if(!shader.isEnabled()) return;
 		
 		shader.bind();
-		shader.uniformFloat("width", minecraft.resolution.width);
-		shader.uniformFloat("height", minecraft.resolution.height);
+		shader.uniformFloat("width", minecraft.gameWindow.getWidthPixels());
+		shader.uniformFloat("height", minecraft.gameWindow.getHeightPixels());
 		shader.uniformFloat("frameTimeCounter", frameTimeCounter);
 		shader.uniformFloat("gamma", minecraft.gameSettings.gamma.value);
 		shader.uniformFloat("fxaa", minecraft.gameSettings.fxaa.value);
diff --git a/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java b/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java
index 08f607cab..554a7f010 100644
--- a/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java
+++ b/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java
@@ -199,10 +199,10 @@ public class ShadersRenderer implements Renderer {
 	public void setupFramebuffer() {
 		double renderScale = (float) mc.gameSettings.renderScale.value.scale;
 
-		int scaledWidth = (int) (renderScale * mc.resolution.width);
-		int scaledHeight = (int) (renderScale * mc.resolution.height);
+		int scaledWidth = (int) (renderScale * mc.gameWindow.getWidthPixels());
+		int scaledHeight = (int) (renderScale * mc.gameWindow.getHeightPixels());
 		
-		if(fbWidth != mc.resolution.width || fbHeight != mc.resolution.height || renderWidth != scaledWidth || renderHeight != scaledHeight || !gameFramebuffer.isGenerated() || !worldFramebuffer.isGenerated()) {
+		if(fbWidth != mc.gameWindow.getWidthPixels() || fbHeight != mc.gameWindow.getHeightPixels() || renderWidth != scaledWidth || renderHeight != scaledHeight || !gameFramebuffer.isGenerated() || !worldFramebuffer.isGenerated()) {
 			worldFramebuffer.generate();
 			worldFramebufferTex.generate();
 			worldFramebufferDepth.generate();
@@ -210,8 +210,8 @@ public class ShadersRenderer implements Renderer {
 			gameFramebufferTex.generate();
 			gameFramebufferDepth.generate();
 
-			fbWidth = mc.resolution.width;
-			fbHeight = mc.resolution.height;
+			fbWidth = mc.gameWindow.getWidthPixels();
+			fbHeight = mc.gameWindow.getHeightPixels();
 			
 			renderWidth = scaledWidth;
 			renderHeight = scaledHeight;
diff --git a/src/main/java/net/minecraft/client/render/window/GameWindow.java b/src/main/java/net/minecraft/client/render/window/GameWindow.java
index 74e81f5e6..f33aaaea4 100644
--- a/src/main/java/net/minecraft/client/render/window/GameWindow.java
+++ b/src/main/java/net/minecraft/client/render/window/GameWindow.java
@@ -5,7 +5,7 @@ import net.minecraft.core.UnexpectedThrowable;
 
 public interface GameWindow {
 	
-	public void init(Minecraft minecraft);
+	public void init(Minecraft minecraft, int width, int height);
 	
 	public void toggleFullscreen();
 	
@@ -19,9 +19,13 @@ public interface GameWindow {
 	
 	public boolean shouldClose();
 	
-	public int getWidth();
+	public int getWidthScreenCoords();
 	
-	public int getHeight();
+	public int getHeightScreenCoords();
+
+	public int getWidthPixels();
+
+	public int getHeightPixels();
 	
 	public boolean isFocused();
 	
diff --git a/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java b/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java
index c2ffc63a1..fc010ce5d 100644
--- a/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java
+++ b/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java
@@ -27,30 +27,32 @@ import com.github.zarzelcow.legacylwjgl3.implementation.glfw.GLFWMouseImplementa
 import com.github.zarzelcow.legacylwjgl3.implementation.input.CombinedInputImplementation;
 import com.github.zarzelcow.legacylwjgl3.implementation.input.InputImplementation;
 
-import net.minecraft.client.GameResolution;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.PanelCrashReport;
 import net.minecraft.core.UnexpectedThrowable;
 
 public class GameWindowGLFW implements GameWindow {
-	
 	public Minecraft mc;
 	
 	public long window;
-	
-	public int width = GameResolution.defaultWidth;
-	public int height = GameResolution.defaultHeight;
-	
+
 	private boolean wasResized = false;
 	private boolean isFullscreen = false;
+	private boolean hasFocus = true;
 	
 	private int windowPosX;
 	private int windowPosY;
 	private int windowWidth;
 	private int windowHeight;
+
+	private int widthScreenCoords;
+	private int heightScreenCoords;
+
+	private int widthPixels;
+	private int heightPixels;
 	
 	@Override
-	public void init(Minecraft minecraft) {
+	public void init(Minecraft minecraft, int width, int height) {
 		mc = minecraft;
 		
 		System.out.println("GLFW Init");
@@ -67,34 +69,54 @@ public class GameWindowGLFW implements GameWindow {
 		// Create window
 		window = glfwCreateWindow(width, height, "Better than Adventure! " + Global.VERSION, 0, 0);
 
+		// Set widths and heights
+		int[] w = new int[1];
+		int[] h = new int[1];
+		glfwGetWindowSize(window, w, h);
+		this.widthScreenCoords = w[0];
+		this.heightScreenCoords = h[0];
+		glfwGetFramebufferSize(window, w, h);
+		this.widthPixels = w[0];
+		this.heightPixels = h[0];
+
 		// Center window
 		MonitorInfo monitor = new MonitorInfo(glfwGetPrimaryMonitor());
-		glfwSetWindowPos(window, (monitor.width - width) / 2, (monitor.height - height) / 2);
+		glfwSetWindowPos(window, (monitor.widthScreenCoords - widthScreenCoords) / 2, (monitor.heightScreenCoords - heightScreenCoords) / 2);
 		
 		// Setup callbacks
-		glfwSetWindowSizeCallback(window, (window, width, height) -> {
-			this.width = Math.max(1, width);
-			this.height = Math.max(1, height);
+		glfwSetWindowSizeCallback(window, (window, ww, hh) -> {
+			this.widthScreenCoords = Math.max(1, ww);
+			this.heightScreenCoords = Math.max(1, hh);
 			wasResized = true;
 		});
 
+		glfwSetFramebufferSizeCallback(window, (window, ww, hh) -> {
+			this.widthPixels = Math.max(1, ww);
+			this.heightPixels = Math.max(1, hh);
+			wasResized = true;
+		});
+
+		glfwSetWindowFocusCallback(window, (window, focused) -> {
+			this.hasFocus = focused;
+		});
+
 		// Setup Icon
-//		iconLabel: {
-//			int[] resolutions = new int[]{16, 32, 64, 128, 256};
-//			GLFWImage.Buffer gb = GLFWImage.create(resolutions.length);
-//			for (int i = 0; i < resolutions.length; i++) {
-//				int res = resolutions[i];
-//				ByteBuffer icon = getImageBuffer("/icon/" + res + ".png");
-//				if (icon == null) {
-//					System.err.println("Icon at resolution '" + res + "' is null! Skipping icons!");
-//					gb.close();
-//					break iconLabel;
-//				}
-//				GLFWImage iconGI = GLFWImage.create().set(res, res, icon);
-//				gb.put(i, iconGI);
-//			}
-//			glfwSetWindowIcon(window, gb);
-//		}
+		iconLabel: {
+			int[] resolutions = new int[]{16, 32, 64, 128, 256};
+			GLFWImage.Buffer gb = GLFWImage.create(resolutions.length);
+			for (int i = 0; i < resolutions.length; i++) {
+				int res = resolutions[i];
+				ByteBuffer icon = getImageBuffer("/icon/" + res + ".png");
+				if (icon == null) {
+					System.err.println("Icon at resolution '" + res + "' is null! Skipping icons!");
+					gb.close();
+					break iconLabel;
+				}
+				GLFWImage iconGI = GLFWImage.create().set(res, res, icon);
+				gb.put(i, iconGI);
+			}
+			glfwSetWindowIcon(window, gb);
+		}
 
 		// Show window
 		glfwShowWindow(window);
@@ -169,7 +191,7 @@ public class GameWindowGLFW implements GameWindow {
 			MonitorInfo monitor = getMonitorAt(x, y);
 			
 			// Enable GLFW Fullscreen
-			glfwSetWindowMonitor(window, monitor.handle, monitor.posX, monitor.posY, monitor.width, monitor.height, monitor.refreshRate);
+			glfwSetWindowMonitor(window, monitor.handle, monitor.posX, monitor.posY, monitor.widthScreenCoords, monitor.heightScreenCoords, monitor.refreshRate);
 			isFullscreen = true;
 		}else {
 			// Disable GLFW Fullscreen
@@ -183,7 +205,7 @@ public class GameWindowGLFW implements GameWindow {
 				
 				glfwSetWindowAttrib(window, GLFW_DECORATED, 0);
 				glfwSetWindowPos(window, monitor.posX, monitor.posY);
-				glfwSetWindowSize(window, monitor.width, monitor.height);
+				glfwSetWindowSize(window, monitor.widthScreenCoords, monitor.heightScreenCoords);
 				isFullscreen = true;
 			}else {
 				System.out.println("Change to Windowed");
@@ -202,7 +224,7 @@ public class GameWindowGLFW implements GameWindow {
 			long monitor = monitorPointers.get(i);
 			
 			MonitorInfo info = new MonitorInfo(monitor);
-			if(x >= info.posX && y >= info.posY && x < info.posX + info.width && y < info.posY + info.height) {
+			if(x >= info.posX && y >= info.posY && x < info.posX + info.widthScreenCoords && y < info.posY + info.heightScreenCoords) {
 				return info;
 			}
 		}
@@ -253,18 +275,28 @@ public class GameWindowGLFW implements GameWindow {
 	}
 
 	@Override
-	public int getWidth() {
-		return width;
+	public int getWidthScreenCoords() {
+		return widthScreenCoords;
+	}
+
+	@Override
+	public int getHeightScreenCoords() {
+		return heightScreenCoords;
+	}
+
+	@Override
+	public int getWidthPixels() {
+		return widthPixels;
 	}
 
 	@Override
-	public int getHeight() {
-		return height;
+	public int getHeightPixels() {
+		return heightPixels;
 	}
 
 	@Override
 	public boolean isFocused() {
-		return true;
+		return hasFocus;
 	}
 
 	@Override
@@ -290,8 +322,8 @@ public class GameWindowGLFW implements GameWindow {
 		public final long handle;
 		public final int posX;
 		public final int posY;
-		public final int width;
-		public final int height;
+		public final int widthScreenCoords;
+		public final int heightScreenCoords;
 		public final int refreshRate;
 		
 		public MonitorInfo(long monitor) {
@@ -305,8 +337,8 @@ public class GameWindowGLFW implements GameWindow {
 			posX = x[0];
 			posY = y[0];
 			
-			width = vidmode.width();
-			height = vidmode.height();
+			widthScreenCoords = vidmode.width();
+			heightScreenCoords = vidmode.height();
 			refreshRate = vidmode.refreshRate();
 		}
 	}
diff --git a/src/main/java/net/minecraft/client/util/helper/ScreenshotHelper.java b/src/main/java/net/minecraft/client/util/helper/ScreenshotHelper.java
index e51b1a1f6..820e2d145 100644
--- a/src/main/java/net/minecraft/client/util/helper/ScreenshotHelper.java
+++ b/src/main/java/net/minecraft/client/util/helper/ScreenshotHelper.java
@@ -121,14 +121,11 @@ public class ScreenshotHelper {
 		yaw = minecraft.thePlayer.yRot;
 		pitch = minecraft.thePlayer.xRot;
 		renderer = minecraft.renderer;
-		oldWidth = minecraft.resolution.width;
-		oldHeight = minecraft.resolution.height;
+		oldWidth = minecraft.gameWindow.getWidthPixels();
+		oldHeight = minecraft.gameWindow.getHeightPixels();
 		immersiveMode = minecraft.gameSettings.immersiveMode.value;
 		minecraft.gameSettings.immersiveMode.value = 2;
-		
-		minecraft.resolution.width = width;
-		minecraft.resolution.height = height;
-		
+
 		minecraft.renderer = new FallbackRenderer(minecraft);
 	}
 	
@@ -143,8 +140,6 @@ public class ScreenshotHelper {
 		minecraft.thePlayer.yRot = yaw;
 		minecraft.thePlayer.xRot = pitch;
 		minecraft.renderer = renderer;
-		minecraft.resolution.width = oldWidth;
-		minecraft.resolution.height = oldHeight;
 		minecraft.gameSettings.immersiveMode.value = immersiveMode;
 	}
 	
diff --git a/src/main/java/org/lwjgl/opengl/Display.java b/src/main/java/org/lwjgl/opengl/Display.java
index add8b0847..04ab5dc8c 100644
--- a/src/main/java/org/lwjgl/opengl/Display.java
+++ b/src/main/java/org/lwjgl/opengl/Display.java
@@ -18,11 +18,11 @@ public abstract class Display {
 	// These are used in legacy-lwjgl's input implementation
 	
 	public static int getWidth() {
-		return window.getWidth();
+		return window.getWidthScreenCoords();
 	}
 	
 	public static int getHeight() {
-		return window.getHeight();
+		return window.getHeightScreenCoords();
 	}
 	
 	public static long getHandle() {
diff --git a/src/main/resources/assets/minecraft/textures/item/ingot_steel_crude.png b/src/main/resources/assets/minecraft/textures/item/ingot_steel_crude.png
index b2a644be7..6357e6504 100644
Binary files a/src/main/resources/assets/minecraft/textures/item/ingot_steel_crude.png and b/src/main/resources/assets/minecraft/textures/item/ingot_steel_crude.png differ
