diff --git a/game/client/src/main/java/net/minecraft/client/gui/keyboard/KeyboardLayout.java b/game/client/src/main/java/net/minecraft/client/gui/keyboard/KeyboardLayout.java
index 1875630ae..2faa40318 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/keyboard/KeyboardLayout.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/keyboard/KeyboardLayout.java
@@ -56,7 +56,7 @@ public class KeyboardLayout {
     private int height;
 
     public KeyboardLayout() {
-        loadFromStream(I18n.getResourceAsStream("/lang/en_US/keyboard.json"));
+        loadFromStream(I18n.getResourceAsStream("/assets/minecraft/lang/en_US/keyboard.json"));
     }
 
     private void loadFromStream(InputStream stream) {
@@ -192,7 +192,7 @@ public class KeyboardLayout {
             }
             layoutObject.add("keys", keyArray);
 
-            File out = new File("../core/src/main/resources/lang/en_US/keyboard.json");
+            File out = new File("../core/src/main/resources/assets/minecraft/lang/en_US/keyboard.json");
             out.delete();
             try (BufferedWriter writer = Files.newBufferedWriter(out.toPath())) {
                 out.createNewFile();
diff --git a/game/core/src/main/java/net/minecraft/core/block/Blocks.java b/game/core/src/main/java/net/minecraft/core/block/Blocks.java
index 55c008940..e209d4c4c 100644
--- a/game/core/src/main/java/net/minecraft/core/block/Blocks.java
+++ b/game/core/src/main/java/net/minecraft/core/block/Blocks.java
@@ -220,11 +220,11 @@ public final class Blocks {
         .withSound(BlockSounds.METAL).withHardness(5F).withBlastResistance(2000F).withOverrideColor(MaterialColor.steel)
         .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT);
     public static final @NotNull Block<?> BRICK_OLIVINE = register("brick.olivine", "minecraft:block/brick_olivine", 135, (b) -> new BlockLogic(b, Materials.OLIVINE))
-        .withSound(BlockSounds.PERMAFROST).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.olivine);
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT).withSound(BlockSounds.PERMAFROST).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.olivine);
     public static final @NotNull Block<?> BRICK_QUARTZ = register("brick.quartz", "minecraft:block/brick_quartz", 136, (b) -> new BlockLogic(b, Materials.QUARTZ))
-        .withSound(BlockSounds.PERMAFROST).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.quartz);
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT).withSound(BlockSounds.PERMAFROST).withHardness(3F).withBlastResistance(10F).withOverrideColor(MaterialColor.quartz);
     public static final @NotNull Block<?> BRICK_DIAMOND = register("brick.diamond", "minecraft:block/brick_diamond", 137, (b) -> new BlockLogic(b, Materials.DIAMOND))
-        .withSound(BlockSounds.PERMAFROST).withHardness(5F).withBlastResistance(10F).withOverrideColor(MaterialColor.diamond);
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT).withSound(BlockSounds.PERMAFROST).withHardness(5F).withBlastResistance(10F).withOverrideColor(MaterialColor.diamond);
 
 
     public static final @NotNull Block<BlockLogicSlab> SLAB_PLANKS_OAK = register("slab.planks.oak", "minecraft:block/slab_planks_oak", 140, (BlockLogicSupplier<BlockLogicSlab>)b -> new BlockLogicSlabPaintable(b, Blocks.PLANKS_OAK))
@@ -1096,10 +1096,10 @@ public final class Blocks {
         .withTags(BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block<?> COBBLE_NETHERRACK_CRYSTALLINE = register("cobble.netherrack.crystalline", "minecraft:block/cobble_netherrack_mossy", 802, (b) -> new BlockLogicCobble(b, Materials.NETHERRACK, null))
         .withSound(BlockSounds.STONE).withHardness(0.4F)
-        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT, BlockTags.GROWS_FLOWERS, BlockTags.INFINITE_BURN, BlockTags.GROWS_RUBYGLASS);
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT, BlockTags.INFINITE_BURN, BlockTags.GROWS_RUBYGLASS);
     public static final @NotNull Block<?> NETHERRACK = register("netherrack", "minecraft:block/netherrack", 803, (b) -> new BlockLogicStone(b, Blocks.COBBLE_NETHERRACK, Materials.NETHERRACK))
         .withSound(BlockSounds.STONE).withHardness(0.32F)
-        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT, BlockTags.INFINITE_BURN, BlockTags.CAVES_CUT_THROUGH, BlockTags.NETHER_MOBS_SPAWN);
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT, BlockTags.INFINITE_BURN, BlockTags.CAVES_CUT_THROUGH, BlockTags.NETHER_MOBS_SPAWN, BlockTags.NETHER_SURFACE_BLOCK);
     public static final @NotNull Block<?> BRICK_NETHERRACK = register("brick.netherrack", "minecraft:block/brick_netherrack", 804, (b) -> new BlockLogic(b, Materials.NETHERRACK))
         .withSound(BlockSounds.STONE).withHardness(0.4F)
         .withTags(BlockTags.MINEABLE_BY_PICKAXE);
