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 c01819b59..e68589a8f 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
@@ -399,10 +399,12 @@ public class PlayerLocal extends Player {
         }
         if (i > 0 && stat.isAchievement()) {
             Achievement achievement = (Achievement) stat;
-            if (!this.mc.statsCounter.isUnlocked(achievement)) {
-                this.mc.guiToasts.addToast(new AchievementToast(achievement, false));
+            if (achievement.parent == null || this.mc.statsCounter.isUnlocked(achievement.parent)) {
+                if (!this.mc.statsCounter.isUnlocked(achievement)) {
+                    this.mc.guiToasts.addToast(new AchievementToast(achievement, false));
+                }
+                this.mc.statsCounter.add(stat, i);
             }
-            this.mc.statsCounter.add(stat, i);
         } else {
             this.mc.statsCounter.add(stat, i);
         }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java
index 7fe5970c6..fe7d2dbb7 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java
@@ -340,9 +340,10 @@ public abstract class ScreenContainerAbstract extends Screen {
         super.mouseReleased(mx, my, buttonNum);
     }
 
-    protected int[] creativeSlotArgs(Slot slot, int amount) {
+    protected int[] creativeSlotArgs(@NotNull Slot slot, int amount) {
         ItemStack stack = slot.getItemStack();
-        return new int[]{slot.index, amount, stack != null ? stack.itemID : 0, stack != null ? stack.getMetadata() : 0};
+        int catalogIndex = slot instanceof SlotCreative creativeSlot ? MenuInventoryCreative.getCreativeItemIndex(creativeSlot.item) : -1;
+        return new int[]{slot.index, amount, stack != null ? stack.itemID : 0, stack != null ? stack.getMetadata() : 0, catalogIndex};
     }
 
     protected int[] hotbarSwapArgs(int slotId, int hotbarSlotNumber) {
diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/generic/BlockModelGenericPiston.java b/game/client/src/main/java/net/minecraft/client/render/block/model/generic/BlockModelGenericPiston.java
index b1bc6e2c9..1ddcf0479 100644
--- a/game/client/src/main/java/net/minecraft/client/render/block/model/generic/BlockModelGenericPiston.java
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/generic/BlockModelGenericPiston.java
@@ -46,7 +46,7 @@ public class BlockModelGenericPiston<T extends BlockLogic> extends BlockModelGen
 
     @Override
     public @NotNull StaticBlockModel getModelFromData(int data) {
-        return (/*noCulling || */PistonCommon.IS_EXTENDED.bool(data)) 
+        return (/*noCulling || */PistonCommon.isExtended(data))
             ? this.extended 
             : super.getModelFromData(data);
     }
diff --git a/game/core/src/main/java/net/minecraft/core/achievement/stat/StatsCounter.java b/game/core/src/main/java/net/minecraft/core/achievement/stat/StatsCounter.java
index d7ec1a765..2f903e673 100644
--- a/game/core/src/main/java/net/minecraft/core/achievement/stat/StatsCounter.java
+++ b/game/core/src/main/java/net/minecraft/core/achievement/stat/StatsCounter.java
@@ -115,7 +115,7 @@ public class StatsCounter {
 	}
 
 	public boolean canUnlock(Achievement achievement) {
-		return achievement.parent == null || isUnlocked(achievement.parent) || isUnlocked(achievement);
+		return achievement.parent == null || isUnlocked(achievement.parent);
 	}
 
 	public int readStat(@Nullable Stat stat) {
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicRepeater.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicRepeater.java
index 49d86f1cc..a1ffa0ac5 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicRepeater.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicRepeater.java
@@ -89,11 +89,11 @@ public class BlockLogicRepeater extends BlockLogic implements ISupportable, Bloc
         } else if (!this.isRepeaterPowered) {
             world.setBlockTypeDataRaw(tilePos, Blocks.REPEATER_ACTIVE, meta);
             world.markBlockNeedsUpdate(tilePos);
-            world.notifyBlocksInCapsuleOfNeighborChange(side.opposite(), tilePos, Blocks.REPEATER_IDLE);
             if (!powered) {
                 int tickDelay = (meta & MASK_TICK_DELAY) >> 2;
                 world.scheduleBlockUpdate(tilePos, Blocks.REPEATER_ACTIVE, tickDelayMap[tickDelay] * 2);
             }
+            world.notifyBlocksInCapsuleOfNeighborChange(side.opposite(), tilePos, Blocks.REPEATER_IDLE);
         }
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/block/piston/PistonCommon.java b/game/core/src/main/java/net/minecraft/core/block/piston/PistonCommon.java
index 5c49d260f..511d23392 100644
--- a/game/core/src/main/java/net/minecraft/core/block/piston/PistonCommon.java
+++ b/game/core/src/main/java/net/minecraft/core/block/piston/PistonCommon.java
@@ -15,7 +15,7 @@ import net.minecraft.core.world.pos.TilePos;
 import net.minecraft.core.world.pos.TilePosc;
 
 /**
- * NOTE: this class should only be accessed after the Blocks clinit logic is complete, i.e. 
+ * NOTE: this class should only be accessed after the Blocks clinit logic is complete, i.e.
  * not from within BlockLogic constructors!
  */
 public abstract class PistonCommon {
@@ -24,6 +24,7 @@ public abstract class PistonCommon {
     public static final PackedField DIRECTION   = new PackedField(0, 3);
     public static final PackedField TYPE        = new PackedField(3, 2);
     public static final PackedField IS_EXTENDED = new PackedField(6, 1);
+    public static final PackedField LEGACY_EXTENDED = new PackedField(3, 1);
     
     public static final PackedField NEW_FORMAT_SIGNATURE = new PackedField(7, 1);
 
@@ -117,10 +118,15 @@ public abstract class PistonCommon {
         if (newBaseData == baseData) return newBaseData;
 
         world.setBlockData(basePos, newBaseData);
-        return baseData;
+        return newBaseData;
     }
 
+    // TODO proper chunk load conversion for pistons from 7.3_04 to ~8.0
+    // was set aside for the time being due to release window
     public static int validateBaseData(int data, @NotNull BlockLogicPistonBase base) {
+        if (!NEW_FORMAT_SIGNATURE.bool(data)) {
+            data = IS_EXTENDED.set(DIRECTION.set(0, DIRECTION.get(data)), LEGACY_EXTENDED.get(data));
+        }
         data = TYPE.set(data, base.typeId);
         data = NEW_FORMAT_SIGNATURE.set(data, 1);
         if (DIRECTION.get(data) > 5) data = DIRECTION.set(data, 0);
@@ -128,6 +134,12 @@ public abstract class PistonCommon {
         return data;
     }
 
+    public static boolean isExtended(int baseData) {
+        return (NEW_FORMAT_SIGNATURE.bool(baseData))
+            ? IS_EXTENDED.bool(baseData)
+            : LEGACY_EXTENDED.bool(baseData);
+    }
+
     public static int getValidatedBaseData(@NotNull WorldSource world, @NotNull TilePosc pos, @NotNull BlockLogicPistonBase base) {
         return validateBaseData(world.getBlockData(pos), base);
     }
diff --git a/game/core/src/main/java/net/minecraft/core/current/wire/WireConnectionManager.java b/game/core/src/main/java/net/minecraft/core/current/wire/WireConnectionManager.java
index 12ba77d71..d82b7752a 100644
--- a/game/core/src/main/java/net/minecraft/core/current/wire/WireConnectionManager.java
+++ b/game/core/src/main/java/net/minecraft/core/current/wire/WireConnectionManager.java
@@ -68,8 +68,7 @@ public class WireConnectionManager {
 
 		Node ownerUp = nodes.getNeighbor(owner, Directions.UP);
 		boolean aboveIsConductor = ownerUp.isConductor();
-		// Check if the block directly above the bottom wire is an open conduit facing down
-		boolean aboveIsOpenDown = isConduitOpenTowards(ownerUp, Directions.DOWN);
+		boolean aboveIsConduit = ownerUp.state.is(Blocks.CONDUIT);
 
 		for (int iDir = 0; iDir < Directions.HORIZONTAL.length; iDir++) {
 			Node neighbor = nodes.getNeighbor(owner, iDir);
@@ -100,7 +99,7 @@ public class WireConnectionManager {
 
 			//looking upwards logic
 			boolean blockedUp = aboveIsConductor ||
-					aboveIsOpenDown ||
+					aboveIsConduit ||
 					isConduitOpenTowards(neighbor, iOppDir);
 
 			if (!blockedUp) {
diff --git a/game/core/src/main/java/net/minecraft/core/entity/EntityItem.java b/game/core/src/main/java/net/minecraft/core/entity/EntityItem.java
index 8ff78129c..552eacf7e 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/EntityItem.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/EntityItem.java
@@ -72,6 +72,7 @@ public class EntityItem extends Entity
 
     public EntityItem(@NotNull World world, double x, double y, double z, @NotNull ItemStack itemstack) {
         super(world);
+        this.sendAdditionalData = true;
         this.age = 0;
         this.health = 8;
         this.bobOffset = (float)(Math.random() * Math.PI * 2D);
@@ -99,6 +100,7 @@ public class EntityItem extends Entity
     public EntityItem(World world)
     {
         super(world);
+        this.sendAdditionalData = true;
         this.age = 0;
         this.health = 5;
         this.bobOffset = (float)(Math.random() * Math.PI * 2D);
diff --git a/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuAbstract.java b/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuAbstract.java
index 57a3f5d05..018ecb2f6 100644
--- a/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuAbstract.java
+++ b/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuAbstract.java
@@ -325,7 +325,7 @@ public abstract class MenuAbstract
 			}else {
 				ItemStack sourceStack = stackInSlot;
 				if(slot instanceof SlotCreative) {
-					sourceStack = args.length >= 4 ? MenuInventoryCreative.getValidCreativeItem(args[2], args[3]) : null;
+					sourceStack = args.length >= 4 ? MenuInventoryCreative.getValidCreativeItem(args[2], args[3], args.length >= 5 ? args[4] : -1) : null;
 					if(sourceStack == null && args.length >= 4 && args[2] != 0) {
 						LOGGER.warn("Player {} requested item {}:{} which the creative menu does not offer!", player.username, args[2], args[3]);
 					}
@@ -500,7 +500,7 @@ public abstract class MenuAbstract
 
 		ItemStack slotStack;
 		if(slot instanceof SlotCreative) {
-			slotStack = args.length >= 4 ? MenuInventoryCreative.getValidCreativeItem(args[2], args[3]) : null;
+			slotStack = args.length >= 4 ? MenuInventoryCreative.getValidCreativeItem(args[2], args[3], args.length >= 5 ? args[4] : -1) : null;
 		} else {
             assert slot != null;
             slotStack = slot.getItemStack();
diff --git a/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuInventoryCreative.java b/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuInventoryCreative.java
index a202503be..ac0d0d37c 100644
--- a/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuInventoryCreative.java
+++ b/game/core/src/main/java/net/minecraft/core/player/inventory/menu/MenuInventoryCreative.java
@@ -5,6 +5,7 @@ import net.minecraft.core.lang.I18n;
 import net.minecraft.core.player.inventory.CreativeMenuContents;
 import net.minecraft.core.player.inventory.container.ContainerInventory;
 import net.minecraft.core.player.inventory.slot.SlotCreative;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -155,6 +156,19 @@ public class MenuInventoryCreative extends MenuInventory
 
 	public static ItemStack getValidCreativeItem(int itemId, int metadata)
 	{
+		return getValidCreativeItem(itemId, metadata, -1);
+	}
+
+	public static @Nullable ItemStack getValidCreativeItem(int itemId, int metadata, int catalogIndex) {
+
+		if (catalogIndex >= 0 && catalogIndex < creativeContents.size())
+		{
+			ItemStack stack = creativeContents.get(catalogIndex);
+			if (stack != null && stack.itemID == itemId && stack.getMetadata() == metadata)
+			{
+				return stack.copy();
+			}
+		}
 		for (ItemStack stack : creativeContents)
 		{
 			if (stack != null && stack.itemID == itemId && stack.getMetadata() == metadata)
@@ -165,6 +179,19 @@ public class MenuInventoryCreative extends MenuInventory
 		return null;
 	}
 
+	public static int getCreativeItemIndex(ItemStack stack)
+	{
+		if (stack == null) return -1;
+		for (int i = 0; i < creativeContents.size(); i++)
+		{
+			if (creativeContents.get(i) == stack)
+			{
+				return i;
+			}
+		}
+		return -1;
+	}
+
 	public String getSearchText(){
 		return searchText;
 	}
diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureNetherScatterBonePile.java b/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureNetherScatterBonePile.java
index 09a03abe6..c98a5d793 100644
--- a/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureNetherScatterBonePile.java
+++ b/game/core/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureNetherScatterBonePile.java
@@ -21,6 +21,11 @@ public final class WorldFeatureNetherScatterBonePile extends WorldFeatureNetherS
             return false;
         }
         final Block<?> surface = world.getBlockType(this.scratchGround);
+
+        if(surface == Blocks.OBSIDIAN){
+            return false;
+        }
+
         if (isAshSurface(surface) && random.nextInt(BONE_PILE_ON_ASH_ONE_IN) != 0) {
             return false;
         }
