 +		header1.setHorizontalAlignment(SwingConstants.CENTER);
 +		header1.setAlignmentX(Component.CENTER_ALIGNMENT);
 +		crashPanel.add(header1);
- 
--        if (crashReportIn.getFile() != null)
--        {
--            Bootstrap.func_179870_a("#@!@# Game crashed! Crash report saved to: #@!@# " + crashReportIn.getFile());
--            System.exit(-1);
--        }
--        else if (crashReportIn.saveToFile(var3))
--        {
--            Bootstrap.func_179870_a("#@!@# Game crashed! Crash report saved to: #@!@# " + var3.getAbsolutePath());
--            System.exit(-1);
--        }
--        else
--        {
--            Bootstrap.func_179870_a("#@?@# Game crashed! Crash report could not be saved. #@?@#");
--            System.exit(-2);
--        }
++
 +		final JButton fileButton = new JButton("<html><u>" + reportPath);
 +		fileButton.setForeground(new Color(0x0000ff));
 +		fileButton.setAlignmentX(Component.CENTER_ALIGNMENT);

+import com.mojang.authlib.properties.PropertyMap;
+import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
+
 public class Minecraft implements IThreadListener, IPlayerUsage
 {
     private static final Logger logger = LogManager.getLogger();
-    private static final ResourceLocation locationMojangPng = new ResourceLocation("textures/gui/title/mojang.png");
+    //TODO: Client
+    private static final ResourceLocation locationMojangPng = new ResourceLocation("wurst/wurst_loading.png");
     public static final boolean isRunningOnMac = Util.getOSType() == Util.EnumOS.OSX;
 
     /** A 10MiB preallocation to ensure the heap is reasonably sized. */
@@ -226,7 +256,8 @@ public class Minecraft implements IThreadListener, IPlayerUsage
     private Entity field_175622_Z;
     public Entity pointedEntity;
     public EffectRenderer effectRenderer;
-    private final Session session;
+    //TODO: Client
+    public Session session;
     private boolean isGamePaused;
 
     /** The font renderer used for displaying and measuring text */
@@ -280,7 +311,8 @@ public class Minecraft implements IThreadListener, IPlayerUsage
     /**
      * When you place a block, it's set to 6, decremented once per tick, when it's 0, you can place another block.
      */
-    private int rightClickDelayTimer;
+    //TODO: Client
+    public int rightClickDelayTimer;
     private String serverName;
     private int serverPort;
 
@@ -345,6 +377,9 @@ public class Minecraft implements IThreadListener, IPlayerUsage
 
     /** Profiler currently displayed in the debug screen pie chart */
     private String debugProfilerName = "root";
+    //TODO: Client
+	private JFrame frame;
+	
     private static final String __OBFID = "CL_00000631";
 
     public Minecraft(GameConfiguration p_i45547_1_)
@@ -382,6 +417,25 @@ public class Minecraft implements IThreadListener, IPlayerUsage
 
     public void run()
     {
+    	//TODO: Client
+		if(System.getProperty("java.version").startsWith("1.6")
+			|| System.getProperty("java.version").startsWith("1.7"))

+			return;
+		}
+		
+        this.running = true;
+        CrashReport var2;
+
+        try
+        {
+            this.startGame();
+        }
+        catch (Throwable var11)
+        {
+            var2 = CrashReport.makeCrashReport(var11, "Initializing game");
+            var2.makeCategory("Initialization");
+            this.displayCrashReport(this.addGraphicsAndWorldToCrashReport(var2));
+            return;
+        }
+
+        while (true)
+        {
+            try
+            {
+                while (this.running)
+                {
+                    if (!this.hasCrashed || this.crashReporter == null)
+                    {
+                        try
+                        {
+                            this.runGameLoop();
+                        }
+                        catch (OutOfMemoryError var10)
+                        {
+                            this.freeMemory();
+                            this.displayGuiScreen(new GuiMemoryErrorScreen());
+                            System.gc();
+                        }
+
+                        continue;
+                    }
+
+                    this.displayCrashReport(this.crashReporter);
+                    return;
+                }
+            }
+            catch (MinecraftError var12)
+            {
+                ;
+            }
+            catch (ReportedException var13)
+            {
+                this.addGraphicsAndWorldToCrashReport(var13.getCrashReport());
+                this.freeMemory();
+                logger.fatal("Reported exception thrown!", var13);
+                this.displayCrashReport(var13.getCrashReport());
+            }
+            catch (Throwable var14)
+            {
+                var2 = this.addGraphicsAndWorldToCrashReport(new CrashReport("Unexpected error", var14));
+                this.freeMemory();
+                logger.fatal("Unreported exception thrown!", var14);
+                this.displayCrashReport(var2);
+            }
+            finally
+            {
+                this.shutdownMinecraftApplet();
+            }
+
+            return;
+        }
+    }
+
+    /**
+     * Starts the game: initializes the canvas, the title, the settings, etcetera.
+     */
+    private void startGame() throws LWJGLException
+    {
+        this.gameSettings = new GameSettings(this, this.mcDataDir);
+        this.defaultResourcePacks.add(this.mcDefaultResourcePack);
+        this.startTimerHackThread();
+
+        if (this.gameSettings.overrideHeight > 0 && this.gameSettings.overrideWidth > 0)
+        {
+            this.displayWidth = this.gameSettings.overrideWidth;
+            this.displayHeight = this.gameSettings.overrideHeight;
+        }
+
+        logger.info("LWJGL Version: " + Sys.getVersion());
+        this.startLWJGL_1();
+        this.startLWJGL_2();
+        this.startLWJGL_3();
+        OpenGlHelper.initializeTextures();
+        this.framebufferMc = new Framebuffer(this.displayWidth, this.displayHeight, true);
+        this.framebufferMc.setFramebufferColor(0.0F, 0.0F, 0.0F, 0.0F);
+        this.func_175608_ak();
+        this.mcResourcePackRepository = new ResourcePackRepository(this.fileResourcepacks, new File(this.mcDataDir, "server-resource-packs"), this.mcDefaultResourcePack, this.metadataSerializer_, this.gameSettings);
+        this.mcResourceManager = new SimpleReloadableResourceManager(this.metadataSerializer_);
+        this.mcLanguageManager = new LanguageManager(this.metadataSerializer_, this.gameSettings.language);
+        this.mcResourceManager.registerReloadListener(this.mcLanguageManager);
+        this.refreshResources();
+        this.renderEngine = new TextureManager(this.mcResourceManager);
+        this.mcResourceManager.registerReloadListener(this.renderEngine);
+        this.func_180510_a(this.renderEngine);
+        this.func_175595_al();
+        this.skinManager = new SkinManager(this.renderEngine, new File(this.fileAssets, "skins"), this.sessionService);
+        this.saveLoader = new AnvilSaveConverter(new File(this.mcDataDir, "saves"));
+        this.mcSoundHandler = new SoundHandler(this.mcResourceManager, this.gameSettings);
+        this.mcResourceManager.registerReloadListener(this.mcSoundHandler);
+        this.mcMusicTicker = new MusicTicker(this);
+        this.fontRendererObj = new FontRenderer(this.gameSettings, new ResourceLocation("textures/font/ascii.png"), this.renderEngine, false);
+
+        //TODO: Client
+        Fonts.loadFonts();
+        
+        if (this.gameSettings.language != null)
+        {
+            this.fontRendererObj.setUnicodeFlag(this.isUnicode());
+            this.fontRendererObj.setBidiFlag(this.mcLanguageManager.isCurrentLanguageBidirectional());
+        }
+
+        this.standardGalacticFontRenderer = new FontRenderer(this.gameSettings, new ResourceLocation("textures/font/ascii_sga.png"), this.renderEngine, false);
+        this.mcResourceManager.registerReloadListener(this.fontRendererObj);
+        this.mcResourceManager.registerReloadListener(this.standardGalacticFontRenderer);
+        this.mcResourceManager.registerReloadListener(new GrassColorReloadListener());
+        this.mcResourceManager.registerReloadListener(new FoliageColorReloadListener());
+        AchievementList.openInventory.setStatStringFormatter(new IStatStringFormat()
+        {
+            private static final String __OBFID = "CL_00000632";
+            public String formatString(String p_74535_1_)
+            {
+                try
+                {
+                    return String.format(p_74535_1_, new Object[] {GameSettings.getKeyDisplayString(Minecraft.this.gameSettings.keyBindInventory.getKeyCode())});
+                }
+                catch (Exception var3)
+                {
+                    return "Error: " + var3.getLocalizedMessage();
+                }
+            }
+        });
+        this.mouseHelper = new MouseHelper();
+        this.checkGLError("Pre startup");
+        GlStateManager.func_179098_w();
+        GlStateManager.shadeModel(7425);
+        GlStateManager.clearDepth(1.0D);
+        GlStateManager.enableDepth();
+        GlStateManager.depthFunc(515);
+        GlStateManager.enableAlpha();
+        GlStateManager.alphaFunc(516, 0.1F);
+        GlStateManager.cullFace(1029);
+        GlStateManager.matrixMode(5889);
+        GlStateManager.loadIdentity();
+        GlStateManager.matrixMode(5888);
+        this.checkGLError("Startup");
+        this.textureMapBlocks = new TextureMap("textures");
+        this.textureMapBlocks.setMipmapLevels(this.gameSettings.mipmapLevels);
+        this.renderEngine.loadTickableTexture(TextureMap.locationBlocksTexture, this.textureMapBlocks);
+        this.renderEngine.bindTexture(TextureMap.locationBlocksTexture);
+        this.textureMapBlocks.func_174937_a(false, this.gameSettings.mipmapLevels > 0);
+        this.modelManager = new ModelManager(this.textureMapBlocks);
+        this.mcResourceManager.registerReloadListener(this.modelManager);
+        this.renderItem = new RenderItem(this.renderEngine, this.modelManager);
+        this.renderManager = new RenderManager(this.renderEngine, this.renderItem);
+        this.itemRenderer = new ItemRenderer(this);
+        this.mcResourceManager.registerReloadListener(this.renderItem);
+        this.entityRenderer = new EntityRenderer(this, this.mcResourceManager);
+        this.mcResourceManager.registerReloadListener(this.entityRenderer);
+        this.field_175618_aM = new BlockRendererDispatcher(this.modelManager.getBlockModelShapes(), this.gameSettings);
+        this.mcResourceManager.registerReloadListener(this.field_175618_aM);
+        this.renderGlobal = new RenderGlobal(this);
+        this.mcResourceManager.registerReloadListener(this.renderGlobal);
+        this.guiAchievement = new GuiAchievement(this);
+        GlStateManager.viewport(0, 0, this.displayWidth, this.displayHeight);
+        this.effectRenderer = new EffectRenderer(this.theWorld, this.renderEngine);
+        this.checkGLError("Post startup");
+        this.ingameGUI = new GuiIngame(this);
+
+        //TODO: Client
+        Client.wurst.startClient();
+        if(frame != null)
+        	frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
+
+        if (this.serverName != null)
+        {
+            this.displayGuiScreen(new GuiConnecting(new GuiMainMenu(), this, this.serverName, this.serverPort));
+        }
+        else
+        {
+            this.displayGuiScreen(new GuiMainMenu());
+        }
+
+        this.renderEngine.deleteTexture(this.mojangLogo);
+        this.mojangLogo = null;
+        this.loadingScreen = new LoadingScreenRenderer(this);
+
+        if (this.gameSettings.fullScreen && !this.fullscreen)
+        {
+            this.toggleFullscreen();
+        }
+
+        try
+        {
+            Display.setVSyncEnabled(this.gameSettings.enableVsync);
+        }
+        catch (OpenGLException var2)
+        {
+            this.gameSettings.enableVsync = false;
+            this.gameSettings.saveOptions();
+        }
+
+        this.renderGlobal.func_174966_b();
+    }
+
+    private void func_175608_ak()
+    {
+        this.metadataSerializer_.registerMetadataSectionType(new TextureMetadataSectionSerializer(), TextureMetadataSection.class);
+        this.metadataSerializer_.registerMetadataSectionType(new FontMetadataSectionSerializer(), FontMetadataSection.class);
+        this.metadataSerializer_.registerMetadataSectionType(new AnimationMetadataSectionSerializer(), AnimationMetadataSection.class);
+        this.metadataSerializer_.registerMetadataSectionType(new PackMetadataSectionSerializer(), PackMetadataSection.class);
+        this.metadataSerializer_.registerMetadataSectionType(new LanguageMetadataSectionSerializer(), LanguageMetadataSection.class);
+    }
+
+    private void func_175595_al()
+    {
+        try
+        {
+            this.stream = new TwitchStream(this, (Property)Iterables.getFirst(this.twitchDetails.get("twitch_access_token"), (Object)null));
+        }
+        catch (Throwable var2)
+        {
+            this.stream = new NullStream(var2);
+            logger.error("Couldn\'t initialize twitch stream");
+        }
+    }
+
+    private void startLWJGL_3() throws LWJGLException
+    {
+        Display.setResizable(true);
+        Display.setTitle("Minecraft 1.8");
+
+        try
+        {
+            Display.create((new PixelFormat()).withDepthBits(24));
+        }
+        catch (LWJGLException var4)
+        {
+            logger.error("Couldn\'t set pixel format", var4);
+
+            try
+            {
+                Thread.sleep(1000L);
+            }
+            catch (InterruptedException var3)
+            {
+                ;
+            }
+
+            if (this.fullscreen)
+            {
+                this.updateDisplayMode();
+            }
+
+            Display.create();
+        }
+    }
+
+    private void startLWJGL_2() throws LWJGLException
+    {
+        if(this.fullscreen)
+        {
+            Display.setFullscreen(true);
+            DisplayMode var1 = Display.getDisplayMode();
+            this.displayWidth = Math.max(1, var1.getWidth());
+            this.displayHeight = Math.max(1, var1.getHeight());
+        }else
+        {
+            Display.setDisplayMode(new DisplayMode(this.displayWidth, this.displayHeight));
+            if(!isAutoMaximize())
+            	return;
+        	frame = new JFrame("Minecraft 1.8");