@@ -1341,21 +1341,21 @@ public final class Blocks {
 
     public static final Block<?> BONE_PILE = register("bone_pile", "minecraft:block/bone_pile", 1030, BlockLogicBonepile::new)
         .withSound(BlockSounds.STONE).withHardness(1.0F).withOverrideColor(MaterialColor.marble)
-        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR);
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR);
     public static final Block<?> SOULCATCHER = register("soul_catcher", "minecraft:block/soul_catcher", 1031, BlockLogicSoulcatcher::new)
         .withSound(BlockSounds.GRAVEL).withHardness(1.0F).withOverrideColor(MaterialColor.sand)
-        .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR)
+        .withTags(BlockTags.MINEABLE_BY_SHOVEL, BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH, BlockTags.PLANTABLE_IN_JAR)
         .withOverrideColor(MaterialColor.soulsand);
 
     public static final Block<?> GLOOMSTONE = register("gloomstone", "minecraft:block/gloomstone", 1032, (b) -> new BlockLogicStone(b, Blocks.COBBLE_GLOOMSTONE, Materials.GLOOMSTONE))
         .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
-        .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.MINEABLE_BY_PICKAXE);
+        .withTags(BlockTags.CAVES_CUT_THROUGH, BlockTags.NETHER_MOBS_SPAWN, BlockTags.NETHER_SURFACE_BLOCK, BlockTags.CHAINLINK_FENCES_CONNECT, BlockTags.MINEABLE_BY_PICKAXE);
     public static final Block<?> COBBLE_GLOOMSTONE = register("cobble.gloomstone", "minecraft:block/cobble_gloomstone", 1033, (b) -> new BlockLogicCobble(b, Materials.GLOOMSTONE, () -> null))
         .withSound(BlockSounds.STONE).withHardness(2.0F).withBlastResistance(10F)
-        .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT);
     public static final Block<?> BRICK_GLOOMSTONE = register("brick.gloomstone", "minecraft:block/brick_gloomstone", 1034, (b) -> new BlockLogic(b, Materials.GLOOMSTONE))
         .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
-        .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        .withTags(BlockTags.MINEABLE_BY_PICKAXE, BlockTags.CHAINLINK_FENCES_CONNECT);
     public static final @NotNull Block<BlockLogicSlab> SLAB_GLOOMSTONE_POLISHED = register("slab.gloomstone.carved", "minecraft:block/slab_gloomstone_carved", 1035, (BlockLogicSupplier<BlockLogicSlab>)b -> new BlockLogicSlab(b, Blocks.GLOOMSTONE_CARVED))
         .withSound(BlockSounds.STONE).withHardness(1.5F).withBlastResistance(10F)
         .withTags(BlockTags.MINEABLE_BY_PICKAXE);
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 cdb64814d..cfaba6e12 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
@@ -99,7 +99,7 @@ public abstract class Entity
     public int airSupply = 300;
     private boolean firstTick = true;
     protected boolean fireImmune;
