diff --git a/game/client/instance/instance.cfg b/game/client/instance/instance.cfg
index 1d39f319c..cebfd7697 100644
--- a/game/client/instance/instance.cfg
+++ b/game/client/instance/instance.cfg
@@ -1,4 +1,7 @@
 InstanceType=OneSix
+AutomaticJava=true
+JavaVendor=Adoptium
+JavaVersion=17.0.19
 iconKey=v$version
 name=Better than Adventure! (Managed)
 JvmArgs=-XX:+UseG1GC -Dsun.rmi.dgc.server.gcInterval=2147483646 -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M
diff --git a/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java b/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
index 2b86ed7c2..c01819b59 100644
--- a/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
+++ b/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
@@ -107,7 +107,7 @@ public class PlayerLocal extends Player {
     }
 
     @Override
-    public void setGamemode(Gamemode gamemode) {
+    public void setGamemode(@NotNull Gamemode gamemode) {
         this.gamemode = gamemode;
 
         MenuInventory newContainer = gamemode.getInventoryMenu(this.inventory);
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 de82047a8..a31e8bfa7 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
@@ -82,6 +82,7 @@ public abstract class OptionsPages {
                 .withComponent(new ToggleableOptionComponent<>(GameSettings.PLACEMENT_MODE))
                 .withComponent(new BooleanOptionComponent(GameSettings.AUTO_HIT))
                 .withComponent(new BooleanOptionComponent(GameSettings.EASY_BRIDGE))
+                .withComponent(new BooleanOptionComponent(GameSettings.EASY_BRIDGE_OUTLINE))
                 .withComponent(new BooleanOptionComponent(GameSettings.VIEW_BOBBING))
             )
             .withComponent(new OptionsCategory("gui.options.page.general.category.user_interface")
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 9f8e0ff4f..8d835be10 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
@@ -169,6 +169,7 @@ public final class GameSettings {
     public static final @NotNull OptionString SHADER_OVERRIDE = register(new OptionString("shaderOverride", ""));
     public static final @NotNull OptionBoolean AUTO_HIT = register(new OptionBoolean("autoHit", true));
     public static final @NotNull OptionBoolean EASY_BRIDGE = register(new OptionBoolean("easyBridge", true));
+    public static final @NotNull OptionBoolean EASY_BRIDGE_OUTLINE = register(new OptionBoolean("easyBridgeOutline", true));
     public static final @NotNull OptionBoolean FOOD_HEALTH_REGEN_OVERLAY = register(new OptionBoolean("foodHealthRegenOverlay", true));
     public static final @NotNull OptionBoolean FPS_IN_OVERLAY = register(new OptionBoolean("fpsInOverlay", false));
     public static final @NotNull OptionBoolean VERSION_IN_OVERLAY = register(new OptionBoolean("versionInOverlay", false));
diff --git a/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java b/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java
index c299780a8..08b4c481e 100644
--- a/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java
@@ -62,7 +62,6 @@ import net.minecraft.core.world.weather.Weather;
 import org.lwjgl.opengl.GL41;
 import org.slf4j.Logger;
 
-import java.util.List;
 import java.util.Random;
 
 public class WorldRenderer {
@@ -719,7 +718,7 @@ public class WorldRenderer {
             }
             renderGlobal.drawSelectionBox(this.mc.activeCamera, this.mc.objectMouseOver, partialTicks);
 //            glEnable(GL_ALPHA_TEST);
-        } else if (this.mc.canBridge) {
+        } else if (this.mc.canBridge && GameSettings.EASY_BRIDGE_OUTLINE.value) {
             renderGlobal.drawTileSelectionBox(this.mc.activeCamera, this.mc.bridgePos, partialTicks);
         }
 
@@ -755,7 +754,7 @@ public class WorldRenderer {
 //            glDisable(GL_ALPHA_TEST);
             renderGlobal.drawSelectionBox(this.mc.activeCamera, this.mc.objectMouseOver, partialTicks);
 //            glEnable(GL_ALPHA_TEST);
-        } else if (this.mc.canBridge) {
+        } else if (this.mc.canBridge && GameSettings.EASY_BRIDGE_OUTLINE.value) {
             renderGlobal.drawTileSelectionBox(this.mc.activeCamera, this.mc.bridgePos, partialTicks);
         }
 
diff --git a/game/client/src/main/java/net/minecraft/client/world/WorldClientMP.java b/game/client/src/main/java/net/minecraft/client/world/WorldClientMP.java
index 8ac8fc20e..35c3c8e83 100644
--- a/game/client/src/main/java/net/minecraft/client/world/WorldClientMP.java
+++ b/game/client/src/main/java/net/minecraft/client/world/WorldClientMP.java
@@ -23,6 +23,7 @@ import net.minecraft.core.world.settings.WorldConfiguration;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.Set;
@@ -62,10 +63,13 @@ public class WorldClientMP extends WorldClient {
             this.getLevelData().setWorldTime(this.getLevelData().getWorldTime() + 1L);
         }
         this.getLevelData().setTotalWorldTime(this.getLevelData().getTotalWorldTime() + 1L);
-        for (int k = 0; k < 10 && !this.reEntries.isEmpty(); k++) {
-            Entity entity = this.reEntries.iterator().next();
-            if (!this.entities.contains(entity)) {
-                entityJoinedWorld(entity);
+        if (!this.reEntries.isEmpty()) {
+            // reEntries.iterator().next() could return the same failing entity forever, leaving every other entity invisible.
+            for (Entity entity : new ArrayList<>(this.reEntries)) {
+                this.reEntries.remove(entity);
+                if (!this.entities.contains(entity)) {
+                    entityJoinedWorld(entity);
+                }
             }
         }
 
diff --git a/game/client/src/main/resources/credits.txt b/game/client/src/main/resources/credits.txt
index cef07c221..02d46efa7 100644
--- a/game/client/src/main/resources/credits.txt
+++ b/game/client/src/main/resources/credits.txt
@@ -82,6 +82,7 @@ mzov4j
 --Deer model
 PedroThePanda64 (@agreathornedowl)
 --Shader fixes and improvements
+--Acid shader fix
 --Dog music track fix
 ph
 --Venison texture
diff --git a/game/client/src/main/resources/shaders/acid_overlay.fsh b/game/client/src/main/resources/shaders/acid_overlay.fsh
index adc932444..6bf53fde3 100644
--- a/game/client/src/main/resources/shaders/acid_overlay.fsh
+++ b/game/client/src/main/resources/shaders/acid_overlay.fsh
@@ -2,7 +2,6 @@
 
 out vec4 FragColor;
 
-in vec4 Color;
 in vec2 TexCoord;
 
 uniform float uCurrentTick;
@@ -10,6 +9,32 @@ uniform vec4  uColor;
 uniform float uAlphaTest;
 uniform vec2  uViewPortSize;
 
+// https://www.shadertoy.com/view/4lcBWn
+float cro(in vec2 a, in vec2 b ) { return a.x*b.y - a.y*b.x; }
+
+float sdUnevenCapsule( in vec2 p, in vec2 pa, in vec2 pb, in float ra, in float rb )
+{
+    p  -= pa;
+    pb -= pa;
+    float h = dot(pb,pb);
+    vec2  q = vec2( dot(p,vec2(pb.y,-pb.x)), dot(p,pb) )/h;
+    
+    //-----------
+    
+    q.x = abs(q.x);
+    
+    float b = ra-rb;
+    vec2  c = vec2(sqrt(h-b*b),b);
+    
+    float k = cro(c,q);
+    float m = dot(c,q);
+    float n = dot(q,q);
+    
+         if( k < 0.0 ) return sqrt(h*(n            )) - ra;
+    else if( k > c.x ) return sqrt(h*(n+1.0-2.0*q.y)) - rb;
+                       return m                       - ra;
+}
+
 void main() {
     // Vignette
     vec2 centerCoords = TexCoord - 0.5;
@@ -20,10 +45,10 @@ void main() {
     float vignetteAlpha = minVignette + vignetteRamp;
 
     // Droplets
-    float pixelScale = 8.0;
-    vec2 dropUV = floor(TexCoord * (uViewPortSize / pixelScale)) / (uViewPortSize / pixelScale);
+    float pixelScale = 128.0;
+    vec2 dropUV = floor(TexCoord * pixelScale) / pixelScale;
 
-    float cols = floor(uViewPortSize.x / 24.0);
+    float cols = 32.0;
     float streamIndex = floor(dropUV.x * cols);
     float localX = fract(dropUV.x * cols) - 0.5;
     float r1 = fract(sin(dot(vec2(streamIndex), vec2(12.9898, 78.233))) * 43758.5453);
@@ -41,7 +66,7 @@ void main() {
         float distX = abs(localX);
         float w = 0.0;
 
-        if (t > 0.25 && t < 0.75) {
+        if (t > 0.4 && t < 0.9) {
             w = 0.3;
 
             core = step(distX, 0.15);
@@ -61,4 +86,25 @@ void main() {
     float dripAlpha = 0.08 * drop * (1.0 + distSq * 2.0);
     float finalAlpha = uColor.a * (vignetteAlpha + dripAlpha);
     FragColor = vec4(col, finalAlpha);
+/*
+	float cols = 32.0;
+	float streamIndex = floor(dropUV.x * cols);
+
+	vec2 p = dropUV * cols;
+	vec2 v1 = vec2(0.5 + streamIndex, 1.0);
+	vec2 v2 = vec2(0.5 + streamIndex, 4.0);
+	float r1 = 0.1;
+	float r2 = 0.5;
+
+	float d = sdUnevenCapsule(p, v1, v2, r1, r2);
+	float drop = 1.0 - clamp(d, 0.0, 1.0);
+
+	vec3 baseColor = vec3(0.85, 1.0, 0.25);
+    vec3 dripOuter = vec3(0.65, 0.85, 0.15);
+    vec3 dripInner = vec3(0.95, 1.0, 0.25);
+    vec3 dropCol = mix(baseColor, dripInner, drop);
+    vec3 col = vec3(drop); //dropCol; //mix(baseColor, dropCol, 1.0 - drop);
+
+	FragColor = vec4(col, floor(drop));
+*/
 }
\ No newline at end of file
diff --git a/game/client/src/main/resources/shaders/acid_overlay.vsh b/game/client/src/main/resources/shaders/acid_overlay.vsh
index 775ecf1e5..9705973e2 100644
--- a/game/client/src/main/resources/shaders/acid_overlay.vsh
+++ b/game/client/src/main/resources/shaders/acid_overlay.vsh
@@ -3,7 +3,6 @@ layout (location = 0) in vec3 aPos;
 layout (location = 1) in vec4 aColor;
 layout (location = 2) in vec2 aUV;
 
-out vec4 Color;
 out vec2 TexCoord;
 
 uniform mat4 model;
@@ -16,6 +15,5 @@ layout (std140) uniform Matrices {
 
 void main() {
     gl_Position = matrices.projection * matrices.view * model * vec4(aPos, 1);
-    Color = aColor;
     TexCoord = aUV;
 }
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicConduit.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicConduit.java
index ba134cfca..8c1af0d91 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicConduit.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicConduit.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.block.entity.TileEntityActivator;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.current.util.BlockState;
 import net.minecraft.core.block.piston.BlockLogicPistonBase;
@@ -243,6 +244,12 @@ public class BlockLogicConduit extends BlockLogic
             }
         }
 
+        return cycleFace(world, cTilePos, player, side, holdingConduit);
+    }
+
+    private boolean cycleFace(final @NotNull World world, final @NotNull TilePosc cTilePos, final @Nullable Player player, final @NotNull Side side, final boolean holdingConduit) {
+        int cData = world.getBlockData(cTilePos);
+
         if (isInert(cData)) {
             return false;
         }
@@ -275,11 +282,16 @@ public class BlockLogicConduit extends BlockLogic
 
         world.playSoundEffect(player, SoundCategory.WORLD_SOUNDS, cTilePos.x(), cTilePos.y(), cTilePos.z(), "tile.activator.use", 1, 1.2f);
         world.playSoundEffect(player, SoundCategory.WORLD_SOUNDS, cTilePos.x(), cTilePos.y(), cTilePos.z(), "note.hat", 0.7f, 0.4f);
-        world.playBlockEvent(cTilePos, LevelListener.EVENT_CONDUIT_PORT_PARTICLES, packEventConduitData(side, getPower(nextData)));
+        world.playBlockEvent(cTilePos, LevelListener.EVENT_CONDUIT_PORT_PARTICLES, packEventConduitData(side, getPower(world, cTilePos)));
 
         return true;
     }
 
+    @Override
+    public void onActivatorInteracted(final @NotNull World world, final @NotNull TilePosc tilePos, final @NotNull TileEntityActivator activator, final @NotNull Direction direction) {
+        cycleFace(world, tilePos, null, direction.opposite().side(), false);
+    }
+
     public static byte packEventConduitData(@Nullable Side side, int strength) {
         int s = Math.max(0, Math.min(PROPAGATION_LENGTH, strength));
         int sideId = (side == null) ? 0 : (side.id & 0x07);
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicStone.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicStone.java
index e25bdcd7a..a820462d5 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicStone.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicStone.java
@@ -30,10 +30,10 @@ public class BlockLogicStone extends BlockLogic {
         super.onHarvest(world, player, tilePos, data, tileEntity);
         if (
             player.getStat(Blocks.STONE.getStat(StatList.STAT_MINED)) > 0 &&
-                player.getStat(Blocks.BASALT.getStat(StatList.STAT_MINED)) > 0 &&
-                player.getStat(Blocks.GRANITE.getStat(StatList.STAT_MINED)) > 0 &&
-                player.getStat(Blocks.LIMESTONE.getStat(StatList.STAT_MINED)) > 0 &&
-                player.getStat(Blocks.PERMAFROST.getStat(StatList.STAT_MINED)) > 0) {
+            player.getStat(Blocks.BASALT.getStat(StatList.STAT_MINED)) > 0 &&
+            player.getStat(Blocks.GRANITE.getStat(StatList.STAT_MINED)) > 0 &&
+            player.getStat(Blocks.LIMESTONE.getStat(StatList.STAT_MINED)) > 0 &&
+            player.getStat(Blocks.PERMAFROST.getStat(StatList.STAT_MINED)) > 0) {
 
             player.triggerAchievement(Achievements.COLLECT_STONE);
         }
diff --git a/game/core/src/main/java/net/minecraft/core/entity/Entity.java b/game/core/src/main/java/net/minecraft/core/entity/Entity.java
index cde2b08d2..ebba016a8 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/Entity.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/Entity.java
@@ -479,46 +479,44 @@ public abstract class Entity
         double oldZd = zd;
         workingBox3.set(this.bb);
 
-        double bbWidth = this.bb.maxX - this.bb.minX - 0.05;
-        if (isSneaking()) { // Edge safety behavior
-            workingBox1.setMin(this.bb.minX, this.bb.minY - 1.0, this.bb.minZ);
-            workingBox1.setMax(this.bb.maxX, this.bb.minY, this.bb.maxZ);
-            MathHelper.aabbExpand(workingBox1, xd, 0.0, zd, workingBox1);
-            List<AABBdc> collidingBoxes = this.world.getCubes(this, workingBox1);
-            if (!collidingBoxes.isEmpty()) {
-                if (xd != 0.0) {
-                    double limitX = 0.0;
-                    for (int i = 0; i < collidingBoxes.size(); i++) {
-                        AABBdc bb1 = collidingBoxes.get(i);
-                        if (xd < 0.0) {
-                            limitX = Math.min(limitX, bb1.minX() - bbWidth - this.bb.minX);
-                        } else {
-                            limitX = Math.max(limitX, bb1.maxX() + bbWidth - this.bb.maxX);
-                        }
-                    }
-                    if (xd < 0.0) {
-                        oldXd = xd = Math.max(xd, limitX);
-                    } else {
-                        oldXd = xd = Math.min(xd, limitX);
-                    }
+        if (this.onGround && isSneaking()) { // Edge safety behavior
+            double shrinkStep = 0.05;
+            while (xd != 0.0 && this.world.getCubes(this, workingBox1.set(this.bb).translate(xd, -1.0, 0.0)).isEmpty()) {
+                if (xd < shrinkStep && xd >= -shrinkStep) {
+                    xd = 0.0;
+                } else if (xd > 0.0) {
+                    xd -= shrinkStep;
+                } else {
+                    xd += shrinkStep;
                 }
-                if (zd != 0.0) {
-                    double limitZ = 0.0;
-                    for (int i = 0; i < collidingBoxes.size(); i++) {
-                        AABBdc bb1 = collidingBoxes.get(i);
-                        if (zd < 0.0) {
-                            limitZ = Math.min(limitZ, bb1.minZ() - bbWidth - this.bb.minZ);
-                        } else {
-                            limitZ = Math.max(limitZ, bb1.maxZ() + bbWidth - this.bb.maxZ);
-                        }
-                    }
-                    if (zd < 0.0) {
-                        oldZd = zd = Math.max(zd, limitZ);
-                    } else {
-                        oldZd = zd = Math.min(zd, limitZ);
-                    }
+            }
+            while (zd != 0.0 && this.world.getCubes(this, workingBox1.set(this.bb).translate(0.0, -1.0, zd)).isEmpty()) {
+                if (zd < shrinkStep && zd >= -shrinkStep) {
+                    zd = 0.0;
+                } else if (zd > 0.0) {
+                    zd -= shrinkStep;
+                } else {
+                    zd += shrinkStep;
+                }
+            }
+            while (xd != 0.0 && zd != 0.0 && this.world.getCubes(this, workingBox1.set(this.bb).translate(xd, -1.0, zd)).isEmpty()) {
+                if (xd < shrinkStep && xd >= -shrinkStep) {
+                    xd = 0.0;
+                } else if (xd > 0.0) {
+                    xd -= shrinkStep;
+                } else {
+                    xd += shrinkStep;
+                }
+                if (zd < shrinkStep && zd >= -shrinkStep) {
+                    zd = 0.0;
+                } else if (zd > 0.0) {
+                    zd -= shrinkStep;
+                } else {
+                    zd += shrinkStep;
                 }
             }
+            oldXd = xd;
+            oldZd = zd;
         }
 
         List<AABBdc> cubes = this.world.getCubes(this, MathHelper.aabbExpand(this.bb, xd, yd, zd, workingBox2));
diff --git a/game/core/src/main/java/net/minecraft/core/entity/player/Player.java b/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
index 630ef0df8..dbeb39bd4 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
@@ -622,9 +622,9 @@ public abstract class Player
 
         float progress = (float) (tier - 1) / (float) (ACID_CYCLE_MAX - 1);
 
-        float curve = (float) Math.sqrt(progress);
+        float curve = (float) Math.pow(progress, 2D);
 
-        final float multiplier = 1.0F + (curve * 0.45F);
+        final float multiplier = 1.0F + (curve * 5.0F);
 
         return Math.max(1, (int) Math.ceil(base * multiplier));
     }
@@ -1655,18 +1655,15 @@ public abstract class Player
      * Categorizes the player into Close, Medium, or Far range based on maxRadius,
      * playing a different sound for each tier.
      */
-    public void handleThermalPing(Player player, double ventCoordinateX, double ventCoordinateY, double ventCoordinateZ, double maxRadius) {
-        double distanceSquared = this.distanceToSqr(ventCoordinateX, ventCoordinateY, ventCoordinateZ);
-        double distance = Math.sqrt(distanceSquared);
-
-        double oneFifthOfRadius = maxRadius * 0.2;
-        double threeFifthsOfRadius = maxRadius * 0.6;
+    public void handleThermalPing(@NotNull Player player, double ventCoordinateX, double ventCoordinateY, double ventCoordinateZ, double maxRadius) {
+        double distance = Math.sqrt(
+            distanceToSqr(ventCoordinateX, ventCoordinateY, ventCoordinateZ)
+        );
 
         boolean isNether = player.world.getWorldType().hasTag(WorldTypeTags.NETHER);
-
         float randomizedPitch = 0.8F + (this.world.rand.nextFloat() - this.world.rand.nextFloat()) * 0.45F;
 
-        if (distance <= oneFifthOfRadius) {
+        if (distance <= maxRadius * 0.2) {
             player.playSoundToSelf(SoundCategory.WORLD_SOUNDS,
                 ventCoordinateX, ventCoordinateY, ventCoordinateZ,
             "tile.crumble", 20.0F, randomizedPitch);
@@ -1676,7 +1673,7 @@ public abstract class Player
                 "tile.deepboom", 20.0F, randomizedPitch);
             }
         }
-        else if (distance <= threeFifthsOfRadius) {
+        else if (distance <= maxRadius * 0.6) {
             player.playSoundToSelf(SoundCategory.WORLD_SOUNDS,
                 ventCoordinateX, ventCoordinateY, ventCoordinateZ,
             "tile.deepcrumble", 20.0F, randomizedPitch);
@@ -1709,7 +1706,7 @@ public abstract class Player
     }
 
 
-    public void setGamemodeOnLogin(Gamemode gamemode) {
+    public void setGamemodeOnLogin(@NotNull Gamemode gamemode) {
         this.gamemode = gamemode;
 
         MenuInventory newContainer = gamemode.getInventoryMenu(this.inventory);
@@ -1724,7 +1721,7 @@ public abstract class Player
         this.fireImmune = gamemode.hasFireImmunity();
     }
 
-    public void setGamemode(Gamemode gamemode) {
+    public void setGamemode(@NotNull Gamemode gamemode) {
         this.gamemode = gamemode;
         this.fireImmune = gamemode.hasFireImmunity();
     }
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java
index 5cd09ac5e..952dd129d 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java
@@ -5,6 +5,7 @@ import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.io.*;
@@ -32,7 +33,7 @@ public class PacketAddPlayer extends Packet
         super();
     }
 
-    public PacketAddPlayer(final Player entityplayer) {
+    public PacketAddPlayer(final @NotNull Player entityplayer) {
         super();
         this.entityId = entityplayer.id;
         this.name = entityplayer.username;
@@ -44,7 +45,7 @@ public class PacketAddPlayer extends Packet
         this.pitch = (byte) (int) ((entityplayer.xRot * 256F) / 360F);
         final ItemStack itemstack = entityplayer.inventory.getCurrentItem();
         this.currentItem = itemstack != null ? itemstack.itemID : 0;
-        this.nickname = entityplayer.getDisplayName();
+        this.nickname = entityplayer.nickname;
         this.chatColor = entityplayer.chatColor;
         this.playerConfig = entityplayer.playerConfig.config;
         if (entityplayer.getHeldObject() == null) {
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java
index dfccd0666..138522bac 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketEntityNickname.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.net.handler.PacketHandler;
+import org.jetbrains.annotations.NotNull;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
@@ -25,19 +26,21 @@ public class PacketEntityNickname extends Packet
     @Override
     public int getEstimatedSize()
     {
-        return 4 + nickname.length() + 1;
+        return 4 + 2 + (nickname.length() * 2) + 1;
     }
 
     @Override
-    public void read(DataInputStream dis) throws IOException
+    public void read(@NotNull DataInputStream dis) throws IOException
     {
+        entityId = dis.readInt();
         nickname = readStringUTF16BE(dis, MAX_NICKNAME_SIZE);
         chatColor = dis.readByte();
     }
 
     @Override
-    public void write(DataOutputStream dos) throws IOException
+    public void write(@NotNull DataOutputStream dos) throws IOException
     {
+        dos.writeInt(entityId);
         writeStringUTF16BE(nickname, dos);
         dos.writeByte(chatColor);
     }
diff --git a/game/core/src/main/java/net/minecraft/core/world/World.java b/game/core/src/main/java/net/minecraft/core/world/World.java
index b6a74bc6c..84197e86c 100644
--- a/game/core/src/main/java/net/minecraft/core/world/World.java
+++ b/game/core/src/main/java/net/minecraft/core/world/World.java
@@ -1332,7 +1332,9 @@ public abstract class World implements MutableWorldSource {
         final boolean flag = entity instanceof Player;
         if (flag || this.isChunkLoaded(i, j)) {
             if (entity instanceof final Player entityplayer) {
-                this.players.add(entityplayer);
+                if (!this.players.contains(entityplayer)) {
+                    this.players.add(entityplayer);
+                }
                 this.updateEnoughPlayersSleepingFlag(null);
             }
 
@@ -1731,6 +1733,7 @@ public abstract class World implements MutableWorldSource {
         for (int i = 0; i < list.size(); i++) {
             final Entity entity = list.get(i);
             if (entity instanceof MobFireflyCluster) continue;
+            if (entity.hasNoPhysics()) continue;
             if (!entity.removed && entity.blocksBuilding) {
                 return false;
             }
diff --git a/game/core/src/main/resources/assets/minecraft/lang/en_US/options.lang b/game/core/src/main/resources/assets/minecraft/lang/en_US/options.lang
index b5b68bd73..6e960fba6 100644
--- a/game/core/src/main/resources/assets/minecraft/lang/en_US/options.lang
+++ b/game/core/src/main/resources/assets/minecraft/lang/en_US/options.lang
@@ -99,6 +99,7 @@ options.animations.procedural=Procedural
 options.animations.off=Off
 options.autoHit=Auto Hit
 options.easyBridge=Easy Bridge
+options.easyBridgeOutline=Easy Bridge Outline
 options.controller=Controller...
 options.controllerSensitivity=Sensitivity
 options.controllerMenuSensitivity=Menu Sensitivity
diff --git a/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerEntryImpl.java b/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerEntryImpl.java
index 8bcccd211..e7b04940d 100644
--- a/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerEntryImpl.java
+++ b/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerEntryImpl.java
@@ -111,6 +111,11 @@ public class EntityTrackerEntryImpl implements EntityTrackerEntry {
                 trackedEntity.y = (double)entityY / 32D;
                 trackedEntity.z = (double)entityZ / 32D;
                 packet = new PacketTeleportEntity(trackedEntity.id, entityX, entityY, entityZ, (byte)entityYaw, (byte)entityPitch);
+                encodedPosX = entityX;
+                encodedPosY = entityY;
+                encodedPosZ = entityZ;
+                encodedRotationYaw = entityYaw;
+                encodedRotationPitch = entityPitch;
             } else if(hasMoved && hasLooked) {
                 packet = new PacketMoveEntity.PosRot(trackedEntity.id, (byte)dx, (byte)dy, (byte)dz, (byte)entityYaw, (byte)entityPitch);
             } else if(hasMoved) {
@@ -210,6 +215,9 @@ public class EntityTrackerEntryImpl implements EntityTrackerEntry {
             if(!trackedPlayers.contains(playerServer)) {
                 trackedPlayers.add(playerServer);
                 playerServer.playerNetServerHandler.sendPacket(NetEntityHandler.getSpawnPacket(this));
+                if(encodedPosX != MathHelper.floor(trackedEntity.x * 32D) || encodedPosY != MathHelper.floor(trackedEntity.y * 32D) || encodedPosZ != MathHelper.floor(trackedEntity.z * 32D)) {
+                    ticksSinceLastTeleport = 400;
+                }
                 if (trackedEntity.sendAdditionalData) {
                     playerServer.playerNetServerHandler.sendPacket(new PacketEntityTagData(trackedEntity));
                 }
diff --git a/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerImpl.java b/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerImpl.java
index d3a971d4e..893fb3a86 100644
--- a/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerImpl.java
+++ b/game/server/src/main/java/net/minecraft/server/entity/EntityTrackerImpl.java
@@ -49,8 +49,10 @@ public class EntityTrackerImpl implements EntityTracker {
         if(trackingDistance > maxTrackingDistanceThreshold) {
             trackingDistance = maxTrackingDistanceThreshold;
         }
-        if(trackedEntityHashTable.containsValue(entity.id)) {
-            throw new IllegalStateException("Entity is already tracked!");
+        EntityTrackerEntryImpl staleEntry = trackedEntityHashTable.remove(entity.id);
+        if(staleEntry != null) {
+            trackedEntitySet.remove(staleEntry);
+            staleEntry.sendDestroyEntityPacketToTrackedPlayers();
         }
         EntityTrackerEntryImpl trackerEntry = new EntityTrackerEntryImpl(entity, trackingDistance, movementPacketDelay, shouldSendMotionUpdates);
         trackedEntitySet.add(trackerEntry);
diff --git a/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java b/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java
index bb0bb3cc3..dbad29c07 100644
--- a/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java
+++ b/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java
@@ -13,7 +13,6 @@ import net.minecraft.core.enums.EnumSleepStatus;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.IComplexItem;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.lang.I18n;
 import com.mojang.nbt.tags.CompoundTag;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.player.inventory.container.Container;
@@ -98,7 +97,7 @@ public class PlayerServer extends Player implements ContainerListener {
     }
 
     @Override
-	public void setGamemode(Gamemode gamemode)
+	public void setGamemode(@NotNull Gamemode gamemode)
     {
         mcServer.playerList.sendPacketToAllPlayers(new PacketPlayerGamemode(this.id, gamemode.getId()));
         this.gamemode = gamemode;
@@ -319,6 +318,7 @@ public class PlayerServer extends Player implements ContainerListener {
                     loadedChunks.remove(chunkCoord);
                     ChunkPos sentChunkPos = new ChunkPos(chunkCoord.x, chunkCoord.z);
                     if (worldserver.isChunkLoaded(sentChunkPos)) {
+                        worldserver.getChunkProvider().ensureDecorated(sentChunkPos);
                         worldserver.getChunk(sentChunkPos, true).sentToClients = true;
                     }
                     playerNetServerHandler.sendPacket(new PacketBlockRegionUpdate(chunkCoord.x * Chunk.CHUNK_SIZE_X, 0, chunkCoord.z * Chunk.CHUNK_SIZE_Z, Chunk.CHUNK_SIZE_X, Chunk.CHUNK_SECTIONS * ChunkSection.SECTION_SIZE_Y, Chunk.CHUNK_SIZE_Z, worldserver));
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java
index 33e7512a1..f76ca3905 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandColor.java
@@ -302,6 +302,8 @@ public class CommandColor implements CommandManager.CommandRegistry {
         if (player == null) throw CommandExceptions.notInWorld().create();
 
         player.chatColor = colorId;
+        player.hadNicknameSet = true;
+        player.mcServer.playerList.updatePlayerProfile(player.username, player.nickname, player.uuid, player.score, player.chatColor, true, player.isOperator());
         TextFormatting color = TextFormatting.get(colorId);
         if (player == source.getSender()) {
             source.sendTranslatableMessage("command.commands.color.set.success", color + color.getNames()[0]);
diff --git a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java
index e33cd7990..6fc689561 100644
--- a/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java
+++ b/game/server/src/main/java/net/minecraft/server/net/command/commands/CommandNickname.java
@@ -89,7 +89,7 @@ public class CommandNickname implements CommandManager.CommandRegistry {
                         PlayerServer player = (PlayerServer) entities.get(0);
 
                         player.nickname = "";
-                        player.hadNicknameSet = false;
+                        player.hadNicknameSet = true;
                         player.mcServer.playerList.updatePlayerProfile(player.username, player.nickname, player.uuid, player.score, player.chatColor, true, player.isOperator());
                         if (source.getSender() == player) {
                             source.sendTranslatableMessage("command.commands.nickname.reset.success");
@@ -107,7 +107,7 @@ public class CommandNickname implements CommandManager.CommandRegistry {
                     if (player == null) throw CommandExceptions.notInWorld().create();
 
                     player.nickname = "";
-                    player.hadNicknameSet = false;
+                    player.hadNicknameSet = true;
                     player.mcServer.playerList.updatePlayerProfile(player.username, player.nickname, player.uuid, player.score, player.chatColor, true, player.isOperator());
 
                     source.sendTranslatableMessage("command.commands.nickname.reset.success", player.username);
diff --git a/game/server/src/main/java/net/minecraft/server/world/chunk/provider/ChunkProviderServer.java b/game/server/src/main/java/net/minecraft/server/world/chunk/provider/ChunkProviderServer.java
index 92fef2466..35941efe0 100644
--- a/game/server/src/main/java/net/minecraft/server/world/chunk/provider/ChunkProviderServer.java
+++ b/game/server/src/main/java/net/minecraft/server/world/chunk/provider/ChunkProviderServer.java
@@ -214,16 +214,62 @@ public class ChunkProviderServer
             if (this.chunkGenerator != null) {
                 this.decorating = true;
                 this.warnedRecursiveGeneration = false;
+                final boolean wasDecorating = this.world.isDecorating;
+                this.world.isDecorating = true;
                 try {
                     this.chunkGenerator.decorate(chunk);
                 } finally {
                     this.decorating = false;
+                    this.world.isDecorating = wasDecorating;
                 }
                 chunk.setChunkModified();
             }
         }
     }
 
+    public void ensureDecorated(@NotNull ChunkPosc chunkPos) {
+        if (this.decorating || this.chunkGenerator == null) {
+            return;
+        }
+        final List<ChunkPos> scratchChunks = new ArrayList<>();
+        for (int ownerDx = -1; ownerDx <= 0; ownerDx++) {
+            for (int ownerDz = -1; ownerDz <= 0; ownerDz++) {
+                final ChunkPos ownerPos = new ChunkPos(chunkPos.x() + ownerDx, chunkPos.z() + ownerDz);
+                Chunk owner = this.chunkMap.get(ownerPos);
+                if (owner == null) {
+                    scratchChunks.add(ownerPos);
+                    owner = prepareChunk(ownerPos, true);
+                }
+                if (owner.isTerrainPopulated) {
+                    continue;
+                }
+
+                //populate requires the +x, +z and +xz chunks to be present
+                for (int dx = 0; dx <= 1; dx++) {
+                    for (int dz = 0; dz <= 1; dz++) {
+                        if (dx == 0 && dz == 0) {
+                            continue;
+                        }
+                        final ChunkPos neighbourPos = new ChunkPos(ownerPos.x + dx, ownerPos.z + dz);
+                        if (!this.chunkMap.containsKey(neighbourPos)) {
+                            scratchChunks.add(neighbourPos);
+                            prepareChunk(neighbourPos, true);
+                        }
+                    }
+                }
+                populate(ownerPos);
+
+            }
+        }
+
+        for (final ChunkPos scratchPos : scratchChunks) {
+            if (scratchPos.x != chunkPos.x() || scratchPos.z != chunkPos.z()) {
+                dropChunk(scratchPos);
+            }
+        }
+
+    }
+
     @Override
     public boolean saveChunks(boolean saveImmediately, @Nullable ProgressListener progressListener) {
         saveImmediately |= this.world.mcServer.forceSaveAllChunksOnAutosave;
