diff --git a/patches/unapplied/server/Fix-inconsistencies-in-dispense-events-regarding-sta.patch b/patches/later/Fix-inconsistencies-in-dispense-events-regarding-sta.patch
similarity index 100%
rename from patches/unapplied/server/Fix-inconsistencies-in-dispense-events-regarding-sta.patch
rename to patches/later/Fix-inconsistencies-in-dispense-events-regarding-sta.patch
diff --git a/patches/unapplied/server/Ability-to-control-player-s-insomnia-and-phantoms.patch b/patches/server/Ability-to-control-player-s-insomnia-and-phantoms.patch
similarity index 97%
rename from patches/unapplied/server/Ability-to-control-player-s-insomnia-and-phantoms.patch
rename to patches/server/Ability-to-control-player-s-insomnia-and-phantoms.patch
index 859927fe88..3d30257e94 100644
--- a/patches/unapplied/server/Ability-to-control-player-s-insomnia-and-phantoms.patch
+++ b/patches/server/Ability-to-control-player-s-insomnia-and-phantoms.patch
@@ -9,9 +9,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/EntitySelector.java
 +++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java
 @@ -0,0 +0,0 @@ public final class EntitySelector {
-         return !entity.isSpectator();
      };
      public static final Predicate<Entity> CAN_BE_COLLIDED_WITH = EntitySelector.NO_SPECTATORS.and(Entity::canBeCollidedWith);
+     public static final Predicate<Entity> CAN_BE_PICKED = EntitySelector.NO_SPECTATORS.and(Entity::isPickable);
 -    public static Predicate<Player> IS_INSOMNIAC = (player) -> net.minecraft.util.Mth.clamp(((net.minecraft.server.level.ServerPlayer) player).getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE) >= 72000; // Paper - Add phantom creative and insomniac controls
 +    // Paper start - Ability to control player's insomnia and phantoms
 +    public static Predicate<Player> IS_INSOMNIAC = (player) -> {
diff --git a/patches/unapplied/server/Add-BlockLockCheckEvent.patch b/patches/server/Add-BlockLockCheckEvent.patch
similarity index 100%
rename from patches/unapplied/server/Add-BlockLockCheckEvent.patch
rename to patches/server/Add-BlockLockCheckEvent.patch
diff --git a/patches/unapplied/server/Add-Sneaking-API-for-Entities.patch b/patches/server/Add-Sneaking-API-for-Entities.patch
similarity index 100%
rename from patches/unapplied/server/Add-Sneaking-API-for-Entities.patch
rename to patches/server/Add-Sneaking-API-for-Entities.patch
diff --git a/patches/unapplied/server/Add-config-option-for-spider-worldborder-climbing.patch b/patches/server/Add-config-option-for-spider-worldborder-climbing.patch
similarity index 100%
rename from patches/unapplied/server/Add-config-option-for-spider-worldborder-climbing.patch
rename to patches/server/Add-config-option-for-spider-worldborder-climbing.patch
diff --git a/patches/unapplied/server/Add-missing-SpigotConfig-logCommands-check.patch b/patches/server/Add-missing-SpigotConfig-logCommands-check.patch
similarity index 100%
rename from patches/unapplied/server/Add-missing-SpigotConfig-logCommands-check.patch
rename to patches/server/Add-missing-SpigotConfig-logCommands-check.patch
diff --git a/patches/unapplied/server/Correctly-shrink-items-during-EntityResurrectEvent.patch b/patches/server/Correctly-shrink-items-during-EntityResurrectEvent.patch
similarity index 100%
rename from patches/unapplied/server/Correctly-shrink-items-during-EntityResurrectEvent.patch
rename to patches/server/Correctly-shrink-items-during-EntityResurrectEvent.patch
diff --git a/patches/unapplied/server/Expose-pre-collision-moving-velocity-to-VehicleBlock.patch b/patches/server/Expose-pre-collision-moving-velocity-to-VehicleBlock.patch
similarity index 96%
rename from patches/unapplied/server/Expose-pre-collision-moving-velocity-to-VehicleBlock.patch
rename to patches/server/Expose-pre-collision-moving-velocity-to-VehicleBlock.patch
index 905cf965aa..5167b36ee1 100644
--- a/patches/unapplied/server/Expose-pre-collision-moving-velocity-to-VehicleBlock.patch
+++ b/patches/server/Expose-pre-collision-moving-velocity-to-VehicleBlock.patch
@@ -12,7 +12,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
      }
  