-    protected @NotNull SynchedEntityData entityData = new SynchedEntityData();
+    protected final @NotNull SynchedEntityData entityData = new SynchedEntityData();
     public float entityBrightness = 0.0F;
     private double entityRiderPitchDelta;
     private double entityRiderYawDelta;
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/ITrackedEntry.java b/game/core/src/main/java/net/minecraft/core/net/entity/ITrackedEntry.java
index 974bbc7bd..30ba81ab8 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/ITrackedEntry.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/ITrackedEntry.java
@@ -2,7 +2,7 @@ package net.minecraft.core.net.entity;
 
 public interface ITrackedEntry<T> extends INetworkEntry<T> {
     int getTrackingDistance();
-    int getPacketDelay();
+    int getMovementPacketDelay();
     boolean sendMotionUpdates();
     void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, T trackedObject);
 }
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryAnimal.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryAnimal.java
index 27d4c3efc..8603e3eb5 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryAnimal.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryAnimal.java
@@ -24,7 +24,7 @@ public class NetEntryAnimal<T extends Mob> implements IPacketEntry<T>, ITrackedE
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 3;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryArrow.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryArrow.java
index fae34dacf..7cc81e254 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryArrow.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryArrow.java
@@ -27,7 +27,7 @@ public class NetEntryArrow implements IVehicleEntry<ProjectileArrow>, ITrackedEn
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 20;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java
index 5460a9ada..e9939d27f 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java
@@ -24,7 +24,7 @@ public class NetEntryBoat implements IVehicleEntry<EntityBoat>, ITrackedEntry<En
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 1;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBobber.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBobber.java
index 14fa5cf4e..5eb277579 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBobber.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBobber.java
@@ -25,7 +25,7 @@ public class NetEntryBobber implements IVehicleEntry<EntityFishingBobber>, ITrac
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 5;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryCannonball.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryCannonball.java
index d205b6ce6..53fef3683 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryCannonball.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryCannonball.java
@@ -25,7 +25,7 @@ public class NetEntryCannonball implements IVehicleEntry<ProjectileCannonball>,
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 10;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryEgg.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryEgg.java
index 15eb1e43f..6a571f4a1 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryEgg.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryEgg.java
@@ -24,7 +24,7 @@ public class NetEntryEgg implements IVehicleEntry<ProjectileEgg>, ITrackedEntry<
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 10;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFallingBlock.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFallingBlock.java
index 5c4893e04..473a2dd87 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFallingBlock.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFallingBlock.java
@@ -26,7 +26,7 @@ public class NetEntryFallingBlock implements IVehicleEntry<EntityFallingBlock>,
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 20;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFireball.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFireball.java
index e5742d591..3d8e03a90 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFireball.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFireball.java
@@ -24,7 +24,7 @@ public class NetEntryFireball implements IVehicleEntry<ProjectileFireball>, ITra
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 1;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFirefly.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFirefly.java
index d1b3a5420..d627c2bbe 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFirefly.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryFirefly.java
@@ -9,7 +9,7 @@ public class NetEntryFirefly extends NetEntryAnimal<MobFireflyCluster> {
         return MobFireflyCluster.class;
     }
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 40;
     }
 }
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryItem.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryItem.java
index 4b99dde35..b49e4c948 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryItem.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryItem.java
@@ -21,7 +21,7 @@ public class NetEntryItem implements IPacketEntry<EntityItem>, ITrackedEntry<Ent
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 20;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryMinecart.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryMinecart.java
index cfb85aaa1..c9dbed241 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryMinecart.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryMinecart.java
@@ -24,7 +24,7 @@ public class NetEntryMinecart implements IVehicleEntry<EntityMinecart>, ITracked
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 1;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPainting.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPainting.java
index 4c42ac530..e565049f0 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPainting.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPainting.java
@@ -21,8 +21,8 @@ public class NetEntryPainting implements IPacketEntry<EntityPainting>, ITrackedE
     }
 
     @Override
-    public int getPacketDelay() {
-        return Integer.MAX_VALUE;
+    public int getMovementPacketDelay() {
+        return -1;
     }
 
     @Override
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPebble.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPebble.java
index 8604301b5..7ee7ce42d 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPebble.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPebble.java
@@ -24,7 +24,7 @@ public class NetEntryPebble implements IVehicleEntry<ProjectilePebble>, ITracked
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 10;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPlayerServer.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPlayerServer.java
index 25745f8fd..e72e11949 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPlayerServer.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPlayerServer.java
@@ -21,7 +21,7 @@ public class NetEntryPlayerServer implements IPacketEntry<Player>, ITrackedEntry
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 2;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPrimedTNT.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPrimedTNT.java
index 05da53498..6bec9a314 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPrimedTNT.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntryPrimedTNT.java
@@ -24,7 +24,7 @@ public class NetEntryPrimedTNT implements IVehicleEntry<EntityPrimedTNT>, ITrack
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 10;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntrySnowball.java b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntrySnowball.java
index e5387b5de..e76934764 100644
--- a/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntrySnowball.java
+++ b/game/core/src/main/java/net/minecraft/core/net/entity/entries/NetEntrySnowball.java
@@ -24,7 +24,7 @@ public class NetEntrySnowball implements IVehicleEntry<ProjectileSnowball>, ITra
     }
 
     @Override
