diff --git a/game/client/src/main/java/net/minecraft/client/Minecraft.java b/game/client/src/main/java/net/minecraft/client/Minecraft.java
index b4018277a..c2d6b8d3b 100644
--- a/game/client/src/main/java/net/minecraft/client/Minecraft.java
+++ b/game/client/src/main/java/net/minecraft/client/Minecraft.java
@@ -34,6 +34,7 @@ import net.minecraft.client.gui.error.ScreenOutOfMemory;
 import net.minecraft.client.gui.options.data.OptionsPages;
 import net.minecraft.client.gui.toasts.GuiElementToastsHud;
 import net.minecraft.client.holiday.Holidays;
+import net.minecraft.core.net.CertificateHelper;
 import net.minecraft.client.net.handler.PacketHandlerClient;
 import net.minecraft.client.render.TileEntityRenderDispatcher;
 import net.minecraft.client.render.block.model.BlockModelGrass;
@@ -338,6 +339,12 @@ public class Minecraft
         guiToasts = new GuiElementToastsHud(this);
         sndManager = new SoundEngine();
 
+        try {
+            CertificateHelper.installCertificates();
+        } catch (Exception e) {
+            LOGGER.error("Failed to install certificates!", e);
+        }
+
         new Thread("Timer hack thread") {
             {
                 this.setDaemon(true);
@@ -488,6 +495,8 @@ public class Minecraft
 
         this.gameSettings.init();
 
+        UUIDHelper.urlUUID = gameSettings.uuidServer.value;
+
         LOGGER.info("Java Version: {}", System.getProperty("java.version"));
 
 		printWrongJavaVersionInfo();
@@ -673,19 +682,8 @@ public class Minecraft
             hasBeta173 = false;
         }
 
-        STARTUP_TIKE_KEEPER.start("JCE Check");
-        boolean hasJCE;
-        try {
-            hasJCE = Cipher.getMaxAllowedKeyLength("AES") > 128;
-        }catch (final Exception ignored) {
-            hasJCE = false;
-        }
-        STARTUP_TIKE_KEEPER.end("JCE Check");
-
         if (!hasBeta173) {
             displayScreen(new ScreenMissingMinecraft());
-        } else if (!hasJCE) {
-            displayScreen(new ScreenMissingJCE());
         } else if (System.getProperty("sun.arch.data.model").equals("32"))
         {
             displayScreen(new ScreenBadJavaArch());
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 b50714c12..9f7b550a4 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
@@ -28,7 +28,7 @@ public abstract class Screen extends Gui {
     public boolean passEvents;
     public FontRenderer fontRenderer;
     protected ButtonElement clickedButton;
-    final Screen parentScreen;
+    protected final Screen parentScreen;
     private CursorShape desiredCursor = CursorShape.ARROW;
 
     public Screen(@Nullable final Screen parent) {
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 dfca17658..fa534ca2c 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
@@ -11,9 +11,11 @@ import java.util.Date;
 import java.util.List;
 import java.util.Random;
 
+import javax.crypto.Cipher;
 import javax.imageio.ImageIO;
 
 import com.mojang.logging.LogUtils;
+import net.minecraft.client.gui.error.ScreenMissingJCE;
 import net.minecraft.client.gui.hud.HudIngame;
 import net.minecraft.client.gui.hud.HudIngameDoom;
 import net.minecraft.client.holiday.Holidays;
@@ -207,7 +209,17 @@ public class ScreenMainMenu extends Screen
                 mc.displayScreen(new ScreenSelectWorld(this));
                 break;
             case 2:
-                mc.displayScreen(new ScreenSelectServer(this));
+                boolean hasJCE;
+                try {
+                    hasJCE = Cipher.getMaxAllowedKeyLength("AES") > 128;
+                } catch (final Exception ignored) {
+                    hasJCE = false;
+                }
+                if (!(hasJCE) && mc.gameSettings.doJCECheck.value) {
+                    mc.displayScreen(new ScreenMissingJCE(this, new ScreenSelectServer(this)));
+                } else {
+                    mc.displayScreen(new ScreenSelectServer(this));
+                }
                 break;
             case 3:
                 mc.displayScreen(new ScreenOptions(this, OptionsPages.ASSET_PACKS));
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 6e404da79..9e7f6cc05 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
@@ -1,5 +1,6 @@
 package net.minecraft.client.gui;
 
+import net.minecraft.client.gui.error.ScreenMissingJCE;
 import net.minecraft.client.gui.popup.PopupScreen;
 import net.minecraft.client.gui.popup.PopupBuilder;
 import net.minecraft.client.net.thread.ThreadPingServer;
@@ -10,7 +11,9 @@ import net.minecraft.core.net.SavedServerList;
 import net.minecraft.core.net.ServerAddress;
 import net.minecraft.core.net.ServerData;
 import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.Nullable;
 
+import javax.crypto.Cipher;
 import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
@@ -32,6 +35,7 @@ public class ScreenSelectServer extends Screen {
 	public ButtonElement buttonDelete;
 	public ButtonElement buttonRefresh;
 	public ButtonElement buttonCancel;
+	public @Nullable ButtonElement buttonJCE = null;
 
 	TooltipElement tooltip;
 
@@ -72,6 +76,14 @@ public class ScreenSelectServer extends Screen {
 		buttonDelete = add(new ButtonElement(0, x1 + 78, y2, 74, 20, trans.translateKey("gui.select_server.button.delete")));
 		buttonRefresh = add(new ButtonElement(0, x1 + 156, y2, 74, 20, trans.translateKey("gui.select_server.button.refresh")));
 		buttonCancel = add(new ButtonElement(0, x1 + 234, y2, 74, 20, trans.translateKey("gui.select_server.button.cancel")));
+
+		boolean hasJCE;
+		try {
+			hasJCE = Cipher.getMaxAllowedKeyLength("AES") > 128;
+		} catch (final Exception ignored) {
+			hasJCE = false;
+		}
+		if (!(hasJCE)) buttonJCE = add(new ClickableLabelElement(0, (width - fontRenderer.stringWidth(trans.translateKey("gui.select_server.button.no_jce.warning"))) /2, 5, trans.translateKey("gui.select_server.button.no_jce.warning"), 0xFFFFFFFF));
 		
 		setButtonsEnabled(false);
 	}
@@ -137,7 +149,8 @@ public class ScreenSelectServer extends Screen {
 						}).build();
 				mc.displayScreen(popup);
 			}
-			
+		} else if (buttonJCE != null && button == buttonJCE) {
+			mc.displayScreen(new ScreenMissingJCE(parentScreen, new ScreenSelectServer(parentScreen)));
 		}
 	}
 
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 0ca398904..00c69d41a 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
@@ -192,6 +192,7 @@ public class ScreenSignEditor extends Screen
         GL11.glEnable(GL11.GL_BLEND);
         TileEntityRenderDispatcher.instance.renderTileEntity(Tessellator.instance, entitySign, -0.5D, -0.75D, -0.5D, 0.0F);
         entitySign.lineBeingEdited = -1;
+        GL11.glDisable(GL11.GL_BLEND);
         GL11.glPopMatrix();
         
         drawStringCenteredShadow(fontRenderer, I18n.getInstance().translateKey(entitySign.getPicture().getLanguageKey()), width / 2, 100 + 50 + yOffset, 0xFFFFFF);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/error/ScreenMissingJCE.java b/game/client/src/main/java/net/minecraft/client/gui/error/ScreenMissingJCE.java
index dcdc23097..20d0cf8a2 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/error/ScreenMissingJCE.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/error/ScreenMissingJCE.java
@@ -9,6 +9,7 @@ import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.ScreenMainMenu;
 import net.minecraft.client.util.helper.UrlHelper;
 import net.minecraft.core.lang.I18n;
+import net.minecraft.core.util.helper.Color;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 
@@ -17,11 +18,23 @@ import java.net.URI;
 
 public class ScreenMissingJCE extends Screen {
     private static final Logger LOGGER = LogUtils.getLogger();
+    private static final int CONTINUE_LENGTH = 1500;
 
+    protected ButtonElement backButton = null;
     protected ButtonElement continueButton = null;
     protected ButtonElement downloadButton = null;
     protected ButtonElement upgradeButton = null;
 
+    protected boolean continueHeld = false;
+    protected long clickStart = 0;
+
+    protected Screen continueToScreen;
+
+    public ScreenMissingJCE(Screen parent, Screen continueToScreen) {
+        super(parent);
+        this.continueToScreen = continueToScreen;
+    }
+
     @Override
     public void init()
     {
@@ -29,9 +42,10 @@ public class ScreenMissingJCE extends Screen {
         this.buttons.clear();
         final String downloadString = i.translateKey("gui.no_jce.button.download");
         final String patchString = i.translateKey("gui.no_jce.button.upgrade");
-        this.continueButton = this.add(new ButtonElement(0, this.width / 2 - 100, this.height / 4 + 120 + 12, i.translateKey("gui.no_jce.button.continue")));
-        this.downloadButton = this.add(new ClickableLabelElement(1, this.width / 2 - 170, (this.height / 4 - 60) + 60 + 64, downloadString, 0x7C99EA));
-        this.upgradeButton = this.add(new ClickableLabelElement(2, this.width / 2 - 170, (this.height / 4 - 60) + 60 + 77, patchString, 0x7C99EA));
+        this.backButton = this.add(new ButtonElement(0, this.width / 2 - 102, this.height / 4 + 120 + 12, 100, 20, i.translateKey("gui.no_jce.button.back")));
+        this.continueButton = this.add(new ButtonElement(1, this.width / 2 + 2, this.height / 4 + 120 + 12, 100, 20, i.translateKey("gui.no_jce.button.continue")));
+        this.downloadButton = this.add(new ClickableLabelElement(2, this.width / 2 - 170, (this.height / 4 - 60) + 60 + 64, downloadString, 0x7C99EA));
+        this.upgradeButton = this.add(new ClickableLabelElement(3, this.width / 2 - 170, (this.height / 4 - 60) + 60 + 77, patchString, 0x7C99EA));
     }
 
     @Override
@@ -43,28 +57,42 @@ public class ScreenMissingJCE extends Screen {
         }
         if(button.id == 0)
         {
-            this.mc.displayScreen(new ScreenMainMenu());
+            this.mc.displayScreen(getParentScreen());
         }
-        if (button.id == 1)
+        if (button.id == 1) {
+            this.continueHeld = true;
+            this.clickStart = System.currentTimeMillis();
+        }
+        if (button.id == 2)
         {
             UrlHelper.openURL("https://adoptium.net/en-GB/temurin/releases/?version=8");
         }
-        if (button.id == 2) {
+        if (button.id == 3) {
             UrlHelper.openURL("https://www.oracle.com/java/technologies/javase-jce-all-downloads.html");
         }
     }
 
+    @Override
+    protected void buttonReleased(ButtonElement button) {
+        if (button.id == 1) {
+            this.continueHeld = false;
+            this.clickStart = 0;
+        }
+    }
+
     @Override
     public void render(final int mx, final int my, final float partialTick)
     {
         final I18n i = I18n.getInstance();
         renderBackground();
+
         drawStringCenteredShadow(this.fontRenderer, i.translateKey("gui.no_jce.label.title"), this.width / 2, (this.height / 4 - 60) + 20, 0xffffff);
         drawStringShadow(this.fontRenderer, i.translateKey("gui.no_jce.label.body.1"), this.width / 2 - 170, (this.height / 4 - 60) + 60, 0xa0a0a0);
         drawStringShadow(this.fontRenderer, i.translateKey("gui.no_jce.label.body.2"), this.width / 2 - 170, (this.height / 4 - 60) + 60 + 18, 0xa0a0a0);
-        drawStringShadow(this.fontRenderer, i.translateKey("gui.no_jce.label.body.3"), this.width / 2 - 170, (this.height / 4 - 60) + 60 + 27, 0xa0a0a0);
+//        drawStringShadow(this.fontRenderer, i.translateKey("gui.no_jce.label.body.3"), this.width / 2 - 170, (this.height / 4 - 60) + 60 + 27, 0xa0a0a0);
         drawStringShadow(this.fontRenderer, i.translateKey("gui.no_jce.label.body.4"), this.width / 2 - 170, (this.height / 4 - 60) + 60 + 45, 0xa0a0a0);
         drawStringShadow(this.fontRenderer, i.translateKey("gui.no_jce.label.body.5"), this.width / 2 - 170, (this.height / 4 - 60) + 60 + 54, 0xa0a0a0);
+
         if (Minecraft.GPU_VENDOR == EnumGPUVendor.INTEL) {
             drawStringShadow(this.fontRenderer, i.translateKey("gui.no_jce.label.body.intel.disclaimer.1"), this.width / 2 - 170, (this.height / 4 - 60) + 60 + 72, 0xa0a0a0);
             drawStringShadow(this.fontRenderer, i.translateKey("gui.no_jce.label.body.intel.disclaimer.2"), this.width / 2 - 170, (this.height / 4 - 60) + 60 + 81, 0xa0a0a0);
@@ -79,8 +107,17 @@ public class ScreenMissingJCE extends Screen {
             this.upgradeButton.yPosition = (this.height / 4 - 60) + 60 + 77;
             this.upgradeButton.displayString = i.translateKey("gui.no_jce.button.upgrade");
         }
+        this.backButton.drawButton(this.mc, mx, my);
         this.continueButton.drawButton(this.mc, mx, my);
         this.downloadButton.drawButton(this.mc, mx, my);
         this.upgradeButton.drawButton(this.mc, mx, my);
+
+        if (continueHeld) {
+            long delta = (System.currentTimeMillis() - clickStart);
+            drawRectDouble(this.continueButton.xPosition, this.continueButton.yPosition, this.continueButton.xPosition + (this.continueButton.width * ((float)delta/ CONTINUE_LENGTH)), this.continueButton.yPosition + this.continueButton.height, Color.intToIntARGB(127, 255, 255, 255));
+            if (delta >= CONTINUE_LENGTH) {
+                mc.displayScreen(continueToScreen);
+            }
+        }
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
index 38b60524c..a09d46c54 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
@@ -349,6 +349,7 @@ public abstract class OptionsPages
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.enableDevResourceLoading))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.devModels))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.enableMultiDrawRendering))
+                .withComponent(new BooleanOptionComponent(mc.gameSettings.doJCECheck))
             )
             .withComponent(new OptionsCategory("gui.options.page.debug.category.utility")
                 .withComponent(new ShortcutComponent("gui.options.page.debug.button.open.model_viewer", () -> {
diff --git a/game/client/src/main/java/net/minecraft/client/net/thread/ThreadDownloadResources.java b/game/client/src/main/java/net/minecraft/client/net/thread/ThreadDownloadResources.java
index 93f2d1cf5..8c6653020 100644
--- a/game/client/src/main/java/net/minecraft/client/net/thread/ThreadDownloadResources.java
+++ b/game/client/src/main/java/net/minecraft/client/net/thread/ThreadDownloadResources.java
@@ -21,6 +21,7 @@ import com.mojang.logging.LogUtils;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.sound.SoundEngine;
 import net.minecraft.client.sound.SoundRepository;
+import net.minecraft.core.net.CertificateHelper;
 import org.slf4j.Logger;
 
 public class ThreadDownloadResources extends Thread {
@@ -155,7 +156,7 @@ public class ThreadDownloadResources extends Thread {
 
         LOGGER.info("Downloading File: {}", url);
 
-        transferDataAndClose(new BufferedInputStream(new URL(url).openStream()), new BufferedOutputStream(Files.newOutputStream(createNewFile(file).toPath())));
+        transferDataAndClose(new BufferedInputStream(CertificateHelper.getWebsiteAsStream(url)), new BufferedOutputStream(Files.newOutputStream(createNewFile(file).toPath())));
     }
 
     private static class SoundEntry {
diff --git a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
index 51b6ece0e..655b580c6 100644
--- a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -189,6 +189,8 @@ public class GameSettings {
 	public OptionBoolean playerSleeveRight = new OptionBoolean(this, "player.sleeve.right", true);
 	public OptionBoolean playerPantLeft = new OptionBoolean(this, "player.pant.left", true);
 	public OptionBoolean playerPantRight = new OptionBoolean(this, "player.pant.right", true);
+	public OptionBoolean doJCECheck = new OptionBoolean(this, "doJCECheck", true);
+	public OptionString uuidServer = new OptionString(this, "uuidServer", "https://api.minecraftservices.com/minecraft/profile/lookup/name/%s");
 
 	public KeyBinding keyAttack = new KeyBinding("key.attack").setDefault(InputDevice.mouse, 0);
 	public KeyBinding keyInteract = new KeyBinding("key.interact").setDefault(InputDevice.mouse, 1);
diff --git a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
index 091088182..6e0880f0a 100644
--- a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
+++ b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
@@ -112,8 +112,10 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
         GL11.glTranslatef(0 * scale, height * scale, 1.05f * scale);
         GL11.glNormal3f(0, 0, 1);
         GL11.glDepthMask(false);
+        GL11.glColor3f(1, 1, 1);
         final EnumSignPicture picture = tileEntity.getPicture();
         if (picture != EnumSignPicture.NONE) drawTexturedModalRect(1, 0.5, colorSign,TextureRegistry.getTexture(picture.getTextureKey()));
+        GL11.glDisable(GL11.GL_BLEND);
         GL11.glPopMatrix();
 
         // Render text
diff --git a/game/core/src/main/java/com/b100/utils/StringUtils.java b/game/core/src/main/java/com/b100/utils/StringUtils.java
index f128246e5..0a601c351 100644
--- a/game/core/src/main/java/com/b100/utils/StringUtils.java
+++ b/game/core/src/main/java/com/b100/utils/StringUtils.java
@@ -1,11 +1,16 @@
 package com.b100.utils;
 
+import net.minecraft.core.net.CertificateHelper;
+
+import javax.net.ssl.HttpsURLConnection;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileWriter;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.net.URL;
+import java.net.URLConnection;
 import java.nio.file.Files;
 import java.util.List;
 
@@ -94,7 +99,15 @@ public abstract class StringUtils {
 		}
 		
 		try {
-			is = u.openStream();
+			URLConnection connection = u.openConnection();
+			if (connection instanceof HttpsURLConnection) {
+				connection.setDoInput(true);
+				connection.setDoOutput(false);
+				CertificateHelper.install((HttpsURLConnection) connection);
+			}
+			connection.connect();
+
+			is = connection.getInputStream();
 		}catch (Exception e) {
 			throw new RuntimeException(u.toString(), e);
 		}
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicFluid.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicFluid.java
index c65f10328..6453b91a7 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicFluid.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicFluid.java
@@ -22,7 +22,6 @@ public abstract class BlockLogicFluid extends BlockLogic
     {
         super(block, material);
         setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
-        block.setTicking(true);
     }
 
     public static float getWaterVolume(int data)
diff --git a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntity.java b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntity.java
index c076eca63..440d6f081 100644
--- a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntity.java
+++ b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntity.java
@@ -161,7 +161,7 @@ public abstract class TileEntity implements ICarriable
         world.notifyBlockChange(x, y, z, carriedBlock.blockId);
         if (carriedBlock.blockId != 0 && Blocks.getBlock(carriedBlock.blockId).isSignalSource()) {
             for (Side s : Side.sides){
-                worldObj.notifyBlocksOfNeighborChange(x + s.getOffsetX(), y + s.getOffsetY(), z + s.getOffsetZ(), getBlockId());
+                world.notifyBlocksOfNeighborChange(x + s.getOffsetX(), y + s.getOffsetY(), z + s.getOffsetZ(), getBlockId());
             }
         }
         return true;
diff --git a/game/core/src/main/java/net/minecraft/core/entity/animal/MobWolf.java b/game/core/src/main/java/net/minecraft/core/entity/animal/MobWolf.java
index 557c8ca65..7ee1a5e65 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/animal/MobWolf.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/animal/MobWolf.java
@@ -443,7 +443,7 @@ public class MobWolf
                 if(entity instanceof EntityItem && (this.getHeldItem() == null || this.getHeldItem().getItem() == null)){
                     EntityItem entityItem = (EntityItem) entity;
 
-                    if (entityItem.item != null && entityItem.item.stackSize > 0) {
+                    if (entityItem.item != null && entityItem.item.stackSize > 0 && entityItem.pickupDelay == 0) {
                         setHeldItem(entityItem.item.copy());
                         entityItem.item.stackSize = 0;
                         entity.outOfWorld();
@@ -800,6 +800,11 @@ public class MobWolf
                     return true;
                 }
             }
+            if (itemstack == null && player.isSneaking() && armor != null && player.uuid.equals(getWolfOwner())) {
+                dropItem(armor, 0.0f);
+                setArmor(null);
+                return true;
+            }
             if(player.uuid.equals(getWolfOwner()))
             {
                 if(!world.isClientSide)
diff --git a/game/core/src/main/java/net/minecraft/core/entity/vehicle/EntityMinecart.java b/game/core/src/main/java/net/minecraft/core/entity/vehicle/EntityMinecart.java
index d7c7f3846..1be41b0cf 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/vehicle/EntityMinecart.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/vehicle/EntityMinecart.java
@@ -391,7 +391,7 @@ public class EntityMinecart extends Entity implements Container {
             setPos(x, y + (double) heightOffset, z);
 
             // Let passenger push minecart slowly
-            if(passenger != null && Math.hypot(xd, zd) < 0.01f) {
+            if(passenger != null && passenger instanceof Player && Math.hypot(xd, zd) < 0.01f) {
                 xd += passenger.xd * 0.05;
                 zd += passenger.zd * 0.05;
             }
diff --git a/game/core/src/main/java/net/minecraft/core/net/CertificateHelper.java b/game/core/src/main/java/net/minecraft/core/net/CertificateHelper.java
new file mode 100644
index 000000000..074dff5ea
--- /dev/null
+++ b/game/core/src/main/java/net/minecraft/core/net/CertificateHelper.java
@@ -0,0 +1,185 @@
+package net.minecraft.core.net;
+
+import com.b100.utils.StringUtils;
+import com.mojang.logging.LogUtils;
+import net.minecraft.core.Global;
+import org.slf4j.Logger;
+
+import javax.net.ssl.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.security.GeneralSecurityException;
+import java.security.KeyStore;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Objects;
+
+// Thanks ReIndev team!
+public final class CertificateHelper {
+    private static final Logger LOGGER = LogUtils.getLogger();
+    private static SSLSocketFactory factory;
+    private static final String prefix = "/certificates/";
+    private static final String[] certificates = new String[]{
+        // Let's Encrypt
+        "ISRG-Root-X1.pem", "ISRG-Root-X2.pem",
+        // DigiCert
+        "DigiCert-Global-Root-CA.pem",
+        "DigiCert-Global-Root-G2.pem", "DigiCert-Global-Root-G3.pem",
+        // Google Trust services
+        "GTS-Root-R1.pem", "GTS-Root-R2.pem",
+        "GTS-Root-R3.pem", "GTS-Root-R4.pem",
+        // USERTrust
+        "USERTrust-ECC-Certification-Authority.pem"
+    };
+
+    public static void installCertificates() throws Exception {
+        LOGGER.info("Using bundled let's encrypt certificates");
+        TrustManagerFactory tmf = TrustManagerFactory.getInstance(
+                TrustManagerFactory.getDefaultAlgorithm());
+        X509TrustManager letsEncryptTrustManager = makeLetsEncryptTrustManager();
+        tmf.init((KeyStore) null);
+        SSLContext sslContext = SSLContext.getInstance("TLS");
+        TrustManager[] systemTrustManagers = tmf.getTrustManagers();
+        X509TrustManager systemTrustManager;
+        if (systemTrustManagers.length != 1 || !(systemTrustManagers[0] instanceof X509TrustManager)) {
+            throw new IllegalStateException("Unexpected default trust managers:" +
+                    Arrays.toString(systemTrustManagers));
+        }
+        systemTrustManager = (X509TrustManager) systemTrustManagers[0];
+        sslContext.init(null, new TrustManager[]{
+                new X509DualTrustManager(letsEncryptTrustManager, systemTrustManager)
+        }, null);
+        factory = sslContext.getSocketFactory();
+    }
+
+    public static void install(HttpsURLConnection connection) {
+        if (factory != null) {
+            connection.setSSLSocketFactory(factory);
+        }
+    }
+
+    public static SSLSocketFactory getFactory() {
+        return factory;
+    }
+
+    public static X509TrustManager makeLetsEncryptTrustManager()
+            throws GeneralSecurityException, IOException {
+        LinkedList<Certificate> certificates = new LinkedList<>();
+        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
+        for (String certificate : CertificateHelper.certificates) {
+            try {
+                certificates.addAll(certificateFactory.generateCertificates(Objects.requireNonNull(
+                    CertificateHelper.class.getResourceAsStream(prefix + certificate))));
+            } catch (Exception e) {
+                LOGGER.warn("Failed to generate cerfiticate for: {}", certificate, e);
+            }
+        }
+
+        // Put the certificates a key store.
+        char[] password = "password".toCharArray(); // Any password will work.
+        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+        keyStore.load(null, password);
+        int index = 0;
+        for (Certificate certificate : certificates) {
+            String certificateAlias = Integer.toString(index++);
+            keyStore.setCertificateEntry(certificateAlias, certificate);
+        }
+
+        // Use it to build an X509 trust manager.
+        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+        keyManagerFactory.init(keyStore, password);
+        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+        trustManagerFactory.init(keyStore);
+        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
+        if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
+            throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
+        }
+
+        return (X509TrustManager) trustManagers[0];
+    }
+
+    public static InputStream getWebsiteAsStream(String url) {
+        StringUtils.validateStringNotEmpty(url);
+
+        URL u = null;
+
+        try {
+            u = new URL(url);
+        } catch (Exception e) {
+            throw new RuntimeException(url, e);
+        }
+
+        try {
+            URLConnection connection = u.openConnection();
+            if (connection instanceof HttpsURLConnection) {
+                connection.setDoInput(true);
+                connection.setDoOutput(false);
+                CertificateHelper.install((HttpsURLConnection) connection);
+            }
+            connection.connect();
+            return connection.getInputStream();
+        } catch (IOException e) {
+            throw new RuntimeException(u.toString(), e);
+        }
+    }
+
+    public static InputStream getWebsiteAsStream(URL url) {
+        try {
+            URLConnection connection = url.openConnection();
+            if (connection instanceof HttpsURLConnection) {
+                connection.setDoInput(true);
+                connection.setDoOutput(false);
+                CertificateHelper.install((HttpsURLConnection) connection);
+            }
+            connection.connect();
+            return connection.getInputStream();
+        } catch (IOException e) {
+            throw new RuntimeException(url.toString(), e);
+        }
+    }
+
+    public static class X509DualTrustManager implements X509TrustManager {
+        private final X509TrustManager letsEncrypt;
+        private final X509TrustManager system;
+        private final X509Certificate[] certificates;
+
+        public X509DualTrustManager(X509TrustManager letsEncrypt, X509TrustManager system) {
+            this.letsEncrypt = letsEncrypt;
+            this.system = system;
+            HashSet<X509Certificate> certificates = new HashSet<>();
+            certificates.addAll(Arrays.asList(this.letsEncrypt.getAcceptedIssuers()));
+            certificates.addAll(Arrays.asList(this.system.getAcceptedIssuers()));
+            this.certificates = certificates.toArray(new X509Certificate[0]);
+        }
+
+        @Override
+        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+            try {
+                this.letsEncrypt.checkClientTrusted(chain, authType);
+            } catch (CertificateException | SecurityException e) {
+                this.system.checkClientTrusted(chain, authType);
+            }
+        }
+
+        @Override
+        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+            try {
+                this.letsEncrypt.checkServerTrusted(chain, authType);
+            } catch (CertificateException | SecurityException e) {
+                this.system.checkServerTrusted(chain, authType);
+            }
+        }
+
+        @Override
+        public X509Certificate[] getAcceptedIssuers() {
+            return this.certificates;
+        }
+    }
+}
diff --git a/game/core/src/main/java/net/minecraft/core/net/PropertyManager.java b/game/core/src/main/java/net/minecraft/core/net/PropertyManager.java
index 6d9908328..ea1b77748 100644
--- a/game/core/src/main/java/net/minecraft/core/net/PropertyManager.java
+++ b/game/core/src/main/java/net/minecraft/core/net/PropertyManager.java
@@ -53,56 +53,56 @@ public class PropertyManager
         }
     }
 
-    public String getStringProperty(String s, String s1)
+    public String getStringProperty(String key, String defaultValue)
     {
-        if(!serverProperties.containsKey(s))
+        if(!serverProperties.containsKey(key))
         {
-            serverProperties.setProperty(s, s1);
+            serverProperties.setProperty(key, defaultValue);
             saveProperties();
         }
-        return serverProperties.getProperty(s, s1);
+        return serverProperties.getProperty(key, defaultValue);
     }
 
-    public int getIntProperty(String s, int i)
+    public int getIntProperty(String key, int value)
     {
         try
         {
-            return Integer.parseInt(getStringProperty(s, "" + i));
+            return Integer.parseInt(getStringProperty(key, Integer.toString(value)));
         }
         catch(Exception exception)
         {
-            serverProperties.setProperty(s, "" + i);
+            serverProperties.setProperty(key, Integer.toString(value));
         }
-        return i;
+        return value;
     }
 
-    public boolean getBooleanProperty(String s, boolean flag)
+    public boolean getBooleanProperty(String key, boolean defaultValue)
     {
         try
         {
-            return Boolean.parseBoolean(getStringProperty(s, "" + flag));
+            return Boolean.parseBoolean(getStringProperty(key, Boolean.toString(defaultValue)));
         }
         catch(Exception exception)
         {
-            serverProperties.setProperty(s, "" + flag);
+            serverProperties.setProperty(key, Boolean.toString(defaultValue));
         }
-        return flag;
+        return defaultValue;
     }
 
-    public void setProperty(String s, boolean flag)
+    public void setProperty(String key, boolean value)
     {
-        serverProperties.setProperty(s, "" + flag);
+        serverProperties.setProperty(key, Boolean.toString(value));
         saveProperties();
     }
 
-    public void setProperty(String s, int value)
+    public void setProperty(String key, int value)
     {
-    	serverProperties.setProperty(s, "" + value);
+    	serverProperties.setProperty(key, Integer.toString(value));
     }
 
-    public void setProperty(String s1, String s2)
+    public void setProperty(String key, String value)
     {
-        serverProperties.setProperty(s1, s2);
+        serverProperties.setProperty(key, value);
     }
 
     public static Logger logger = LogUtils.getLogger();
diff --git a/game/core/src/main/java/net/minecraft/core/util/helper/UUIDHelper.java b/game/core/src/main/java/net/minecraft/core/util/helper/UUIDHelper.java
index 2930106f7..e20989006 100644
--- a/game/core/src/main/java/net/minecraft/core/util/helper/UUIDHelper.java
+++ b/game/core/src/main/java/net/minecraft/core/util/helper/UUIDHelper.java
@@ -3,16 +3,19 @@ package net.minecraft.core.util.helper;
 import com.b100.json.JsonParser;
 import com.b100.json.element.JsonObject;
 import com.b100.utils.StringUtils;
+import com.mojang.logging.LogUtils;
 import com.mojang.nbt.tags.CompoundTag;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.slf4j.Logger;
 
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
 public class UUIDHelper {
-    private static final String urlUUID = "https://api.mojang.com/users/profiles/minecraft/";
+    private static final Logger LOGGER = LogUtils.getLogger();
+    public static String urlUUID = "https://api.minecraftservices.com/minecraft/profile/lookup/name/%s";
 
     private static final JsonParser jsonParser = new JsonParser();
     public static final Map<String, UUID> nameToUUIDMap = new HashMap<>();
@@ -63,14 +66,13 @@ public class UUIDHelper {
         }
         String string;
         try{
-            string = StringUtils.getWebsiteContentAsString(urlUUID + username);
+            string = StringUtils.getWebsiteContentAsString(String.format(urlUUID, username));
         }catch (Exception e) {
-            System.err.println("Can't connect to Mojang API.");
-            e.printStackTrace();
+            LOGGER.error("Can't connect to Mojang API.", e);
             return null;
         }
         if(string.isEmpty()) {
-            System.err.println("Player "+username+" doesn't exist!");
+            LOGGER.error("Player {} doesn't exist!", username);
             return null;
         }
         String uuid;
@@ -112,9 +114,11 @@ public class UUIDHelper {
         }
     }
 
+    @FunctionalInterface
     public interface StringFunction {
         void run(String s);
     }
+    @FunctionalInterface
     public interface UUIDFunction {
         void run(UUID s);
     }
diff --git a/game/core/src/main/java/net/minecraft/core/world/chunk/Chunk.java b/game/core/src/main/java/net/minecraft/core/world/chunk/Chunk.java
index b0f0fa846..f0397e2bc 100644
--- a/game/core/src/main/java/net/minecraft/core/world/chunk/Chunk.java
+++ b/game/core/src/main/java/net/minecraft/core/world/chunk/Chunk.java
@@ -539,7 +539,7 @@ public class Chunk
         Block<?> b = Blocks.blocksList[getBlockID(x, y, z)];
         if (b == null || !b.isEntityTile)
         {
-            LOGGER.warn("Attempted to place a tile entity where there was no entity tile!");
+            LOGGER.warn("Attempted to place a tile entity {} at {} {} {} where there was no tile entity block!", tileEntity.getClass(), x, y, z);
             Thread.dumpStack();
         }
         else
diff --git a/game/core/src/main/resources/certificates/DigiCert-Global-Root-CA.pem b/game/core/src/main/resources/certificates/DigiCert-Global-Root-CA.pem
new file mode 100644
index 000000000..fd4341df2
--- /dev/null
+++ b/game/core/src/main/resources/certificates/DigiCert-Global-Root-CA.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
+CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
+nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
+43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
+T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
+gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
+TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
+DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
+hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
+06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
+PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
+YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
diff --git a/game/core/src/main/resources/certificates/DigiCert-Global-Root-G2.pem b/game/core/src/main/resources/certificates/DigiCert-Global-Root-G2.pem
new file mode 100644
index 000000000..798e00275
--- /dev/null
+++ b/game/core/src/main/resources/certificates/DigiCert-Global-Root-G2.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
+MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
+2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
+1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
+q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
+tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
+vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
+5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
+1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
+NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
+Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
+8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
+pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
diff --git a/game/core/src/main/resources/certificates/DigiCert-Global-Root-G3.pem b/game/core/src/main/resources/certificates/DigiCert-Global-Root-G3.pem
new file mode 100644
index 000000000..bc20c1e14
--- /dev/null
+++ b/game/core/src/main/resources/certificates/DigiCert-Global-Root-G3.pem
@@ -0,0 +1,15 @@
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
+CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
+ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
+Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
+EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
+IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
+K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
+fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
+Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
+BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
+AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
+oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
+sycX
+-----END CERTIFICATE-----
diff --git a/game/core/src/main/resources/certificates/GTS-Root-R1.pem b/game/core/src/main/resources/certificates/GTS-Root-R1.pem
new file mode 100644
index 000000000..a13aa0564
--- /dev/null
+++ b/game/core/src/main/resources/certificates/GTS-Root-R1.pem
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw
+CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU
+MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw
+MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp
+Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo
+27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w
+Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw
+TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl
+qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH
+szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8
+Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk
+MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92
+wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p
+aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN
+VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID
+AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb
+C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe
+QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy
+h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4
+7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J
+ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef
+MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/
+Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT
+6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ
+0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm
+2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb
+bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c
+-----END CERTIFICATE-----
diff --git a/game/core/src/main/resources/certificates/GTS-Root-R2.pem b/game/core/src/main/resources/certificates/GTS-Root-R2.pem
new file mode 100644
index 000000000..bd3f3a735
--- /dev/null
+++ b/game/core/src/main/resources/certificates/GTS-Root-R2.pem
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw
+CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU
+MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw
+MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp
+Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt
+nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY
+6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu
+MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k
+RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg
+f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV
++3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo
+dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW
+Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa
+G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq
+gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID
+AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H
+vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8
+0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC
+B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u
+NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg
+yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev
+HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6
+xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR
+TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg
+JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV
+7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl
+6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL
+-----END CERTIFICATE-----
diff --git a/game/core/src/main/resources/certificates/GTS-Root-R3.pem b/game/core/src/main/resources/certificates/GTS-Root-R3.pem
new file mode 100644
index 000000000..b2b5a775d
--- /dev/null
+++ b/game/core/src/main/resources/certificates/GTS-Root-R3.pem
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD
+VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG
+A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw
+WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz
+IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
+AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G
+jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2
+4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
+BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7
+VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm
+ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X
+-----END CERTIFICATE-----
diff --git a/game/core/src/main/resources/certificates/GTS-Root-R4.pem b/game/core/src/main/resources/certificates/GTS-Root-R4.pem
new file mode 100644
index 000000000..fdb2d1bdf
--- /dev/null
+++ b/game/core/src/main/resources/certificates/GTS-Root-R4.pem
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD
+VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG
+A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw
+WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz
+IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
+AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi
+QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR
+HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
+BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D
+9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8
+p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD
+-----END CERTIFICATE-----
diff --git a/game/core/src/main/resources/certificates/ISRG-Root-X1.pem b/game/core/src/main/resources/certificates/ISRG-Root-X1.pem
new file mode 100644
index 000000000..b85c8037f
--- /dev/null
+++ b/game/core/src/main/resources/certificates/ISRG-Root-X1.pem
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
+TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
+cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
+WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
+ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
+MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
+h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
+0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
+A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
+T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
+B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
+B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
+KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
+OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
+jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
+qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
+rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
+hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
+3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
+NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
+ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
+TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
+jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
+oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
+4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
+mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
+emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
diff --git a/game/core/src/main/resources/certificates/ISRG-Root-X2.pem b/game/core/src/main/resources/certificates/ISRG-Root-X2.pem
new file mode 100644
index 000000000..51cd44c30
--- /dev/null
+++ b/game/core/src/main/resources/certificates/ISRG-Root-X2.pem
@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE-----
+MIIEYDCCAkigAwIBAgIQB55JKIY3b9QISMI/xjHkYzANBgkqhkiG9w0BAQsFADBP
+MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
+Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yMDA5MDQwMDAwMDBa
+Fw0yNTA5MTUxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5l
+dCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgy
+MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H
+ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7
+AlF9ItgKbppbd9/w+kHsOdx1ymgHDB/qo4HlMIHiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR8Qpau3ktIO/qS+J6Mz22LqXI3lTAf
+BgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQw
+IgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wJwYDVR0fBCAwHjAc
+oBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzAiBgNVHSAEGzAZMAgGBmeBDAEC
+ATANBgsrBgEEAYLfEwEBATANBgkqhkiG9w0BAQsFAAOCAgEAG38lK5B6CHYAdxjh
+wy6KNkxBfr8XS+Mw11sMfpyWmG97sGjAJETM4vL80erb0p8B+RdNDJ1V/aWtbdIv
+P0tywC6uc8clFlfCPhWt4DHRCoSEbGJ4QjEiRhrtekC/lxaBRHfKbHtdIVwH8hGR
+Ib/hL8Lvbv0FIOS093nzLbs3KvDGsaysUfUfs1oeZs5YBxg4f3GpPIO617yCnpp2
+D56wKf3L84kHSBv+q5MuFCENX6+Ot1SrXQ7UW0xx0JLqPaM2m3wf4DtVudhTU8yD
+ZrtK3IEGABiL9LPXSLETQbnEtp7PLHeOQiALgH6fxatI27xvBI1sRikCDXCKHfES
+c7ZGJEKeKhcY46zHmMJyzG0tdm3dLCsmlqXPIQgb5dovy++fc5Ou+DZfR4+XKM6r
+4pgmmIv97igyIintTJUJxCD6B+GGLET2gUfA5GIy7R3YPEiIlsNekbave1mk7uOG
+nMeIWMooKmZVm4WAuR3YQCvJHBM8qevemcIWQPb1pK4qJWxSuscETLQyu/w4XKAM
+YXtX7HdOUM+vBqIPN4zhDtLTLxq9nHE+zOH40aijvQT2GcD5hq/1DhqqlWvvykdx
+S2McTZbbVSMKnQ+BdaDmQPVkRgNuzvpqfQbspDQGdNpT2Lm4xiN9qfgqLaSCpi4t
+EcrmzTFYeYXmchynn9NM0GbQp7s=
+-----END CERTIFICATE-----
diff --git a/game/core/src/main/resources/certificates/USERTrust-ECC-Certification-Authority.pem b/game/core/src/main/resources/certificates/USERTrust-ECC-Certification-Authority.pem
new file mode 100644
index 000000000..b1cf1fd3a
--- /dev/null
+++ b/game/core/src/main/resources/certificates/USERTrust-ECC-Certification-Authority.pem
@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
+MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
+eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
+JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
+MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
+Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
+VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
+I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
+o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
+A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
+zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
+RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
diff --git a/game/core/src/main/resources/lang/en_US/gui.lang b/game/core/src/main/resources/lang/en_US/gui.lang
index db6c86912..8b02d1c14 100644
--- a/game/core/src/main/resources/lang/en_US/gui.lang
+++ b/game/core/src/main/resources/lang/en_US/gui.lang
@@ -33,10 +33,10 @@ gui.bad_java_arch.label.body.4=Please consider downloading a 64-bit JRE such as
 gui.bad_java_arch.button.download=Download
 gui.bad_java_arch.button.continue=Continue
 
-gui.no_jce.label.title=Java Cryptography Extension (JCE) not present!
+gui.no_jce.label.title=§l§4Java Cryptography Extension (JCE) not present!§r
 gui.no_jce.label.body.1=It looks like you're running Better than Adventure! without JCE.
-gui.no_jce.label.body.2=This will break some network related features like downloading
-gui.no_jce.label.body.3=sounds and multiplayer chatting!
+gui.no_jce.label.body.2=§l§eThis will break some features like multiplayer!§r
+gui.no_jce.label.body.3=
 gui.no_jce.label.body.4=Please consider downloading a more up to date JRE
 gui.no_jce.label.body.5=with the extension included such as Eclipse Temurin.
 gui.no_jce.label.body.intel.disclaimer.1=Due to hardware compatibility issues on Intel Graphics hardware
@@ -46,7 +46,8 @@ gui.no_jce.button.download.recommended=Java Download (Recommended!)
 gui.no_jce.button.download=Java Download
 gui.no_jce.button.upgrade=JCE Patch
 gui.no_jce.button.upgrade.recommended=JCE Patch (Recommended!)
-gui.no_jce.button.continue=Continue
+gui.no_jce.button.back=Main Menu
+gui.no_jce.button.continue=Ignore Warning
 
 gui.no_minecraft.label.title=Minecraft Beta 1.7.3 is Missing!
 gui.no_minecraft.label.body.1=It looks like you're running Better than Adventure! without Minecraft Beta 1.7.3.
@@ -322,6 +323,7 @@ gui.select_server.button.done=Done
 gui.select_server.button.show_ip=Show IP: %s
 gui.select_server.button.show_ip.on=ON
 gui.select_server.button.show_ip.off=OFF
+gui.select_server.button.no_jce.warning=§l§eJCE Missing!
 
 gui.select_world.label.title=Select World
 gui.select_world.label.world=World %s
diff --git a/game/core/src/main/resources/lang/en_US/options.lang b/game/core/src/main/resources/lang/en_US/options.lang
index 953aaf240..175826e55 100644
--- a/game/core/src/main/resources/lang/en_US/options.lang
+++ b/game/core/src/main/resources/lang/en_US/options.lang
@@ -185,6 +185,7 @@ options.enableHolidayTextures=Enable Holiday Textures
 options.dynamicCursor=Dynamic Cursor
 options.enableDevResourceLoading=Developer Resource Loading
 options.enableMultiDrawRendering=Enable Multi-Draw Renderer (experimental!)
+options.doJCECheck=Do JCE Check
 
 options.fov.modification=Contextual FOV Modification
 options.screen.motion.effects=Screen Motion Effects
diff --git a/game/server/src/main/java/net/minecraft/server/MinecraftServer.java b/game/server/src/main/java/net/minecraft/server/MinecraftServer.java
index afaffe79b..cf4398576 100644
--- a/game/server/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/game/server/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -55,6 +55,7 @@ import net.minecraft.core.net.command.commands.CommandTestFor;
 import net.minecraft.core.net.command.commands.CommandTime;
 import net.minecraft.core.net.command.commands.CommandWeather;
 import net.minecraft.core.net.command.util.CommandHelper;
+import net.minecraft.core.util.helper.UUIDHelper;
 import net.minecraft.server.entity.player.PlayerServer;
 import net.minecraft.server.net.command.ConsoleCommandSource;
 import net.minecraft.core.net.packet.PacketSetTime;
@@ -255,6 +256,7 @@ public class MinecraftServer
         chunksSavedPerAutosave = propertyManager.getIntProperty("maxChunksSavedPerAutosave", 24);
         forceSaveAllChunksOnAutosave = propertyManager.getBooleanProperty("forceSaveAllChunksOnAutosave", false);
         EntityItem.enableItemClumping = propertyManager.getBooleanProperty("enable-item-clumping", true);
+        UUIDHelper.urlUUID = propertyManager.getStringProperty("uuid-service", "https://api.minecraftservices.com/minecraft/profile/lookup/name/%s");
 
         String gamemodeProperty = propertyManager.getStringProperty("default-gamemode", "survival");
         defaultGamemode = null;