-     public void move(MoverType movementType, Vec3 movement) {
+     public void move(MoverType type, Vec3 movement) {
 +        final Vec3 originalMovement = movement; // Paper - Expose pre-collision velocity
          if (this.noPhysics) {
              this.setPos(this.getX() + movement.x, this.getY() + movement.y, this.getZ() + movement.z);
diff --git a/patches/unapplied/server/Fix-NPE-on-Allay-stopDancing-while-not-dancing.patch b/patches/server/Fix-NPE-on-Allay-stopDancing-while-not-dancing.patch
similarity index 100%
rename from patches/unapplied/server/Fix-NPE-on-Allay-stopDancing-while-not-dancing.patch
rename to patches/server/Fix-NPE-on-Allay-stopDancing-while-not-dancing.patch
diff --git a/patches/unapplied/server/Fix-async-entity-add-due-to-fungus-trees.patch b/patches/server/Fix-async-entity-add-due-to-fungus-trees.patch
similarity index 100%
rename from patches/unapplied/server/Fix-async-entity-add-due-to-fungus-trees.patch
rename to patches/server/Fix-async-entity-add-due-to-fungus-trees.patch
diff --git a/patches/unapplied/server/Fix-premature-player-kicks-on-shutdown.patch b/patches/server/Fix-premature-player-kicks-on-shutdown.patch
similarity index 100%
rename from patches/unapplied/server/Fix-premature-player-kicks-on-shutdown.patch
rename to patches/server/Fix-premature-player-kicks-on-shutdown.patch
diff --git a/patches/unapplied/server/Flying-Fall-Damage.patch b/patches/server/Flying-Fall-Damage.patch
similarity index 100%
rename from patches/unapplied/server/Flying-Fall-Damage.patch
rename to patches/server/Flying-Fall-Damage.patch
diff --git a/patches/unapplied/server/Friction-API.patch b/patches/server/Friction-API.patch
similarity index 99%
rename from patches/unapplied/server/Friction-API.patch
rename to patches/server/Friction-API.patch
index c03834d2f1..b8955e1760 100644
--- a/patches/unapplied/server/Friction-API.patch
+++ b/patches/server/Friction-API.patch
@@ -67,7 +67,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public ItemEntity(EntityType<? extends ItemEntity> type, Level world) {
          super(type, world);
 @@ -0,0 +0,0 @@ public class ItemEntity extends Entity implements TraceableEntity {
-                 this.move(MoverType.SELF, this.getDeltaMovement());
+                 this.applyEffectsFromBlocks();
                  float f = 0.98F;
  
 -                if (this.onGround()) {
diff --git a/patches/unapplied/server/Improve-PortalEvents.patch b/patches/server/Improve-PortalEvents.patch
similarity index 58%
rename from patches/unapplied/server/Improve-PortalEvents.patch
rename to patches/server/Improve-PortalEvents.patch
index acfb8d4e39..8463376b53 100644
--- a/patches/unapplied/server/Improve-PortalEvents.patch
+++ b/patches/server/Improve-PortalEvents.patch
@@ -9,14 +9,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
 +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
 @@ -0,0 +0,0 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
-                 }
-                 // CraftBukkit start
-                 Location enter = this.getBukkitEntity().getLocation();
--                Location exit = (worldserver == null) ? null : CraftLocation.toBukkit(teleportTarget.pos(), worldserver.getWorld(), teleportTarget.yRot(), teleportTarget.xRot());
-+                Location exit =/* (worldserver == null) ? null : // Paper - always non-null */CraftLocation.toBukkit(teleportTarget.pos(), worldserver.getWorld(), teleportTarget.yRot(), teleportTarget.xRot());
-                 PlayerTeleportEvent tpEvent = new PlayerTeleportEvent(this.getBukkitEntity(), enter, exit, teleportTarget.cause());
-                 Bukkit.getServer().getPluginManager().callEvent(tpEvent);
-                 if (tpEvent.isCancelled() || tpEvent.getTo() == null) {
+ 
+             Location enter = this.getBukkitEntity().getLocation();
+             PositionMoveRotation absolutePosition = PositionMoveRotation.calculateAbsolute(PositionMoveRotation.of(this), PositionMoveRotation.of(teleportTarget), teleportTarget.relatives());
+-            Location exit = (worldserver == null) ? null : CraftLocation.toBukkit(absolutePosition.position(), worldserver.getWorld(), absolutePosition.yRot(), absolutePosition.xRot());
++            Location exit = /* (worldserver == null) ? null : // Paper - always non-null */CraftLocation.toBukkit(absolutePosition.position(), worldserver.getWorld(), absolutePosition.yRot(), absolutePosition.xRot());
+             PlayerTeleportEvent tpEvent = new PlayerTeleportEvent(this.getBukkitEntity(), enter, exit, teleportTarget.cause());
+             // Paper start - gateway-specific teleport event
+             if (this.portalProcess != null && this.portalProcess.isSamePortal(((net.minecraft.world.level.block.EndGatewayBlock) net.minecraft.world.level.block.Blocks.END_GATEWAY)) && this.serverLevel().getBlockEntity(this.portalProcess.getEntryPosition()) instanceof net.minecraft.world.level.block.entity.TheEndGatewayBlockEntity theEndGatewayBlockEntity) {
 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
@@ -59,7 +59,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +++ b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
 @@ -0,0 +0,0 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal {
          if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent
-         if (entity.canUsePortal(false) && Shapes.joinIsNotEmpty(Shapes.create(entity.getBoundingBox().move((double) (-pos.getX()), (double) (-pos.getY()), (double) (-pos.getZ()))), state.getShape(world, pos), BooleanOp.AND)) {
+         if (entity.canUsePortal(false)) {
              // CraftBukkit start - Entity in portal
 -            EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ()));
 +            EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ()), org.bukkit.PortalType.ENDER); // Paper - add portal type
@@ -72,7 +72,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          ServerLevel worldserver1 = world.getServer().getLevel(resourcekey);
  
          if (worldserver1 == null) {
--            return new DimensionTransition(PlayerTeleportEvent.TeleportCause.END_PORTAL); // CraftBukkit- always fire event in case plugins wish to change it
+-            return new TeleportTransition(PlayerTeleportEvent.TeleportCause.END_PORTAL); // CraftBukkit- always fire event in case plugins wish to change it
 +            return null; // Paper - keep previous behavior of not firing PlayerTeleportEvent if the target world doesn't exist
          } else {
              boolean flag = resourcekey == Level.END;
@@ -96,23 +96,89 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          // Paper end - Add EntityPortalReadyEvent
  
          if (worldserver1 == null) {
--            return new DimensionTransition(PlayerTeleportEvent.TeleportCause.NETHER_PORTAL); // always fire event in case plugins wish to change it
+-            return new TeleportTransition(PlayerTeleportEvent.TeleportCause.NETHER_PORTAL); // always fire event in case plugins wish to change it
 +            return null; // Paper - keep previous behavior of not firing PlayerTeleportEvent if the target world doesn't exist
          } else {
              boolean flag = worldserver1.getTypeKey() == LevelStem.NETHER;
              // CraftBukkit end
 diff --git a/src/main/java/net/minecraft/world/level/portal/DimensionTransition.java b/src/main/java/net/minecraft/world/level/portal/DimensionTransition.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/level/portal/DimensionTransition.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
+--- /dev/null
 +++ b/src/main/java/net/minecraft/world/level/portal/DimensionTransition.java
-@@ -0,0 +0,0 @@ public record DimensionTransition(ServerLevel newLevel, Vec3 pos, Vec3 speed, fl
-         this(newLevel, pos, speed, yRot, xRot, missingRespawnBlock, postDimensionTransition, PlayerTeleportEvent.TeleportCause.UNKNOWN);
-     }
- 
--    public DimensionTransition(PlayerTeleportEvent.TeleportCause cause) {
--        this(null, Vec3.ZERO, Vec3.ZERO, 0.0F, 0.0F, false, DO_NOTHING, cause);
--    }
+@@ -0,0 +0,0 @@
++package net.minecraft.world.level.portal;
++
++import net.minecraft.core.BlockPos;
++import net.minecraft.network.protocol.game.ClientboundLevelEventPacket;
++import net.minecraft.server.level.ServerLevel;
++import net.minecraft.server.level.ServerPlayer;
++import net.minecraft.world.entity.Entity;
++import net.minecraft.world.phys.Vec3;
++// CraftBukkit start
++import org.bukkit.event.player.PlayerTeleportEvent;
++
++public record DimensionTransition(ServerLevel newLevel, Vec3 pos, Vec3 speed, float yRot, float xRot, boolean missingRespawnBlock, DimensionTransition.PostDimensionTransition postDimensionTransition, PlayerTeleportEvent.TeleportCause cause) {
++
++    public DimensionTransition(ServerLevel newLevel, Vec3 pos, Vec3 speed, float yRot, float xRot, boolean missingRespawnBlock, DimensionTransition.PostDimensionTransition postDimensionTransition) {
++        this(newLevel, pos, speed, yRot, xRot, missingRespawnBlock, postDimensionTransition, PlayerTeleportEvent.TeleportCause.UNKNOWN);
++    }
++
 +    // Paper - remove unused constructor (for safety)
-     // CraftBukkit end
- 
-     public static final DimensionTransition.PostDimensionTransition DO_NOTHING = (entity) -> {
++    // CraftBukkit end
++
++    public static final DimensionTransition.PostDimensionTransition DO_NOTHING = (entity) -> {
++    };
++    public static final DimensionTransition.PostDimensionTransition PLAY_PORTAL_SOUND = DimensionTransition::playPortalSound;
++    public static final DimensionTransition.PostDimensionTransition PLACE_PORTAL_TICKET = DimensionTransition::placePortalTicket;
++
++    public DimensionTransition(ServerLevel world, Vec3 pos, Vec3 velocity, float yaw, float pitch, DimensionTransition.PostDimensionTransition postDimensionTransition) {
++        // CraftBukkit start
++        this(world, pos, velocity, yaw, pitch, postDimensionTransition, PlayerTeleportEvent.TeleportCause.UNKNOWN);
++    }
++
++    public DimensionTransition(ServerLevel worldserver, Vec3 vec3d, Vec3 vec3d1, float f, float f1, DimensionTransition.PostDimensionTransition dimensiontransition_a, PlayerTeleportEvent.TeleportCause cause) {
++        this(worldserver, vec3d, vec3d1, f, f1, false, dimensiontransition_a, cause);
++    }
++
++    public DimensionTransition(ServerLevel world, Entity entity, DimensionTransition.PostDimensionTransition postDimensionTransition) {
++        this(world, entity, postDimensionTransition, PlayerTeleportEvent.TeleportCause.UNKNOWN);
++    }
++
++    public DimensionTransition(ServerLevel worldserver, Entity entity, DimensionTransition.PostDimensionTransition dimensiontransition_a, PlayerTeleportEvent.TeleportCause cause) {
++        this(worldserver, findAdjustedSharedSpawnPos(worldserver, entity), Vec3.ZERO, worldserver.getSharedSpawnAngle(), 0.0F, false, dimensiontransition_a, cause); // Paper - MC-200092 - fix spawn pos yaw being ignored
++        // CraftBukkit end
++    }
++
++    private static void playPortalSound(Entity entity) {
++        if (entity instanceof ServerPlayer entityplayer) {
++            entityplayer.connection.send(new ClientboundLevelEventPacket(1032, BlockPos.ZERO, 0, false));
++        }
++
++    }
++
++    private static void placePortalTicket(Entity entity) {
++        entity.placePortalTicket(BlockPos.containing(entity.position()));
++    }
++
++    public static DimensionTransition missingRespawnBlock(ServerLevel world, Entity entity, DimensionTransition.PostDimensionTransition postDimensionTransition) {
++        return new DimensionTransition(world, findAdjustedSharedSpawnPos(world, entity), Vec3.ZERO, world.getSharedSpawnAngle(), 0.0F, true, postDimensionTransition); // Paper - MC-200092 - fix spawn pos yaw being ignored
++    }
++
++    private static Vec3 findAdjustedSharedSpawnPos(ServerLevel world, Entity entity) {
++        return entity.adjustSpawnLocation(world, world.getSharedSpawnPos()).getBottomCenter();
++    }
++
++    @FunctionalInterface
++    public interface PostDimensionTransition {
++
++        void onTransition(Entity entity);
++
++        default DimensionTransition.PostDimensionTransition then(DimensionTransition.PostDimensionTransition next) {
++            return (entity) -> {
++                this.onTransition(entity);
++                next.onTransition(entity);
++            };
++        }
++    }
++}
diff --git a/patches/unapplied/server/Improve-inlining-for-some-hot-BlockBehavior-and-Flui.patch b/patches/server/Improve-inlining-for-some-hot-BlockBehavior-and-Flui.patch
similarity index 98%
rename from patches/unapplied/server/Improve-inlining-for-some-hot-BlockBehavior-and-Flui.patch
rename to patches/server/Improve-inlining-for-some-hot-BlockBehavior-and-Flui.patch
index fc405a61fd..a022f3babf 100644
--- a/patches/unapplied/server/Improve-inlining-for-some-hot-BlockBehavior-and-Flui.patch
+++ b/patches/server/Improve-inlining-for-some-hot-BlockBehavior-and-Flui.patch
@@ -29,7 +29,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          }
  
 @@ -0,0 +0,0 @@ public abstract class BlockBehaviour implements FeatureElement {
-             }
+             return this.solidRender;
          }
  
 -        public boolean canOcclude() {
diff --git a/patches/unapplied/server/Improve-logging-and-errors.patch b/patches/server/Improve-logging-and-errors.patch
similarity index 88%
rename from patches/unapplied/server/Improve-logging-and-errors.patch
rename to patches/server/Improve-logging-and-errors.patch
index 07e823030e..4a79f00924 100644
--- a/patches/unapplied/server/Improve-logging-and-errors.patch
+++ b/patches/server/Improve-logging-and-errors.patch
@@ -31,7 +31,7 @@ diff --git a/src/main/java/net/minecraft/server/ServerAdvancementManager.java b/
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/server/ServerAdvancementManager.java
 +++ b/src/main/java/net/minecraft/server/ServerAdvancementManager.java
-@@ -0,0 +0,0 @@ public class ServerAdvancementManager extends SimpleJsonResourceReloadListener {
+@@ -0,0 +0,0 @@ public class ServerAdvancementManager extends SimpleJsonResourceReloadListener<A
          AdvancementTree advancementtree = new AdvancementTree();
  
          advancementtree.addAll(this.advancements.values());
@@ -81,19 +81,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                  if (ResourceLocation.isValidNamespace(string)) {
                      set.add(string);
                  } else {
-diff --git a/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java b/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java
-+++ b/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java
-@@ -0,0 +0,0 @@ public class RecipeManager extends SimpleJsonResourceReloadListener {
-         this.byType = LinkedHashMultimap.create(builder.build());
-         this.byName = Maps.newHashMap(com_google_common_collect_immutablemap_builder.build());
-         // CraftBukkit end
--        RecipeManager.LOGGER.info("Loaded {} recipes", this.byType.size());
-+        RecipeManager.LOGGER.info("Loaded {} recipes", this.byName.size()); // Paper - Improve logging and errors; log correct number of recipes
-     }
- 
-     // CraftBukkit start
 diff --git a/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java b/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java
diff --git a/patches/unapplied/server/ItemStack-damage-API.patch b/patches/server/ItemStack-damage-API.patch
similarity index 73%
rename from patches/unapplied/server/ItemStack-damage-API.patch
rename to patches/server/ItemStack-damage-API.patch
index 4484eed22c..6d15ba1ea5 100644
--- a/patches/unapplied/server/ItemStack-damage-API.patch
+++ b/patches/server/ItemStack-damage-API.patch
@@ -17,18 +17,29 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@ public final class ItemStack implements DataComponentHolder {
      }
  
-     public void hurtAndBreak(int amount, ServerLevel world, @Nullable LivingEntity player, Consumer<Item> breakCallback) { // Paper - Add EntityDamageItemEvent
-+        // Paper start - add param to skip infinite mats check
+     public void hurtAndBreak(int amount, ServerLevel world, @Nullable LivingEntity player, Consumer<Item> breakCallback) {  // Paper - Add EntityDamageItemEvent
++        // Paper start - add force boolean overload
 +        this.hurtAndBreak(amount, world, player, breakCallback, false);
 +    }
-+    public void hurtAndBreak(int amount, ServerLevel world, @Nullable LivingEntity player, Consumer<Item> breakCallback, boolean force) {
-+        // Paper end - add param to skip infinite mats check
-         if (this.isDamageableItem()) {
--            if (player == null || !player.hasInfiniteMaterials()) {
-+            if (player == null || !player.hasInfiniteMaterials() || force) { // Paper
-                 if (amount > 0) {
-                     int originalDamage = amount; // Paper - Expand PlayerItemDamageEvent
-                     amount = EnchantmentHelper.processDurabilityChange(world, this, amount);
++    public void hurtAndBreak(int amount, ServerLevel world, @Nullable LivingEntity player, Consumer<Item> breakCallback, boolean force) {  // Paper - Add EntityDamageItemEvent
++        // Paper end
+         int originalDamage = amount; // Paper - Expand PlayerItemDamageEvent
+-        int j = this.processDurabilityChange(amount, world, player);
++        int j = this.processDurabilityChange(amount, world, player, force); // Paper
+         // CraftBukkit start
+         if (player instanceof final ServerPlayer serverPlayer) { // Paper - Add EntityDamageItemEvent
+             PlayerItemDamageEvent event = new PlayerItemDamageEvent(serverPlayer.getBukkitEntity(), CraftItemStack.asCraftMirror(this), j, originalDamage); // Paper - Add EntityDamageItemEvent
+@@ -0,0 +0,0 @@ public final class ItemStack implements DataComponentHolder {
+ 
+     }
+ 
+-    private int processDurabilityChange(int baseDamage, ServerLevel world, @Nullable LivingEntity player) {  // Paper - Add EntityDamageItemEvent
+-        return !this.isDamageableItem() ? 0 : (player instanceof ServerPlayer && player.hasInfiniteMaterials() ? 0 : (baseDamage > 0 ? EnchantmentHelper.processDurabilityChange(world, this, baseDamage) : baseDamage));  // Paper - Add EntityDamageItemEvent
++    private int processDurabilityChange(int baseDamage, ServerLevel world, @Nullable LivingEntity player, boolean force) {  // Paper - Add EntityDamageItemEvent
++        return !this.isDamageableItem() ? 0 : (player instanceof ServerPlayer && player.hasInfiniteMaterials() && !force ? 0 : (baseDamage > 0 ? EnchantmentHelper.processDurabilityChange(world, this, baseDamage) : baseDamage));  // Paper - Add EntityDamageItemEvent
+     }
+ 
+     private void applyDamage(int damage, @Nullable LivingEntity player, Consumer<Item> breakCallback) { // Paper - Add EntityDamageItemEvent
 @@ -0,0 +0,0 @@ public final class ItemStack implements DataComponentHolder {
      }
  
diff --git a/patches/unapplied/server/Limit-pet-look-distance.patch b/patches/server/Limit-pet-look-distance.patch
similarity index 100%
rename from patches/unapplied/server/Limit-pet-look-distance.patch
rename to patches/server/Limit-pet-look-distance.patch
diff --git a/patches/unapplied/server/Player-Entity-Tracking-Events.patch b/patches/server/Player-Entity-Tracking-Events.patch
similarity index 100%
rename from patches/unapplied/server/Player-Entity-Tracking-Events.patch
rename to patches/server/Player-Entity-Tracking-Events.patch
diff --git a/patches/unapplied/server/Remove-CraftItemStack-setAmount-null-assignment.patch b/patches/server/Remove-CraftItemStack-setAmount-null-assignment.patch
similarity index 100%
rename from patches/unapplied/server/Remove-CraftItemStack-setAmount-null-assignment.patch
rename to patches/server/Remove-CraftItemStack-setAmount-null-assignment.patch
diff --git a/patches/unapplied/server/Sync-offhand-slot-in-menus.patch b/patches/server/Sync-offhand-slot-in-menus.patch
similarity index 100%
rename from patches/unapplied/server/Sync-offhand-slot-in-menus.patch
rename to patches/server/Sync-offhand-slot-in-menus.patch
diff --git a/patches/unapplied/server/Use-single-player-info-update-packet-on-join.patch b/patches/server/Use-single-player-info-update-packet-on-join.patch
similarity index 100%
rename from patches/unapplied/server/Use-single-player-info-update-packet-on-join.patch
rename to patches/server/Use-single-player-info-update-packet-on-join.patch
diff --git a/patches/unapplied/server/Win-Screen-API.patch b/patches/server/Win-Screen-API.patch
similarity index 100%
rename from patches/unapplied/server/Win-Screen-API.patch
rename to patches/server/Win-Screen-API.patch
diff --git a/patches/unapplied/server/check-global-player-list-where-appropriate.patch b/patches/server/check-global-player-list-where-appropriate.patch
similarity index 97%
rename from patches/unapplied/server/check-global-player-list-where-appropriate.patch
rename to patches/server/check-global-player-list-where-appropriate.patch
index a3bf542347..c5ec5796f8 100644
--- a/patches/unapplied/server/check-global-player-list-where-appropriate.patch
+++ b/patches/server/check-global-player-list-where-appropriate.patch
@@ -10,7 +10,7 @@ diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/mai
 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 {
+@@ -0,0 +0,0 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
              entity.updateDynamicGameEventListener(DynamicGameEventListener::move);
          }
      }
@@ -41,7 +41,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
 +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
 @@ -0,0 +0,0 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
-             entityvillager.finalizeSpawn(world, world.getCurrentDifficultyAt(entityvillager.blockPosition()), MobSpawnType.CONVERSION, (SpawnGroupData) null);
+             entityvillager.finalizeSpawn(world, world.getCurrentDifficultyAt(entityvillager.blockPosition()), EntitySpawnReason.CONVERSION, (SpawnGroupData) null);
              entityvillager.refreshBrain(world);
              if (this.conversionStarter != null) {
 -                Player entityhuman = world.getPlayerByUUID(this.conversionStarter);
diff --git a/patches/unapplied/server/config-for-disabling-entity-tag-tags.patch b/patches/server/config-for-disabling-entity-tag-tags.patch
similarity index 100%
rename from patches/unapplied/server/config-for-disabling-entity-tag-tags.patch
rename to patches/server/config-for-disabling-entity-tag-tags.patch
diff --git a/patches/unapplied/server/fix-Instruments.patch b/patches/server/fix-Instruments.patch
similarity index 100%
rename from patches/unapplied/server/fix-Instruments.patch
rename to patches/server/fix-Instruments.patch