-    public int getPacketDelay() {
+    public int getMovementPacketDelay() {
         return 10;
     }
 
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 026f4632c..ddcd470ec 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
@@ -27,7 +27,7 @@ import java.util.Set;
 public class EntityTrackerEntryImpl implements EntityTrackerEntry {
     public Entity trackedEntity;
     public int trackingDistance;
-    public int packetDelay;
+    public int movementPacketDelay;
     public int encodedPosX;
     public int encodedPosY;
     public int encodedPosZ;
@@ -43,17 +43,19 @@ public class EntityTrackerEntryImpl implements EntityTrackerEntry {
     private boolean firstUpdateDone;
     private final boolean shouldSendMotionUpdates;
     private int ticksSinceLastTeleport;
+    private final SynchedEntityData synchedEntityData;
     public boolean playerEntitiesUpdated;
     public Set<PlayerServer> trackedPlayers;
-    public EntityTrackerEntryImpl(Entity entity, int trackingDistance, int packetDelay, boolean shouldSendMotionUpdates) {
+    public EntityTrackerEntryImpl(Entity entity, int trackingDistance, int movementPacketDelay, boolean shouldSendMotionUpdates) {
         updateCounter = 0;
         ticksSinceLastTeleport = 0;
         firstUpdateDone = false;
         playerEntitiesUpdated = false;
         trackedPlayers = new HashSet<>();
         trackedEntity = entity;
+        synchedEntityData = trackedEntity.getEntityData();
         this.trackingDistance = trackingDistance;
-        this.packetDelay = packetDelay;
+        this.movementPacketDelay = movementPacketDelay;
         this.shouldSendMotionUpdates = shouldSendMotionUpdates;
         encodedPosX = MathHelper.floor(entity.x * 32D);
         encodedPosY = MathHelper.floor(entity.y * 32D);
@@ -85,7 +87,7 @@ public class EntityTrackerEntryImpl implements EntityTrackerEntry {
             updatePlayerEntities(list);
         }
         ticksSinceLastTeleport++;
-        if(++updateCounter % packetDelay == 0) {
+        if (movementPacketDelay > 0 && ++updateCounter % movementPacketDelay == 0) {
             int entityX = MathHelper.floor(trackedEntity.x * 32D);
             int entityY = MathHelper.floor(trackedEntity.y * 32D);
             int entityZ = MathHelper.floor(trackedEntity.z * 32D);
@@ -126,10 +128,6 @@ public class EntityTrackerEntryImpl implements EntityTrackerEntry {
             if(packet != null) {
                 sendPacketToTrackedPlayers(packet);
             }
-            SynchedEntityData synchedEntityData = trackedEntity.getEntityData();
-            if(synchedEntityData.isDirty()) {
-                sendPacketToTrackedPlayersAndTrackedEntity(new PacketSetEntityData(trackedEntity.id, synchedEntityData));
-            }
             if(hasMoved) {
                 encodedPosX = entityX;
                 encodedPosY = entityY;
@@ -140,6 +138,9 @@ public class EntityTrackerEntryImpl implements EntityTrackerEntry {
                 encodedRotationPitch = entityPitch;
             }
         }
+        if(synchedEntityData.isDirty()) {
+            sendPacketToTrackedPlayersAndTrackedEntity(new PacketSetEntityData(trackedEntity.id, synchedEntityData));
+        }
         if(trackedEntity.hurtMarked) {
             sendPacketToTrackedPlayersAndTrackedEntity(new PacketSetEntityMotion(trackedEntity));
             trackedEntity.hurtMarked = false;
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 6c5a9c75a..d3a971d4e 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
@@ -38,13 +38,13 @@ public class EntityTrackerImpl implements EntityTracker {
     public void trackEntity(Entity entity) {
         ITrackedEntry<Entity> trackedConfig = NetEntityHandler.getTrackedEntry(entity);
         if (trackedConfig != null){
-            EntityTrackerEntryImpl trackerEntry = trackEntity(entity, trackedConfig.getTrackingDistance(), trackedConfig.getPacketDelay(), trackedConfig.sendMotionUpdates());
+            EntityTrackerEntryImpl trackerEntry = trackEntity(entity, trackedConfig.getTrackingDistance(), trackedConfig.getMovementPacketDelay(), trackedConfig.sendMotionUpdates());
             trackedConfig.onEntityTracked(this, trackerEntry, entity);
         }
     }
 
     @Override
-    public EntityTrackerEntryImpl trackEntity(Entity entity, int trackingDistance, int packetDelay, boolean shouldSendMotionUpdates)
+    public EntityTrackerEntryImpl trackEntity(Entity entity, int trackingDistance, int movementPacketDelay, boolean shouldSendMotionUpdates)
     {
         if(trackingDistance > maxTrackingDistanceThreshold) {
             trackingDistance = maxTrackingDistanceThreshold;
@@ -52,7 +52,7 @@ public class EntityTrackerImpl implements EntityTracker {
         if(trackedEntityHashTable.containsValue(entity.id)) {
             throw new IllegalStateException("Entity is already tracked!");
         }
-        EntityTrackerEntryImpl trackerEntry = new EntityTrackerEntryImpl(entity, trackingDistance, packetDelay, shouldSendMotionUpdates);
+        EntityTrackerEntryImpl trackerEntry = new EntityTrackerEntryImpl(entity, trackingDistance, movementPacketDelay, shouldSendMotionUpdates);
         trackedEntitySet.add(trackerEntry);
         trackedEntityHashTable.put(entity.id, trackerEntry);
         trackerEntry.updatePlayerEntities(mcServer.getDimensionWorld(dimension.id).players);
