diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/components/DifficultyOptionComponent.java b/game/client/src/main/java/net/minecraft/client/gui/options/components/DifficultyOptionComponent.java
index 5d8e9c990..638434761 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/components/DifficultyOptionComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/components/DifficultyOptionComponent.java
@@ -1,6 +1,7 @@
 package net.minecraft.client.gui.options.components;
 
 import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.ButtonElement;
 import net.minecraft.client.gui.IntegerSliderElement;
 import net.minecraft.client.option.OptionEnum;
 import net.minecraft.client.render.window.CursorShape;
@@ -12,6 +13,7 @@ public class DifficultyOptionComponent extends ButtonComponent {
 
     protected final OptionEnum<Difficulty> option;
     protected final IntegerSliderElement slider;
+    protected final ButtonElement lockButton;
 
     public DifficultyOptionComponent(OptionEnum<Difficulty> difficultyOption) {
         this(difficultyOption, null);
@@ -21,7 +23,9 @@ public class DifficultyOptionComponent extends ButtonComponent {
         super("options." + difficultyOption.name, tooltipTranslationKey);
         option = difficultyOption;
         option.addCallback(__ -> onChanged());
-        this.slider = new IntegerSliderElement(0, 0, 0, 150, 20, option);
+        this.slider = new IntegerSliderElement(0, 0, 0, 150 - 22, 20, option);
+        this.lockButton = new ButtonElement(1, 150 - 20, 0, 20, 20, "");
+        this.lockButton.setTextures("minecraft:gui/widgets/button/button_locked", "minecraft:gui/widgets/button/button_locked_highlighted", "minecraft:gui/widgets/button/button_locked_disabled");
     }
 
     @Override
@@ -29,6 +33,9 @@ public class DifficultyOptionComponent extends ButtonComponent {
         this.slider.mouseClicked(mc, this.slider.xPosition + relativeMouseX, this.slider.yPosition + relativeMouseY);
         onChanged();
         this.option.onUpdate();
+        if (mc.currentWorld != null && this.lockButton.mouseClicked(mc, this.slider.xPosition + relativeMouseX, this.slider.yPosition + relativeMouseY)) {
+            mc.currentWorld.getLevelData().setDifficultyLocked();
+        }
     }
 
     @Override
@@ -48,14 +55,20 @@ public class DifficultyOptionComponent extends ButtonComponent {
     protected void renderButton(int x, int y, int relativeButtonX, int relativeButtonY, int buttonWidth, int buttonHeight, int relativeMouseX, int relativeMouseY)
     {
         slider.enabled = canSetDifficulty();
+        this.lockButton.enabled = canSetDifficulty();
         super.renderButton(x, y, relativeButtonX, relativeButtonY, buttonWidth, buttonHeight, relativeMouseX, relativeMouseY);
 
         this.slider.xPosition = x + relativeButtonX;
         this.slider.yPosition = y + relativeButtonY;
-        this.slider.width = buttonWidth;
+        this.slider.width = buttonWidth - 22;
         this.slider.height = buttonHeight;
+        this.lockButton.xPosition = x + relativeButtonX + this.slider.width + 2;
+        this.lockButton.yPosition = y + relativeButtonY;
+        this.lockButton.width = 20;
+        this.lockButton.height = buttonHeight;
 
         this.slider.drawButton(mc, x + relativeMouseX, y + relativeMouseY);
+        this.lockButton.drawButton(mc, x + relativeMouseX, y + relativeMouseY);
 
         if (relativeMouseX >= relativeButtonX && relativeMouseX < relativeButtonX + buttonWidth && relativeMouseY >= relativeButtonY && relativeButtonY < relativeButtonY + buttonHeight) {
             mc.currentScreen.setDesiredCursor(CursorShape.HAND);
@@ -66,12 +79,14 @@ public class DifficultyOptionComponent extends ButtonComponent {
         if (!canSetDifficulty()) {
             slider.enabled = false;
             slider.sliderValue = Difficulty.NORMAL.id();
+            lockButton.enabled = false;
             onChanged();
             return;
         }
         slider.enabled = true;
         option.set(mc.currentWorld.getDifficulty());
         slider.sliderValue = option.value.id();
+        lockButton.enabled = true;
         onChanged();
     }
 
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button/button_locked.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button/button_locked.png
new file mode 100644
index 000000000..9a7480310
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button/button_locked.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button/button_locked_disabled.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button/button_locked_disabled.png
new file mode 100644
index 000000000..05261a832
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button/button_locked_disabled.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button/button_locked_highlighted.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button/button_locked_highlighted.png
new file mode 100644
index 000000000..e6ea553f0
Binary files /dev/null and b/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/widgets/button/button_locked_highlighted.png differ
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicMeshGold.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicMeshGold.java
index 6dbe4c92a..829c15a96 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicMeshGold.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicMeshGold.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.entity.TileEntityMeshGold;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityItem;
@@ -7,6 +8,10 @@ import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Objects;
 
 public class BlockLogicMeshGold extends BlockLogicMesh {
     public BlockLogicMeshGold(Block<?> block) {
@@ -20,6 +25,7 @@ public class BlockLogicMeshGold extends BlockLogicMesh {
         TileEntityMeshGold meshGold = (TileEntityMeshGold) world.getTileEntity(x, y, z);
         ItemStack heldItem = player.getHeldItem();
         boolean flag = meshGold.setFilterItem(player, heldItem);
+        world.notifyBlocksOfNeighborChange(x, y, z, id());
         if(heldItem != null && heldItem.stackSize <= 0)
         {
             player.inventory.setItem(player.inventory.getCurrentItemIndex(), null);
@@ -34,8 +40,28 @@ public class BlockLogicMeshGold extends BlockLogicMesh {
             if (mesh.filterItem == null) return true;
 
             ItemStack entityStack = ((EntityItem) entity).item;
-            return !entityStack.isItemEqual(mesh.filterItem);
+            return !stacksAreSame(entityStack, mesh.filterItem);
         }
         return true;
     }
+
+    @Override
+    public boolean isEquivalent(@NotNull World world, int thisX, int thisY, int thisZ, int otherX, int otherY, int otherZ) {
+        if (super.isEquivalent(world, thisX, thisY, thisZ, otherX, otherY, otherZ)) {
+            TileEntity thisEntity = world.getTileEntity(thisX, thisY, thisZ);
+            TileEntity otherEntity = world.getTileEntity(otherX, otherY, otherZ);
+            if (thisEntity instanceof TileEntityMeshGold && otherEntity instanceof TileEntityMeshGold) {
+                TileEntityMeshGold thisMesh = (TileEntityMeshGold) thisEntity;
+                TileEntityMeshGold otherMesh = (TileEntityMeshGold) otherEntity;
+                return stacksAreSame(thisMesh.filterItem, otherMesh.filterItem);
+            }
+        }
+        return false;
+    }
+
+    public boolean stacksAreSame(@Nullable ItemStack a, @Nullable ItemStack b) {
+        return a == b || (a != null && b != null && a.itemID == b.itemID && a.getMetadata() == b.getMetadata() && a.getData().equals(b.getData()));
+    }
+
+
 }
