diff --git a/patches/api/Timings-v2.patch b/patches/api/Timings-v2.patch
index 66c48bf1ea..8fbe7589bb 100644
--- a/patches/api/Timings-v2.patch
+++ b/patches/api/Timings-v2.patch
@@ -3466,6 +3466,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        }
 +
 +        // Paper start
++        /**
++         * @return the player's ping
++         * @deprecated use {@link Player#getPing()}
++         */
++        @Deprecated
 +        public int getPing() {
 +            throw new UnsupportedOperationException( "Not supported yet." );
          }
diff --git a/patches/unapplied/server/Add-Raw-Byte-ItemStack-Serialization.patch b/patches/server/Add-Raw-Byte-ItemStack-Serialization.patch
similarity index 100%
rename from patches/unapplied/server/Add-Raw-Byte-ItemStack-Serialization.patch
rename to patches/server/Add-Raw-Byte-ItemStack-Serialization.patch
diff --git a/patches/unapplied/server/Add-ThrownEggHatchEvent.patch b/patches/server/Add-ThrownEggHatchEvent.patch
similarity index 100%
rename from patches/unapplied/server/Add-ThrownEggHatchEvent.patch
rename to patches/server/Add-ThrownEggHatchEvent.patch
diff --git a/patches/unapplied/server/Add-debug-for-sync-chunk-loads.patch b/patches/server/Add-debug-for-sync-chunk-loads.patch
similarity index 94%
rename from patches/unapplied/server/Add-debug-for-sync-chunk-loads.patch
rename to patches/server/Add-debug-for-sync-chunk-loads.patch
index 2c78c67e54..1f8bfaab7a 100644
--- a/patches/unapplied/server/Add-debug-for-sync-chunk-loads.patch
+++ b/patches/server/Add-debug-for-sync-chunk-loads.patch
@@ -198,9 +198,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/io/papermc/paper/command/PaperCommand.java
 +++ b/src/main/java/io/papermc/paper/command/PaperCommand.java
 @@ -0,0 +0,0 @@ public final class PaperCommand extends Command {
+         commands.put(Set.of("version"), new VersionCommand());
          commands.put(Set.of("dumpplugins"), new DumpPluginsCommand());
          commands.put(Set.of("fixlight"), new FixLightCommand());
-         commands.put(Set.of("debug", "chunkinfo", "holderinfo"), new ChunkDebugCommand());
 +        commands.put(Set.of("syncloadinfo"), new SyncLoadInfoCommand());
  
          return commands.entrySet().stream()
@@ -304,19 +304,27 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
 +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
 @@ -0,0 +0,0 @@ public class ServerChunkCache extends ChunkSource {
-                 // Paper start - async chunk io/loading
-                 io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.pushChunkWait(this.level, x1, z1); // Paper - rewrite chunk system
-                 // Paper end
+     @Nullable
+     @Override
+     public ChunkAccess getChunk(int x, int z, ChunkStatus leastStatus, boolean create) {
++        final int x1 = x; final int z1 = z; // Paper - conflict on variable change
+         if (Thread.currentThread() != this.mainThread) {
+             return (ChunkAccess) CompletableFuture.supplyAsync(() -> {
+                 return this.getChunk(x, z, leastStatus, create);
+@@ -0,0 +0,0 @@ public class ServerChunkCache extends ChunkSource {
+ 
+             Objects.requireNonNull(completablefuture);
+             if (!completablefuture.isDone()) { // Paper
 +                com.destroystokyo.paper.io.SyncLoadFinder.logSyncLoad(this.level, x1, z1); // Paper - sync load info
                  this.level.timings.syncChunkLoad.startTiming(); // Paper
              chunkproviderserver_b.managedBlock(completablefuture::isDone);
-                 io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.popChunkWait(); // Paper - async chunk debug  // Paper - rewrite chunk system
+                 this.level.timings.syncChunkLoad.stopTiming(); // Paper
 diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java
 +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
 @@ -0,0 +0,0 @@ public class ServerLevel extends Level implements WorldGenLevel {
-         this.entityLookup = new io.papermc.paper.chunk.system.entity.EntityLookup(this, new EntityCallbacks()); // Paper - rewrite chunk system
+         this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit
      }
  
 +    // Paper start
diff --git a/patches/unapplied/server/Add-option-to-allow-iron-golems-to-spawn-in-air.patch b/patches/server/Add-option-to-allow-iron-golems-to-spawn-in-air.patch
similarity index 100%
rename from patches/unapplied/server/Add-option-to-allow-iron-golems-to-spawn-in-air.patch
rename to patches/server/Add-option-to-allow-iron-golems-to-spawn-in-air.patch
diff --git a/patches/unapplied/server/Add-option-to-nerf-pigmen-from-nether-portals.patch b/patches/server/Add-option-to-nerf-pigmen-from-nether-portals.patch
similarity index 100%
rename from patches/unapplied/server/Add-option-to-nerf-pigmen-from-nether-portals.patch
rename to patches/server/Add-option-to-nerf-pigmen-from-nether-portals.patch
diff --git a/patches/unapplied/server/Add-tick-times-API-and-mspt-command.patch b/patches/server/Add-tick-times-API-and-mspt-command.patch
similarity index 99%
rename from patches/unapplied/server/Add-tick-times-API-and-mspt-command.patch
rename to patches/server/Add-tick-times-API-and-mspt-command.patch
index bc476a98b5..79a407fb35 100644
--- a/patches/unapplied/server/Add-tick-times-API-and-mspt-command.patch
+++ b/patches/server/Add-tick-times-API-and-mspt-command.patch
@@ -149,7 +149,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        tickTimes10s.add(this.tickCount, j);
 +        tickTimes60s.add(this.tickCount, j);
 +        // Paper end
-         this.frameTimer.logFrameDuration(k - i);
+         this.logTickTime(k - i);
          this.profiler.pop();
          org.spigotmc.WatchdogThread.tick(); // Spigot
 @@ -0,0 +0,0 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
diff --git a/patches/server/Adventure.patch b/patches/server/Adventure.patch
index ad9faabe7c..8d60f71caf 100644
--- a/patches/server/Adventure.patch
+++ b/patches/server/Adventure.patch
@@ -3824,7 +3824,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        } else {
 +            hash = "";
 +        }
-+        this.getHandle().sendTexturePack(url, hash, force, io.papermc.paper.adventure.PaperAdventure.asVanilla(prompt));
++        this.getHandle().connection.send(new ClientboundResourcePackPacket(url, hash, force, io.papermc.paper.adventure.PaperAdventure.asVanilla(prompt)));
 +    }
 +    // Paper end
 +
diff --git a/patches/server/Basic-PlayerProfile-API.patch b/patches/server/Basic-PlayerProfile-API.patch
index 9f4979f210..3a1522bc8c 100644
--- a/patches/server/Basic-PlayerProfile-API.patch
+++ b/patches/server/Basic-PlayerProfile-API.patch
@@ -11,7 +11,7 @@ public org.bukkit.craftbukkit.profile.CraftPlayerTextures
 public org.bukkit.craftbukkit.profile.CraftPlayerTextures copyFrom(Lorg/bukkit/profile/PlayerTextures;)V
 public org.bukkit.craftbukkit.profile.CraftPlayerTextures rebuildPropertyIfDirty()V
 public org.bukkit.craftbukkit.profile.CraftPlayerProfile toString(Lcom/mojang/authlib/properties/PropertyMap;)Ljava/lang/String;
-# needed to maintain visibility with overriden methods
+# needed to maintain visibility with overridden methods
 public org.bukkit.craftbukkit.profile.CraftPlayerProfile getProperty(Ljava/lang/String;)Lcom/mojang/authlib/properties/Property;
 public org.bukkit.craftbukkit.profile.CraftPlayerProfile setProperty(Ljava/lang/String;Lcom/mojang/authlib/properties/Property;)V
 
@@ -428,7 +428,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@
 +package com.destroystokyo.paper.profile;
 +
-+import com.mojang.authlib.*;
++import com.mojang.authlib.Environment;
++import com.mojang.authlib.EnvironmentParser;
++import com.mojang.authlib.GameProfileRepository;
 +import com.mojang.authlib.minecraft.MinecraftSessionService;
 +import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
 +import com.mojang.authlib.yggdrasil.YggdrasilEnvironment;
@@ -436,25 +438,22 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +import java.net.Proxy;
 +
 +public class PaperAuthenticationService extends YggdrasilAuthenticationService {
++
 +    private final Environment environment;
++
 +    public PaperAuthenticationService(Proxy proxy) {
 +        super(proxy);
 +        this.environment = EnvironmentParser.getEnvironmentFromProperties().orElse(YggdrasilEnvironment.PROD.getEnvironment());
 +    }
 +
 +    @Override
-+    public UserAuthentication createUserAuthentication(Agent agent) {
-+        return new PaperUserAuthentication(this, agent);
-+    }
-+
-+    @Override
 +    public MinecraftSessionService createMinecraftSessionService() {
 +        return new PaperMinecraftSessionService(this, this.environment);
 +    }
 +
 +    @Override
 +    public GameProfileRepository createProfileRepository() {
-+        return new PaperGameProfileRepository(this, this.environment);
++        return new PaperGameProfileRepository(this.getProxy(), this.environment);
 +    }
 +}
 diff --git a/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java b/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java
@@ -465,20 +464,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@
 +package com.destroystokyo.paper.profile;
 +
-+import com.mojang.authlib.Agent;
 +import com.mojang.authlib.Environment;
 +import com.mojang.authlib.ProfileLookupCallback;
-+import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
 +import com.mojang.authlib.yggdrasil.YggdrasilGameProfileRepository;
++import java.net.Proxy;
 +
 +public class PaperGameProfileRepository extends YggdrasilGameProfileRepository {
-+    public PaperGameProfileRepository(YggdrasilAuthenticationService authenticationService, Environment environment) {
-+        super(authenticationService, environment);
++    public PaperGameProfileRepository(Proxy proxy, Environment environment) {
++        super(proxy, environment);
 +    }
 +
 +    @Override
-+    public void findProfilesByNames(String[] names, Agent agent, ProfileLookupCallback callback) {
-+        super.findProfilesByNames(names, agent, callback);
++    public void findProfilesByNames(String[] names, ProfileLookupCallback callback) {
++        super.findProfilesByNames(names, callback);
 +    }
 +}
 diff --git a/src/main/java/com/destroystokyo/paper/profile/PaperMinecraftSessionService.java b/src/main/java/com/destroystokyo/paper/profile/PaperMinecraftSessionService.java
@@ -492,14 +490,20 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +import com.mojang.authlib.Environment;
 +import com.mojang.authlib.GameProfile;
 +import com.mojang.authlib.minecraft.MinecraftProfileTexture;
++import com.mojang.authlib.yggdrasil.ProfileResult;
++import com.mojang.authlib.yggdrasil.ServicesKeySet;
 +import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
 +import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService;
 +
++import java.net.Proxy;
 +import java.util.Map;
++import java.util.UUID;
++import org.jetbrains.annotations.Nullable;
 +
 +public class PaperMinecraftSessionService extends YggdrasilMinecraftSessionService {
-+    protected PaperMinecraftSessionService(YggdrasilAuthenticationService authenticationService, Environment environment) {
-+        super(authenticationService, environment);
++
++    protected PaperMinecraftSessionService(ServicesKeySet servicesKeySet, Proxy proxy, Environment environment) {
++        super(servicesKeySet, proxy, environment);
 +    }
 +
 +    @Override
@@ -508,31 +512,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
 +
 +    @Override
-+    public GameProfile fillProfileProperties(GameProfile profile, boolean requireSecure) {
-+        return super.fillProfileProperties(profile, requireSecure);
-+    }
-+
-+    @Override
-+    protected GameProfile fillGameProfile(GameProfile profile, boolean requireSecure) {
-+        return super.fillGameProfile(profile, requireSecure);
-+    }
-+}
-diff --git a/src/main/java/com/destroystokyo/paper/profile/PaperUserAuthentication.java b/src/main/java/com/destroystokyo/paper/profile/PaperUserAuthentication.java
-new file mode 100644
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
---- /dev/null
-+++ b/src/main/java/com/destroystokyo/paper/profile/PaperUserAuthentication.java
-@@ -0,0 +0,0 @@
-+package com.destroystokyo.paper.profile;
-+
-+import com.mojang.authlib.Agent;
-+import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
-+import com.mojang.authlib.yggdrasil.YggdrasilUserAuthentication;
-+import java.util.UUID;
-+
-+public class PaperUserAuthentication extends YggdrasilUserAuthentication {
-+    public PaperUserAuthentication(YggdrasilAuthenticationService authenticationService, Agent agent) {
-+        super(authenticationService, UUID.randomUUID().toString(), agent);
++    public @Nullable ProfileResult fetchProfile(final UUID profileId, final boolean requireSecure) {
++        return super.fetchProfile(profileId, requireSecure);
 +    }
 +}
 diff --git a/src/main/java/com/destroystokyo/paper/profile/SharedPlayerProfile.java b/src/main/java/com/destroystokyo/paper/profile/SharedPlayerProfile.java
diff --git a/patches/unapplied/server/Bees-get-gravity-in-void.-Fixes-MC-167279.patch b/patches/server/Bees-get-gravity-in-void.-Fixes-MC-167279.patch
similarity index 100%
rename from patches/unapplied/server/Bees-get-gravity-in-void.-Fixes-MC-167279.patch
rename to patches/server/Bees-get-gravity-in-void.-Fixes-MC-167279.patch
diff --git a/patches/server/Complete-resource-pack-API.patch b/patches/server/Complete-resource-pack-API.patch
index 650886d65c..3c7b179140 100644
--- a/patches/server/Complete-resource-pack-API.patch
+++ b/patches/server/Complete-resource-pack-API.patch
@@ -58,7 +58,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        net.minecraft.network.chat.Component promptComponent = resourcePackPrompt != null ?
 +                            io.papermc.paper.adventure.PaperAdventure.asVanilla(resourcePackPrompt) :
 +                           null;
-+        this.getHandle().sendTexturePack(url, hash, required, promptComponent);
++        this.getHandle().connection.send(new ClientboundResourcePackPacket(url, hash, required, promptComponent));
 +    }
 +
 +    @Override
diff --git a/patches/unapplied/server/Configurable-chance-of-villager-zombie-infection.patch b/patches/server/Configurable-chance-of-villager-zombie-infection.patch
similarity index 100%
rename from patches/unapplied/server/Configurable-chance-of-villager-zombie-infection.patch
rename to patches/server/Configurable-chance-of-villager-zombie-infection.patch
diff --git a/patches/unapplied/server/Dead-Player-s-shouldn-t-be-able-to-move.patch b/patches/server/Dead-Player-s-shouldn-t-be-able-to-move.patch
similarity index 100%
rename from patches/unapplied/server/Dead-Player-s-shouldn-t-be-able-to-move.patch
rename to patches/server/Dead-Player-s-shouldn-t-be-able-to-move.patch
diff --git a/patches/unapplied/server/Do-not-allow-bees-to-load-chunks-for-beehives.patch b/patches/server/Do-not-allow-bees-to-load-chunks-for-beehives.patch
similarity index 100%
rename from patches/unapplied/server/Do-not-allow-bees-to-load-chunks-for-beehives.patch
rename to patches/server/Do-not-allow-bees-to-load-chunks-for-beehives.patch
diff --git a/patches/unapplied/server/Don-t-move-existing-players-to-world-spawn.patch b/patches/server/Don-t-move-existing-players-to-world-spawn.patch
similarity index 94%
rename from patches/unapplied/server/Don-t-move-existing-players-to-world-spawn.patch
rename to patches/server/Don-t-move-existing-players-to-world-spawn.patch
index f04bca47dd..50a2b65ecc 100644
--- a/patches/unapplied/server/Don-t-move-existing-players-to-world-spawn.patch
+++ b/patches/server/Don-t-move-existing-players-to-world-spawn.patch
@@ -21,10 +21,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          this.advancements = server.getPlayerList().getPlayerAdvancements(this);
          this.setMaxUpStep(1.0F);
 -        this.fudgeSpawnLocation(world);
-+        //this.fudgeSpawnLocation(world); // Paper - don't move to spawn on login, only first join
++        // this.fudgeSpawnLocation(world); // Paper - don't move to spawn on login, only first join
+         this.updateOptions(clientOptions);
  
          this.cachedSingleHashSet = new com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<>(this); // Paper
- 
 @@ -0,0 +0,0 @@ public class ServerPlayer extends Player {
                  position = Vec3.atCenterOf(world.getSharedSpawnPos());
              }
diff --git a/patches/unapplied/server/Don-t-tick-dead-players.patch b/patches/server/Don-t-tick-dead-players.patch
similarity index 100%
rename from patches/unapplied/server/Don-t-tick-dead-players.patch
rename to patches/server/Don-t-tick-dead-players.patch
diff --git a/patches/unapplied/server/Entity-Activation-Range-2.0.patch b/patches/server/Entity-Activation-Range-2.0.patch
similarity index 99%
rename from patches/unapplied/server/Entity-Activation-Range-2.0.patch
rename to patches/server/Entity-Activation-Range-2.0.patch
index d24b803a52..4143dee12a 100644
--- a/patches/unapplied/server/Entity-Activation-Range-2.0.patch
+++ b/patches/server/Entity-Activation-Range-2.0.patch
@@ -564,8 +564,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +            ActivationType.VILLAGER.boundingBox = player.getBoundingBox().inflate( villagerActivationRange, worldHeight, villagerActivationRange );
 +            // Paper end
  
-             // Paper start
-             java.util.List<Entity> entities = world.getEntities((Entity)null, maxBB, null);
+             world.getEntities().get(maxBB, ActivationRange::activateEntity);
+         }
 @@ -0,0 +0,0 @@ public class ActivationRange
       * @param entity
       * @return
@@ -628,7 +628,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              {
 -                return true;
 +                return 20; // Paper
-+            }
+             }
+-            if ( entity instanceof Villager && ( (Villager) entity ).canBreed() )
 +            // Paper start
 +            if (entity instanceof Bee) {
 +                Bee bee = (Bee)entity;
@@ -656,8 +657,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +                        return config.villagersWorkImmunityFor;
 +                    }
 +                }
-             }
--            if ( entity instanceof Villager && ( (Villager) entity ).canBreed() )
++            }
 +            if ( entity instanceof Llama && ( (Llama) entity ).inCaravan() )
              {
 -                return true;
@@ -685,11 +685,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +            // Paper start
 +            if (entity instanceof Mob && ((Mob) entity).targetSelector.hasTasks() ) {
 +                return 0;
-             }
++            }
 +            if (entity instanceof Pillager) {
 +                Pillager pillager = (Pillager) entity;
 +                // TODO:?
-+            }
+             }
 +            // Paper end
          }
          // SPIGOT-6644: Otherwise the target refresh tick will be missed
diff --git a/patches/unapplied/server/Entity-Jump-API.patch b/patches/server/Entity-Jump-API.patch
similarity index 98%
rename from patches/unapplied/server/Entity-Jump-API.patch
rename to patches/server/Entity-Jump-API.patch
index f624a9fcb7..454edcc934 100644
--- a/patches/unapplied/server/Entity-Jump-API.patch
+++ b/patches/server/Entity-Jump-API.patch
@@ -9,9 +9,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
 +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
 @@ -0,0 +0,0 @@ public abstract class LivingEntity extends Entity implements Attackable {
-             } else if (this.isInLava() && (!this.onGround() || d7 > d8)) {
+             } else if (this.isInLava() && (!this.onGround() || d3 > d4)) {
                  this.jumpInLiquid(FluidTags.LAVA);
-             } else if ((this.onGround() || flag && d7 <= d8) && this.noJumpDelay == 0) {
+             } else if ((this.onGround() || flag && d3 <= d4) && this.noJumpDelay == 0) {
 +                if (new com.destroystokyo.paper.event.entity.EntityJumpEvent(getBukkitLivingEntity()).callEvent()) { // Paper
                  this.jumpFromGround();
                  this.noJumpDelay = 10;
diff --git a/patches/unapplied/server/Expose-MinecraftServer-isRunning.patch b/patches/server/Expose-MinecraftServer-isRunning.patch
similarity index 100%
rename from patches/unapplied/server/Expose-MinecraftServer-isRunning.patch
rename to patches/server/Expose-MinecraftServer-isRunning.patch
diff --git a/patches/server/Fill-Profile-Property-Events.patch b/patches/server/Fill-Profile-Property-Events.patch
index ff53dd9224..f7b9424847 100644
--- a/patches/server/Fill-Profile-Property-Events.patch
+++ b/patches/server/Fill-Profile-Property-Events.patch
@@ -14,29 +14,39 @@ diff --git a/src/main/java/com/destroystokyo/paper/profile/PaperMinecraftSession
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/com/destroystokyo/paper/profile/PaperMinecraftSessionService.java
 +++ b/src/main/java/com/destroystokyo/paper/profile/PaperMinecraftSessionService.java
-@@ -0,0 +0,0 @@
- package com.destroystokyo.paper.profile;
- 
- import com.mojang.authlib.Environment;
-+import com.destroystokyo.paper.event.profile.FillProfileEvent;
-+import com.destroystokyo.paper.event.profile.PreFillProfileEvent;
- import com.mojang.authlib.GameProfile;
- import com.mojang.authlib.minecraft.MinecraftProfileTexture;
- import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
 @@ -0,0 +0,0 @@ public class PaperMinecraftSessionService extends YggdrasilMinecraftSessionServi
- 
-     @Override
-     public GameProfile fillProfileProperties(GameProfile profile, boolean requireSecure) {
--        return super.fillProfileProperties(profile, requireSecure);
-+        CraftPlayerProfile playerProfile = (CraftPlayerProfile) CraftPlayerProfile.asBukkitMirror(profile);
-+        new PreFillProfileEvent(playerProfile).callEvent();
-+        profile = playerProfile.getGameProfile();
-+        if (profile.isComplete() && profile.getProperties().containsKey("textures")) {
-+            return profile;
-+        }
-+        GameProfile gameProfile = super.fillProfileProperties(profile, requireSecure);
-+        new FillProfileEvent(CraftPlayerProfile.asBukkitMirror(gameProfile)).callEvent();
-+        return gameProfile;
+         return super.getTextures(profile, requireSecure);
      }
  
-     @Override
+-    @Override
++    public @Nullable ProfileResult fetchProfile(GameProfile profile, final boolean requireSecure) {
++        CraftPlayerProfile playerProfile = (CraftPlayerProfile) CraftPlayerProfile.asBukkitMirror(profile);
++        new com.destroystokyo.paper.event.profile.PreFillProfileEvent(playerProfile).callEvent();
++        profile = playerProfile.getGameProfile();
++        if (profile.getProperties().containsKey("textures")) {
++            return new ProfileResult(profile, java.util.Collections.emptySet());
++        }
++        ProfileResult result = super.fetchProfile(profile.getId(), requireSecure);
++        if (result != null) {
++            new com.destroystokyo.paper.event.profile.FillProfileEvent(CraftPlayerProfile.asBukkitMirror(result.profile())).callEvent();
++        }
++        return result;
++    }
++
++    @Override @io.papermc.paper.annotation.DoNotUse @Deprecated
+     public @Nullable ProfileResult fetchProfile(final UUID profileId, final boolean requireSecure) {
+         return super.fetchProfile(profileId, requireSecure);
+     }
+diff --git a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
++++ b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
+@@ -0,0 +0,0 @@ public class SkullBlockEntity extends BlockEntity {
+             MinecraftSessionService minecraftsessionservice = SkullBlockEntity.sessionService;
+ 
+             if (minecraftsessionservice != null) {
+-                ProfileResult profileresult = minecraftsessionservice.fetchProfile(profile.getId(), true);
++                ProfileResult profileresult = minecraftsessionservice instanceof com.destroystokyo.paper.profile.PaperMinecraftSessionService paperMinecraftSessionService ? paperMinecraftSessionService.fetchProfile(profile, true) : minecraftsessionservice.fetchProfile(profile.getId(), true); // Paper
+ 
+                 return profileresult == null ? Optional.of(profile) : Optional.of(profileresult.profile());
+             } else {
diff --git a/patches/unapplied/server/Fix-items-vanishing-through-end-portal.patch b/patches/server/Fix-items-vanishing-through-end-portal.patch
similarity index 100%
rename from patches/unapplied/server/Fix-items-vanishing-through-end-portal.patch
rename to patches/server/Fix-items-vanishing-through-end-portal.patch
diff --git a/patches/unapplied/server/Fix-last-firework-in-stack-not-having-effects-when-d.patch b/patches/server/Fix-last-firework-in-stack-not-having-effects-when-d.patch
similarity index 73%
rename from patches/unapplied/server/Fix-last-firework-in-stack-not-having-effects-when-d.patch
rename to patches/server/Fix-last-firework-in-stack-not-having-effects-when-d.patch
index a2eef4eeca..ee1eaa2d22 100644
--- a/patches/unapplied/server/Fix-last-firework-in-stack-not-having-effects-when-d.patch
+++ b/patches/server/Fix-last-firework-in-stack-not-having-effects-when-d.patch
@@ -13,11 +13,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
 +++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
 @@ -0,0 +0,0 @@ public interface DispenseItemBehavior {
-                 }
  
                  itemstack1 = CraftItemStack.asNMSCopy(event.getItem());
--                FireworkRocketEntity entityfireworks = new FireworkRocketEntity(pointer.getLevel(), stack, pointer.x(), pointer.y(), pointer.x(), true);
-+                FireworkRocketEntity entityfireworks = new FireworkRocketEntity(pointer.getLevel(), itemstack1, pointer.x(), pointer.y(), pointer.x(), true); // Paper - GH-2871 - fix last firework in stack having no effects when dispensed
+                 Vec3 vec3d = DispenseItemBehavior.getEntityPokingOutOfBlockPos(pointer, EntityType.FIREWORK_ROCKET, enumdirection);
+-                FireworkRocketEntity entityfireworks = new FireworkRocketEntity(pointer.level(), stack, vec3d.x(), vec3d.y(), vec3d.z(), true);
++                FireworkRocketEntity entityfireworks = new FireworkRocketEntity(pointer.level(), itemstack1, vec3d.x(), vec3d.y(), vec3d.z(), true); // Paper - GH-2871 - fix last firework in stack having no effects when dispensed
  
-                 DispenseItemBehavior.setEntityPokingOutOfBlock(pointer, entityfireworks, enumdirection);
                  entityfireworks.shoot((double) enumdirection.getStepX(), (double) enumdirection.getStepY(), (double) enumdirection.getStepZ(), 0.5F, 1.0F);
+                 pointer.level().addFreshEntity(entityfireworks);
diff --git a/patches/unapplied/server/Implement-alternative-item-despawn-rate.patch b/patches/server/Implement-alternative-item-despawn-rate.patch
similarity index 100%
rename from patches/unapplied/server/Implement-alternative-item-despawn-rate.patch
rename to patches/server/Implement-alternative-item-despawn-rate.patch
diff --git a/patches/unapplied/server/Improve-Block-breakNaturally-API.patch b/patches/server/Improve-Block-breakNaturally-API.patch
similarity index 100%
rename from patches/unapplied/server/Improve-Block-breakNaturally-API.patch
rename to patches/server/Improve-Block-breakNaturally-API.patch
diff --git a/patches/server/Improve-exact-choice-recipe-ingredients.patch b/patches/server/Improve-exact-choice-recipe-ingredients.patch
index e7ee8a225b..e1e9d9e85e 100644
--- a/patches/server/Improve-exact-choice-recipe-ingredients.patch
+++ b/patches/server/Improve-exact-choice-recipe-ingredients.patch
@@ -150,7 +150,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              this.inventory = entity.getInventory();
              if (this.testClearGrid() || entity.isCreative()) {
                  this.stackedContents.clear();
-+                this.stackedContents.initialize(recipe); // Paper - better exact choice recipes
++                this.stackedContents.initialize(recipe.value()); // Paper - better exact choice recipes
                  entity.getInventory().fillStackedContents(this.stackedContents);
                  this.menu.fillCraftSlotsStackedContents(this.stackedContents);
                  if (this.stackedContents.canCraft(recipe.value(), (IntList)null)) {
diff --git a/patches/unapplied/server/Improve-java-version-check.patch b/patches/server/Improve-java-version-check.patch
similarity index 100%
rename from patches/unapplied/server/Improve-java-version-check.patch
rename to patches/server/Improve-java-version-check.patch
diff --git a/patches/unapplied/server/Lag-compensate-eating.patch b/patches/server/Lag-compensate-eating.patch
similarity index 100%
rename from patches/unapplied/server/Lag-compensate-eating.patch
rename to patches/server/Lag-compensate-eating.patch
diff --git a/patches/unapplied/server/Make-the-GUI-graph-fancier.patch b/patches/server/Make-the-GUI-graph-fancier.patch
similarity index 100%
rename from patches/unapplied/server/Make-the-GUI-graph-fancier.patch
rename to patches/server/Make-the-GUI-graph-fancier.patch
diff --git a/patches/unapplied/server/Optimise-Chunk-getFluid.patch b/patches/server/Optimise-Chunk-getFluid.patch
similarity index 100%
rename from patches/unapplied/server/Optimise-Chunk-getFluid.patch
rename to patches/server/Optimise-Chunk-getFluid.patch
diff --git a/patches/unapplied/server/Optimise-getChunkAt-calls-for-loaded-chunks.patch b/patches/server/Optimise-getChunkAt-calls-for-loaded-chunks.patch
similarity index 96%
rename from patches/unapplied/server/Optimise-getChunkAt-calls-for-loaded-chunks.patch
rename to patches/server/Optimise-getChunkAt-calls-for-loaded-chunks.patch
index 3bd61b6429..28344e744c 100644
--- a/patches/unapplied/server/Optimise-getChunkAt-calls-for-loaded-chunks.patch
+++ b/patches/server/Optimise-getChunkAt-calls-for-loaded-chunks.patch
@@ -24,7 +24,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
              gameprofilerfiller.incrementCounter("getChunk");
 @@ -0,0 +0,0 @@ public class ServerChunkCache extends ChunkSource {
-         if (!io.papermc.paper.util.TickThread.isTickThread()) { // Paper - rewrite chunk system
+         if (Thread.currentThread() != this.mainThread) {
              return null;
          } else {
 -            this.level.getProfiler().incrementCounter("getChunkNow");
diff --git a/patches/unapplied/server/Optimize-Collision-to-not-load-chunks.patch b/patches/server/Optimize-Collision-to-not-load-chunks.patch
similarity index 98%
rename from patches/unapplied/server/Optimize-Collision-to-not-load-chunks.patch
rename to patches/server/Optimize-Collision-to-not-load-chunks.patch
index 6b011ae480..912a520b18 100644
--- a/patches/unapplied/server/Optimize-Collision-to-not-load-chunks.patch
+++ b/patches/server/Optimize-Collision-to-not-load-chunks.patch
@@ -18,13 +18,13 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/server/players/PlayerList.java
 +++ b/src/main/java/net/minecraft/server/players/PlayerList.java
 @@ -0,0 +0,0 @@ public abstract class PlayerList {
+         entityplayer1.setShiftKeyDown(false);
          entityplayer1.forceSetPositionRotation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
-         // CraftBukkit end
  
 +        worldserver1.getChunkSource().addRegionTicket(net.minecraft.server.level.TicketType.POST_TELEPORT, new net.minecraft.world.level.ChunkPos(location.getBlockX() >> 4, location.getBlockZ() >> 4), 1, entityplayer.getId()); // Paper
          while (avoidSuffocation && !worldserver1.noCollision((Entity) entityplayer1) && entityplayer1.getY() < (double) worldserver1.getMaxBuildHeight()) {
+             // CraftBukkit end
              entityplayer1.setPos(entityplayer1.getX(), entityplayer1.getY() + 1.0D, entityplayer1.getZ());
-         }
 diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/Entity.java
diff --git a/patches/unapplied/server/Optimize-GoalSelector-Goal.Flag-Set-operations.patch b/patches/server/Optimize-GoalSelector-Goal.Flag-Set-operations.patch
similarity index 100%
rename from patches/unapplied/server/Optimize-GoalSelector-Goal.Flag-Set-operations.patch
rename to patches/server/Optimize-GoalSelector-Goal.Flag-Set-operations.patch
diff --git a/patches/unapplied/server/Optimize-call-to-getFluid-for-explosions.patch b/patches/server/Optimize-call-to-getFluid-for-explosions.patch
similarity index 100%
rename from patches/unapplied/server/Optimize-call-to-getFluid-for-explosions.patch
rename to patches/server/Optimize-call-to-getFluid-for-explosions.patch
diff --git a/patches/unapplied/server/Pillager-patrol-spawn-settings-and-per-player-option.patch b/patches/server/Pillager-patrol-spawn-settings-and-per-player-option.patch
similarity index 100%
rename from patches/unapplied/server/Pillager-patrol-spawn-settings-and-per-player-option.patch
rename to patches/server/Pillager-patrol-spawn-settings-and-per-player-option.patch
diff --git a/patches/server/Player.setPlayerProfile-API.patch b/patches/server/Player.setPlayerProfile-API.patch
index c21766683f..aae4f8bf14 100644
--- a/patches/server/Player.setPlayerProfile-API.patch
+++ b/patches/server/Player.setPlayerProfile-API.patch
@@ -179,7 +179,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +
 +        //Respawn the player then update their position and selected slot
 +        ServerLevel worldserver = handle.serverLevel();
-+        connection.send(new net.minecraft.network.protocol.game.ClientboundRespawnPacket(worldserver.dimensionTypeId(), worldserver.dimension(), net.minecraft.world.level.biome.BiomeManager.obfuscateSeed(worldserver.getSeed()), handle.gameMode.getGameModeForPlayer(), handle.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), net.minecraft.network.protocol.game.ClientboundRespawnPacket.KEEP_ALL_DATA, this.getHandle().getLastDeathLocation(), handle.getPortalCooldown()));
++        connection.send(new net.minecraft.network.protocol.game.ClientboundRespawnPacket(new net.minecraft.network.protocol.game.CommonPlayerSpawnInfo(worldserver.dimensionTypeId(), worldserver.dimension(), net.minecraft.world.level.biome.BiomeManager.obfuscateSeed(worldserver.getSeed()), handle.gameMode.getGameModeForPlayer(), handle.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), handle.getLastDeathLocation(), handle.getPortalCooldown()), net.minecraft.network.protocol.game.ClientboundRespawnPacket.KEEP_ALL_DATA));
 +        handle.onUpdateAbilities();
 +        connection.internalTeleport(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch(), java.util.Collections.emptySet());
 +        net.minecraft.server.MinecraftServer.getServer().getPlayerList().sendAllPlayerInfo(handle);
diff --git a/patches/server/PlayerAdvancementCriterionGrantEvent.patch b/patches/server/PlayerAdvancementCriterionGrantEvent.patch
index d9eebfe3e0..bcb646647d 100644
--- a/patches/server/PlayerAdvancementCriterionGrantEvent.patch
+++ b/patches/server/PlayerAdvancementCriterionGrantEvent.patch
@@ -13,7 +13,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
          if (advancementprogress.grantProgress(criterionName)) {
 +            // Paper start
-+            if (!new com.destroystokyo.paper.event.player.PlayerAdvancementCriterionGrantEvent(this.player.getBukkitEntity(), advancement.bukkit, criterionName).callEvent()) {
++            if (!new com.destroystokyo.paper.event.player.PlayerAdvancementCriterionGrantEvent(this.player.getBukkitEntity(), advancement.toBukkit(), criterionName).callEvent()) {
 +                advancementprogress.revokeProgress(criterionName);
 +                return false;
 +            }
diff --git a/patches/unapplied/server/Prevent-Double-PlayerChunkMap-adds-crashing-server.patch b/patches/server/Prevent-Double-PlayerChunkMap-adds-crashing-server.patch
similarity index 100%
rename from patches/unapplied/server/Prevent-Double-PlayerChunkMap-adds-crashing-server.patch
rename to patches/server/Prevent-Double-PlayerChunkMap-adds-crashing-server.patch
diff --git a/patches/server/Profile-Lookup-Events.patch b/patches/server/Profile-Lookup-Events.patch
index d9b9aff6a5..0da9dc4404 100644
--- a/patches/server/Profile-Lookup-Events.patch
+++ b/patches/server/Profile-Lookup-Events.patch
@@ -16,22 +16,20 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +import com.destroystokyo.paper.event.profile.LookupProfileEvent;
 +import com.destroystokyo.paper.event.profile.PreLookupProfileEvent;
 +import com.google.common.collect.Sets;
- import com.mojang.authlib.Agent;
  import com.mojang.authlib.Environment;
 +import com.mojang.authlib.GameProfile;
  import com.mojang.authlib.ProfileLookupCallback;
- import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
  import com.mojang.authlib.yggdrasil.YggdrasilGameProfileRepository;
- 
+ import java.net.Proxy;
 +import java.util.Set;
+ 
  public class PaperGameProfileRepository extends YggdrasilGameProfileRepository {
-     public PaperGameProfileRepository(YggdrasilAuthenticationService authenticationService, Environment environment) {
-         super(authenticationService, environment);
+     public PaperGameProfileRepository(Proxy proxy, Environment environment) {
 @@ -0,0 +0,0 @@ public class PaperGameProfileRepository extends YggdrasilGameProfileRepository {
  
      @Override
-     public void findProfilesByNames(String[] names, Agent agent, ProfileLookupCallback callback) {
--        super.findProfilesByNames(names, agent, callback);
+     public void findProfilesByNames(String[] names, ProfileLookupCallback callback) {
+-        super.findProfilesByNames(names, callback);
 +        Set<String> unfoundNames = Sets.newHashSet();
 +        for (String name : names) {
 +            PreLookupProfileEvent event = new PreLookupProfileEvent(name);
@@ -55,27 +53,21 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        // Some things were not found.... Proceed to look up.
 +        if (!unfoundNames.isEmpty()) {
 +            String[] namesArr = unfoundNames.toArray(new String[unfoundNames.size()]);
-+            super.findProfilesByNames(namesArr, agent, new PreProfileLookupCallback(callback));
++            super.findProfilesByNames(namesArr, new PreProfileLookupCallback(callback));
 +        }
 +    }
 +
-+    private static class PreProfileLookupCallback implements ProfileLookupCallback {
-+        private final ProfileLookupCallback callback;
-+
-+        PreProfileLookupCallback(ProfileLookupCallback callback) {
-+            this.callback = callback;
-+        }
-+
++    private record PreProfileLookupCallback(ProfileLookupCallback callback) implements ProfileLookupCallback {
 +        @Override
 +        public void onProfileLookupSucceeded(GameProfile gameProfile) {
 +            PlayerProfile from = CraftPlayerProfile.asBukkitMirror(gameProfile);
 +            new LookupProfileEvent(from).callEvent();
-+            callback.onProfileLookupSucceeded(gameProfile);
++            this.callback.onProfileLookupSucceeded(gameProfile);
 +        }
 +
 +        @Override
-+        public void onProfileLookupFailed(GameProfile gameProfile, Exception e) {
-+            callback.onProfileLookupFailed(gameProfile, e);
++        public void onProfileLookupFailed(final String profileName, final Exception exception) {
++            this.callback.onProfileLookupFailed(profileName, exception);
 +        }
      }
  }
diff --git a/patches/server/Remap-fixes.patch b/patches/server/Remap-fixes.patch
index 658c314a07..6c4101c29d 100644
--- a/patches/server/Remap-fixes.patch
+++ b/patches/server/Remap-fixes.patch
@@ -73,6 +73,21 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                  return new Object2ObjectLinkedOpenHashMap<>(); // CraftBukkit
              });
              ResourceLocation minecraftkey = recipeholder.id();
+diff --git a/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java b/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java
++++ b/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java
+@@ -0,0 +0,0 @@ public class LootTable {
+ 
+     public static class Builder implements FunctionUserBuilder<LootTable.Builder> {
+ 
+-        private final Builder<LootPool> pools = ImmutableList.builder();
+-        private final Builder<LootItemFunction> functions = ImmutableList.builder();
++        private final ImmutableList.Builder<LootPool> pools = ImmutableList.builder();
++        private final ImmutableList.Builder<LootItemFunction> functions = ImmutableList.builder();
+         private LootContextParamSet paramSet;
+         private Optional<ResourceLocation> randomSequence;
+ 
 diff --git a/src/test/java/org/bukkit/DyeColorsTest.java b/src/test/java/org/bukkit/DyeColorsTest.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/test/java/org/bukkit/DyeColorsTest.java
diff --git a/patches/unapplied/server/Remote-Connections-shouldn-t-hold-up-shutdown.patch b/patches/server/Remote-Connections-shouldn-t-hold-up-shutdown.patch
similarity index 100%
rename from patches/unapplied/server/Remote-Connections-shouldn-t-hold-up-shutdown.patch
rename to patches/server/Remote-Connections-shouldn-t-hold-up-shutdown.patch
diff --git a/patches/unapplied/server/Set-spigots-verbose-world-setting-to-false-by-def.patch b/patches/server/Set-spigots-verbose-world-setting-to-false-by-def.patch
similarity index 100%
rename from patches/unapplied/server/Set-spigots-verbose-world-setting-to-false-by-def.patch
rename to patches/server/Set-spigots-verbose-world-setting-to-false-by-def.patch
diff --git a/patches/server/Timings-v2.patch b/patches/server/Timings-v2.patch
index 98b84a2d1d..d81d7f0b5b 100644
--- a/patches/server/Timings-v2.patch
+++ b/patches/server/Timings-v2.patch
@@ -1862,7 +1862,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        @Override
 +        public int getPing()
 +        {
-+            return getHandle().latency;
++            return CraftPlayer.this.getPing();
 +        }
 +        // Paper end
      };
diff --git a/patches/unapplied/server/Tracking-Range-Improvements.patch b/patches/server/Tracking-Range-Improvements.patch
similarity index 100%
rename from patches/unapplied/server/Tracking-Range-Improvements.patch
rename to patches/server/Tracking-Range-Improvements.patch
diff --git a/patches/unapplied/server/Validate-tripwire-hook-placement-before-update.patch b/patches/server/Validate-tripwire-hook-placement-before-update.patch
similarity index 100%
rename from patches/unapplied/server/Validate-tripwire-hook-placement-before-update.patch
rename to patches/server/Validate-tripwire-hook-placement-before-update.patch
diff --git a/patches/unapplied/server/add-hand-to-BlockMultiPlaceEvent.patch b/patches/server/add-hand-to-BlockMultiPlaceEvent.patch
similarity index 100%
rename from patches/unapplied/server/add-hand-to-BlockMultiPlaceEvent.patch
rename to patches/server/add-hand-to-BlockMultiPlaceEvent.patch
diff --git a/patches/unapplied/server/implement-optional-per-player-mob-spawns.patch b/patches/server/implement-optional-per-player-mob-spawns.patch
similarity index 97%
rename from patches/unapplied/server/implement-optional-per-player-mob-spawns.patch
rename to patches/server/implement-optional-per-player-mob-spawns.patch
index d8a7e408a9..61809e5b52 100644
--- a/patches/unapplied/server/implement-optional-per-player-mob-spawns.patch
+++ b/patches/server/implement-optional-per-player-mob-spawns.patch
@@ -258,14 +258,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
      private final Long2LongMap chunkSaveCooldowns;
      private final Queue<Runnable> unloadQueue;
-     int viewDistance;
+     private int serverViewDistance;
 +    public final com.destroystokyo.paper.util.misc.PlayerAreaMap playerMobDistanceMap; // Paper
  
-     // Paper - rewrite chunk system
- 
+     // CraftBukkit start - recursion-safe executor for Chunk loadCallback() and unloadCallback()
+     public final CallbackExecutor callbackExecutor = new CallbackExecutor();
 @@ -0,0 +0,0 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
-         int chunkX = MCUtil.getChunkCoordinate(player.getX());
-         int chunkZ = MCUtil.getChunkCoordinate(player.getZ());
+         int chunkX = io.papermc.paper.util.MCUtil.getChunkCoordinate(player.getX());
+         int chunkZ = io.papermc.paper.util.MCUtil.getChunkCoordinate(player.getZ());
          // Note: players need to be explicitly added to distance maps before they can be updated
 +        // Paper start - per player mob spawning
 +        if (this.playerMobDistanceMap != null) {
@@ -275,7 +275,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      }
  
      void removePlayerFromDistanceMaps(ServerPlayer player) {
-         this.level.playerChunkLoader.removePlayer(player); // Paper - replace chunk loader
  
 +        // Paper start - per player mob spawning
 +        if (this.playerMobDistanceMap != null) {
@@ -285,10 +284,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      }
  
      void updateMaps(ServerPlayer player) {
-@@ -0,0 +0,0 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
-         int chunkZ = MCUtil.getChunkCoordinate(player.getZ());
+         int chunkX = io.papermc.paper.util.MCUtil.getChunkCoordinate(player.getX());
+         int chunkZ = io.papermc.paper.util.MCUtil.getChunkCoordinate(player.getZ());
          // Note: players need to be explicitly added to distance maps before they can be updated
-         this.level.playerChunkLoader.updatePlayer(player); // Paper - replace chunk loader
++
 +        // Paper start - per player mob spawning
 +        if (this.playerMobDistanceMap != null) {
 +            this.playerMobDistanceMap.update(player, chunkX, chunkZ, io.papermc.paper.chunk.system.ChunkSystem.getTickViewDistance(player));
diff --git a/patches/unapplied/server/Anti-Xray.patch b/patches/unapplied/skipped/Anti-Xray.patch
similarity index 100%
rename from patches/unapplied/server/Anti-Xray.patch
rename to patches/unapplied/skipped/Anti-Xray.patch
diff --git a/patches/unapplied/server/Guard-against-serializing-mismatching-chunk-coordina.patch b/patches/unapplied/skipped/Guard-against-serializing-mismatching-chunk-coordina.patch
similarity index 100%
rename from patches/unapplied/server/Guard-against-serializing-mismatching-chunk-coordina.patch
rename to patches/unapplied/skipped/Guard-against-serializing-mismatching-chunk-coordina.patch