diff --git a/Spigot-API-Patches/Ability-to-get-Tile-Entities-from-a-chunk-without-sn.patch b/Spigot-API-Patches/Ability-to-get-Tile-Entities-from-a-chunk-without-sn.patch
index d29aab6d29..9a88a5c104 100644
--- a/Spigot-API-Patches/Ability-to-get-Tile-Entities-from-a-chunk-without-sn.patch
+++ b/Spigot-API-Patches/Ability-to-get-Tile-Entities-from-a-chunk-without-sn.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/Chunk.java b/src/main/java/org/bukkit/Chun
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/Chunk.java
 +++ b/src/main/java/org/bukkit/Chunk.java
-@@ -0,0 +0,0 @@ public interface Chunk {
+@@ -0,0 +0,0 @@ public interface Chunk extends PersistentDataHolder {
      @NotNull
      Entity[] getEntities();
  
diff --git a/Spigot-API-Patches/Provide-Chunk-Coordinates-as-a-Long-API.patch b/Spigot-API-Patches/Provide-Chunk-Coordinates-as-a-Long-API.patch
index 1d681b447c..a68defc19a 100644
--- a/Spigot-API-Patches/Provide-Chunk-Coordinates-as-a-Long-API.patch
+++ b/Spigot-API-Patches/Provide-Chunk-Coordinates-as-a-Long-API.patch
@@ -10,7 +10,7 @@ diff --git a/src/main/java/org/bukkit/Chunk.java b/src/main/java/org/bukkit/Chun
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/Chunk.java
 +++ b/src/main/java/org/bukkit/Chunk.java
-@@ -0,0 +0,0 @@ public interface Chunk {
+@@ -0,0 +0,0 @@ public interface Chunk extends PersistentDataHolder {
       */
      int getZ();
  
diff --git a/Spigot-API-Patches/Timings-v2.patch b/Spigot-API-Patches/Timings-v2.patch
index 955c6b5a30..aafb76df79 100644
--- a/Spigot-API-Patches/Timings-v2.patch
+++ b/Spigot-API-Patches/Timings-v2.patch
@@ -1891,6 +1891,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +import org.bukkit.command.RemoteConsoleCommandSender;
 +
 +import java.util.List;
++import java.util.UUID;
++
 +import org.jetbrains.annotations.NotNull;
 +import org.jetbrains.annotations.Nullable;
 +
@@ -2942,7 +2944,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +import org.bukkit.plugin.Plugin;
 +
 +import java.util.Set;
++import java.util.UUID;
++
 +import org.jetbrains.annotations.NotNull;
++import org.jetbrains.annotations.Nullable;
 +
 +/**
 + * For when all you care about is just messaging
@@ -2956,6 +2961,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        }
 +    }
 +
++    @Override
++    default void sendMessage(@Nullable UUID sender, @NotNull String message) {
++        sendMessage(message);
++    }
++
++    @Override
++    default void sendMessage(@Nullable UUID sender, @NotNull String[] messages) {
++        for (String message : messages) {
++            sendMessage(message);
++        }
++    }
++
 +    @NotNull
 +    @Override
 +    default Server getServer() {
diff --git a/Spigot-Server-Patches/Anti-Xray.patch b/Spigot-Server-Patches/Anti-Xray.patch
index 91a430ce52..3754e7364c 100644
--- a/Spigot-Server-Patches/Anti-Xray.patch
+++ b/Spigot-Server-Patches/Anti-Xray.patch
@@ -1014,7 +1014,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                  chunksection.getBlocks().a(nbttagcompound2.getList("Palette", 10), nbttagcompound2.getLongArray("BlockStates"));
                  chunksection.recalcBlockCounts();
 @@ -0,0 +0,0 @@ public class ChunkRegionLoader {
-                 loadEntities(nbttagcompound1, chunk);
+                 // CraftBukkit end
              });
          } else {
 -            ProtoChunk protochunk = new ProtoChunk(chunkcoordintpair, chunkconverter, achunksection, protochunkticklist, protochunkticklist1);
diff --git a/Spigot-Server-Patches/Asynchronous-chunk-IO-and-loading.patch b/Spigot-Server-Patches/Asynchronous-chunk-IO-and-loading.patch
index 869df43206..e720c44b26 100644
--- a/Spigot-Server-Patches/Asynchronous-chunk-IO-and-loading.patch
+++ b/Spigot-Server-Patches/Asynchronous-chunk-IO-and-loading.patch
@@ -2688,9 +2688,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
 -        for (int i = -1; i < 17; ++i) {
 +        for (int i = -1; i < 17; ++i) { // Paper - conflict on loop parameter change
-             int finalI = i;
+             int finalI = i; // CraftBukkit - decompile errors
              ChunkSection chunksection = (ChunkSection) Arrays.stream(achunksection).filter((chunksection1) -> {
-                 return chunksection1 != null && chunksection1.getYPosition() >> 4 == finalI;
+                 return chunksection1 != null && chunksection1.getYPosition() >> 4 == finalI; // CraftBukkit - decompile errors
              }).findFirst().orElse(Chunk.a);
 -            NibbleArray nibblearray = lightenginethreaded.a(EnumSkyBlock.BLOCK).a(SectionPosition.a(chunkcoordintpair, i));
 -            NibbleArray nibblearray1 = lightenginethreaded.a(EnumSkyBlock.SKY).a(SectionPosition.a(chunkcoordintpair, i));
diff --git a/Spigot-Server-Patches/Fix-Non-Full-Status-Chunk-NBT-Memory-Leak.patch b/Spigot-Server-Patches/Fix-Non-Full-Status-Chunk-NBT-Memory-Leak.patch
index 6935859af7..42af054ae4 100644
--- a/Spigot-Server-Patches/Fix-Non-Full-Status-Chunk-NBT-Memory-Leak.patch
+++ b/Spigot-Server-Patches/Fix-Non-Full-Status-Chunk-NBT-Memory-Leak.patch
@@ -25,9 +25,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
 -            object = new Chunk(worldserver.getMinecraftWorld(), chunkcoordintpair, biomestorage, chunkconverter, (TickList) object1, (TickList) object2, j, achunksection, (chunk) -> {
 -                loadEntities(nbttagcompound1, chunk);
+-                // CraftBukkit start - load chunk persistent data from nbt
+-                NBTTagCompound persistentBase = nbttagcompound1.getCompound("BukkitValues");
+-                if (persistentBase != null) {
+-                    chunk.persistentDataContainer.putAll(nbttagcompound1);
+-                }
+-                // CraftBukkit end
 -            });
 +            object = new Chunk(worldserver.getMinecraftWorld(), chunkcoordintpair, biomestorage, chunkconverter, (TickList) object1, (TickList) object2, j, achunksection, // Paper start - fix massive nbt memory leak due to lambda. move lambda into a container method to not leak scope. Only clone needed NBT keys.
-+                createLoadEntitiesConsumer(new SafeNBTCopy(nbttagcompound1, "TileEntities", "Entities"))
++                createLoadEntitiesConsumer(new SafeNBTCopy(nbttagcompound1, "TileEntities", "Entities", "BukkitValues")) // Paper - move CB Chunk PDC into here
 +            );// Paper end
          } else {
              ProtoChunk protochunk = new ProtoChunk(chunkcoordintpair, chunkconverter, achunksection, protochunkticklist, protochunkticklist1, worldserver); // Paper - Anti-Xray - Add parameter
@@ -64,7 +70,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        }
 +    }
 +    private static java.util.function.Consumer<Chunk> createLoadEntitiesConsumer(NBTTagCompound nbt) {
-+        return (chunk) -> loadEntities(nbt, chunk);
++        return (chunk) -> {
++            loadEntities(nbt, chunk);
++            // CraftBukkit start - load chunk persistent data from nbt
++            NBTBase persistentBase = nbt.get("BukkitValues"); // Paper - use NBTBase & #get
++            if (persistentBase instanceof NBTTagCompound) { // Paper - instanceof to check nullability & type; previous was if(true)
++                chunk.persistentDataContainer.putAll((NBTTagCompound) persistentBase); // Paper
++            }
++            // CraftBukkit end
++        };
 +    }
 +    // Paper end
  
diff --git a/Spigot-Server-Patches/MC-Utils.patch b/Spigot-Server-Patches/MC-Utils.patch
index 47f6f32c1e..44e0aadf89 100644
--- a/Spigot-Server-Patches/MC-Utils.patch
+++ b/Spigot-Server-Patches/MC-Utils.patch
@@ -2442,7 +2442,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          HeightMap.Type[] aheightmap_type = HeightMap.Type.values();
          int j = aheightmap_type.length;
 @@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess {
-     public boolean needsDecoration;
+     public final org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer persistentDataContainer = new org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer(DATA_TYPE_REGISTRY);
      // CraftBukkit end
  
 +    // Paper start
diff --git a/work/Bukkit b/work/Bukkit
index 9165c3c0b0..01e22e0972 160000
--- a/work/Bukkit
+++ b/work/Bukkit
@@ -1 +1 @@
-Subproject commit 9165c3c0b0e34aefce111933495e1c3efb000d4b
+Subproject commit 01e22e09726e700776739ec0662acd30e7844cec
diff --git a/work/CraftBukkit b/work/CraftBukkit
index 055870c4bc..4ef13f94d6 160000
--- a/work/CraftBukkit
+++ b/work/CraftBukkit
@@ -1 +1 @@
-Subproject commit 055870c4bca477067f9113deb1090228cccf67c6
+Subproject commit 4ef13f94d6a4042e0dadd622666a50cee7468d26
diff --git a/work/Spigot b/work/Spigot
index 988b41197d..57bbdd8eb7 160000
--- a/work/Spigot
+++ b/work/Spigot
@@ -1 +1 @@
-Subproject commit 988b41197dad25f715bf535ec725af7c0c1a1627
+Subproject commit 57bbdd8eb797a51960cf9a47f764b68f97d4f18c