diff --git a/patches/api/Add-API-for-waxed-signs.patch b/patches/api/Add-API-for-waxed-signs.patch
deleted file mode 100644
index ff98ec4a2f..0000000000
--- a/patches/api/Add-API-for-waxed-signs.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic <jake.m.potrebic@gmail.com>
-Date: Thu, 8 Jun 2023 23:22:31 -0700
-Subject: [PATCH] Add API for waxed signs
-
-
-diff --git a/src/main/java/org/bukkit/block/Sign.java b/src/main/java/org/bukkit/block/Sign.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/block/Sign.java
-+++ b/src/main/java/org/bukkit/block/Sign.java
-@@ -0,0 +0,0 @@ public interface Sign extends TileState, Colorable {
-      * outside of this event is undefined.
-      *
-      * @return if this sign is currently editable
-+     * @deprecated use {@link #isWaxed()}
-      */
-+    @Deprecated // Paper
-     public boolean isEditable();
- 
-     /**
-@@ -0,0 +0,0 @@ public interface Sign extends TileState, Colorable {
-      * outside of this event is undefined.
-      *
-      * @param editable if this sign is currently editable
-+     * @deprecated use {@link #setWaxed(boolean)}
-      */
-+    @Deprecated // Paper
-     public void setEditable(boolean editable);
- 
-+    // Paper start
-+    /**
-+     * Gets whether the sign has been waxed and therefore prevents editing.
-+     *
-+     * @return true if waxed
-+     */
-+    boolean isWaxed();
-+
-+    /**
-+     * Sets whether the sign is waxed.
-+     *
-+     * @param waxed true to wax and therefore prevent editing
-+     */
-+    void setWaxed(boolean waxed);
-+    // Paper end
-+
-     /**
-      * Gets whether this sign has glowing text. Only affects the {@link Side#FRONT}.
-      *
diff --git a/patches/api/Add-Ban-Methods-to-Player-Objects.patch b/patches/api/Add-Ban-Methods-to-Player-Objects.patch
index cc1a03b8f2..4bd7f07d51 100644
--- a/patches/api/Add-Ban-Methods-to-Player-Objects.patch
+++ b/patches/api/Add-Ban-Methods-to-Player-Objects.patch
@@ -72,7 +72,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    // Paper end
  
      /**
-      * Checks if this player is whitelisted or not
+      * Adds this user to the {@link ProfileBanList}. If a previous ban exists, this will
 diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/entity/Player.java
diff --git a/patches/api/Add-player-health-update-API.patch b/patches/api/Add-player-health-update-API.patch
deleted file mode 100644
index 64512ec214..0000000000
--- a/patches/api/Add-player-health-update-API.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: SamB440 <sam@islandearth.net>
-Date: Wed, 17 Nov 2021 12:30:36 +0000
-Subject: [PATCH] Add player health update API
-
-
-diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/entity/Player.java
-+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -0,0 +0,0 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
-      */
-     public double getHealthScale();
- 
-+    // Paper start
-+    /**
-+     * Forcefully sends a health update to the player.
-+     * <p>This method can cause the client to display health values
-+     * different to their true server values. If the player takes damage or
-+     * causes an action to otherwise cause a health update, these values
-+     * will no longer be shown.</p>
-+     * Setting the visible health to 0 will result in the client seeing
-+     * the death screen, unable to press the respawn button.
-+     * @see #sendHealthUpdate()
-+     * @param health the health of the player
-+     * @param foodLevel the food level of the player
-+     * @param saturationLevel the saturation level of the player
-+     */
-+    public void sendHealthUpdate(final double health, final int foodLevel, final float saturationLevel);
-+    
-+    /**
-+     * Forcefully sends a health update to the player.
-+     * This uses the player's current health, saturation, and food level.
-+     * <p>Use after {@link #setHealth(double)} to show the heart animation
-+     * of gaining or losing health.</p>
-+     */
-+    public void sendHealthUpdate();
-+    // Paper end
-+    
-     /**
-      * Gets the entity which is followed by the camera when in
-      * {@link GameMode#SPECTATOR}.
diff --git a/patches/api/Adventure.patch b/patches/api/Adventure.patch
index 8075c09e61..3e9caa6a36 100644
--- a/patches/api/Adventure.patch
+++ b/patches/api/Adventure.patch
@@ -2270,8 +2270,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    // Paper end
 +
      /**
-      * Says a message (or runs a command).
-      *
+      * Adds this user to the {@link ProfileBanList}. If a previous ban exists, this will
+      * update the entry.
 @@ -0,0 +0,0 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
       */
      public void sendEquipmentChange(@NotNull LivingEntity entity, @NotNull Map<EquipmentSlot, ItemStack> items);
diff --git a/patches/api/Fix-upstream-javadocs.patch b/patches/api/Fix-upstream-javadocs.patch
index 4c9061bca9..a84bdc1b47 100644
--- a/patches/api/Fix-upstream-javadocs.patch
+++ b/patches/api/Fix-upstream-javadocs.patch
@@ -9,7 +9,7 @@ diff --git a/src/main/java/org/bukkit/BanList.java b/src/main/java/org/bukkit/Ba
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/BanList.java
 +++ b/src/main/java/org/bukkit/BanList.java
-@@ -0,0 +0,0 @@ public interface BanList {
+@@ -0,0 +0,0 @@ public interface BanList<T> {
  
      /**
       * Gets a {@link BanEntry} by target.
@@ -19,12 +19,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
       *
       * @param target entry parameter to search for
       * @return the corresponding entry, or null if none found
-@@ -0,0 +0,0 @@ public interface BanList {
-     public BanEntry getBanEntry(@NotNull String target);
- 
+@@ -0,0 +0,0 @@ public interface BanList<T> {
      /**
--     * Adds a ban to the this list. If a previous ban exists, this will
-+     * Adds a ban to this list. If a previous ban exists, this will
+      * Adds a ban to this list. If a previous ban exists, this will
       * update the previous entry.
 +     * <p>
 +     * Bans by name for ban type {@link Type#NAME NAME} are no longer supported and this method will return
@@ -32,7 +29,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
       *
       * @param target the target of the ban
       * @param reason reason for the ban, null indicates implementation default
-@@ -0,0 +0,0 @@ public interface BanList {
+@@ -0,0 +0,0 @@ public interface BanList<T> {
      /**
       * Gets if a {@link BanEntry} exists for the target, indicating an active
       * ban status.
@@ -41,8 +38,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +     * The replacement is bans by UUID.
       *
       * @param target the target to find
-      * @return true if a {@link BanEntry} exists for the name, indicating an
-@@ -0,0 +0,0 @@ public interface BanList {
+      * @return true if a {@link BanEntry} exists for the target, indicating an
+@@ -0,0 +0,0 @@ public interface BanList<T> {
      /**
       * Removes the specified target from this list, therefore indicating a
       * "not banned" status.
@@ -56,18 +53,6 @@ diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Buk
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/Bukkit.java
 +++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -0,0 +0,0 @@ public final class Bukkit {
-     }
- 
-     /**
--     * Gets a ban list for the supplied type.
--     * <p>
--     * Bans by name are no longer supported and this method will return
--     * null when trying to request them. The replacement is bans by UUID.
-+     * Gets a ban list for the supplied type. <!-- Paper Remove notice: wrong place -->
-      *
-      * @param type the type of list to fetch, cannot be null
-      * @return a ban list of the specified type
 @@ -0,0 +0,0 @@ public final class Bukkit {
  
      /**
@@ -148,18 +133,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
       */
      public int getTicksPerSpawns(@NotNull SpawnCategory spawnCategory);
  
-@@ -0,0 +0,0 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
-     public Set<OfflinePlayer> getBannedPlayers();
- 
-     /**
--     * Gets a ban list for the supplied type.
--     * <p>
--     * Bans by name are no longer supported and this method will return
--     * null when trying to request them. The replacement is bans by UUID.
-+     * Gets a ban list for the supplied type. <!-- Paper Remove notice: wrong place -->
-      *
-      * @param type the type of list to fetch, cannot be null
-      * @return a ban list of the specified type
 @@ -0,0 +0,0 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
  
      /**
diff --git a/patches/api/Missing-Entity-Behavior-API.patch b/patches/api/Missing-Entity-Behavior-API.patch
index 925cd16d23..f0a3af3118 100644
--- a/patches/api/Missing-Entity-Behavior-API.patch
+++ b/patches/api/Missing-Entity-Behavior-API.patch
@@ -796,31 +796,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
      /**
       * Represents the various types a Rabbit might be.
-diff --git a/src/main/java/org/bukkit/entity/Raider.java b/src/main/java/org/bukkit/entity/Raider.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/entity/Raider.java
-+++ b/src/main/java/org/bukkit/entity/Raider.java
-@@ -0,0 +0,0 @@ public interface Raider extends Monster {
-      */
-     @NotNull
-     Sound getCelebrationSound();
-+
-+    // Paper start
-+    /**
-+     * Returns whether the raider is celebrating a raid victory.
-+     *
-+     * @return whether the raider is celebrating a raid victory
-+     */
-+    boolean isCelebrating();
-+
-+    /**
-+     * Sets whether the raider is celebrating a raid victory.
-+     *
-+     * @param celebrating whether the raider is celebrating a raid victory
-+     */
-+    void setCelebrating(boolean celebrating);
-+    // Paper end
- }
 diff --git a/src/main/java/org/bukkit/entity/Ravager.java b/src/main/java/org/bukkit/entity/Ravager.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/entity/Ravager.java
diff --git a/patches/api/Paper-Plugins.patch b/patches/api/Paper-Plugins.patch
index 764840f8b0..c9fe1910f5 100644
--- a/patches/api/Paper-Plugins.patch
+++ b/patches/api/Paper-Plugins.patch
@@ -1444,7 +1444,7 @@ diff --git a/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java b/src/ma
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java
 +++ b/src/main/java/org/bukkit/plugin/PluginDescriptionFile.java
-@@ -0,0 +0,0 @@ import org.yaml.snakeyaml.nodes.Tag;
+@@ -0,0 +0,0 @@ import org.yaml.snakeyaml.representer.Representer;
   *      inferno.burningdeaths: true
   *</pre></blockquote>
   */
diff --git a/patches/api/Player.setPlayerProfile-API.patch b/patches/api/Player.setPlayerProfile-API.patch
index 77217f246c..61564602c1 100644
--- a/patches/api/Player.setPlayerProfile-API.patch
+++ b/patches/api/Player.setPlayerProfile-API.patch
@@ -54,7 +54,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    com.destroystokyo.paper.profile.PlayerProfile getPlayerProfile(); // Paper
  
      /**
-      * Checks if this player is banned or not
+      * Checks if this player has had their profile banned.
 diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/Server.java
diff --git a/patches/api/Properly-remove-the-experimental-smithing-inventory-.patch b/patches/api/Properly-remove-the-experimental-smithing-inventory-.patch
index ef86efbe48..6d3ec058c9 100644
--- a/patches/api/Properly-remove-the-experimental-smithing-inventory-.patch
+++ b/patches/api/Properly-remove-the-experimental-smithing-inventory-.patch
@@ -9,13 +9,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/org/bukkit/event/inventory/InventoryType.java
 +++ b/src/main/java/org/bukkit/event/inventory/InventoryType.java
 @@ -0,0 +0,0 @@ public enum InventoryType {
-     /**
-      * The new smithing inventory, with 3 CRAFTING slots and 1 RESULT slot.
       *
--     * @apiNote draft, experimental 1.20 API
-+     * @deprecated use {@link #SMITHING}
+      * @deprecated use {@link #SMITHING}
       */
--    @MinecraftExperimental
+-    @Deprecated
 +    @Deprecated(forRemoval = true) // Paper
      SMITHING_NEW(4, "Upgrade Gear"),
      ;
diff --git a/patches/server/Add-API-for-waxed-signs.patch b/patches/server/Add-API-for-waxed-signs.patch
deleted file mode 100644
index 0fa155e9bd..0000000000
--- a/patches/server/Add-API-for-waxed-signs.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic <jake.m.potrebic@gmail.com>
-Date: Thu, 8 Jun 2023 23:22:36 -0700
-Subject: [PATCH] Add API for waxed signs
-
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java
-+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java
-@@ -0,0 +0,0 @@ public class CraftSign<T extends SignBlockEntity> extends CraftBlockEntityState<
-         getSnapshot().setWaxed(!editable);
-     }
- 
-+    // Paper start
-+    @Override
-+    public boolean isWaxed() {
-+        return this.getSnapshot().isWaxed();
-+    }
-+
-+    @Override
-+    public void setWaxed(final boolean waxed) {
-+        this.getSnapshot().setWaxed(waxed);
-+    }
-+    // Paper end
-+
-     @Override
-     public boolean isGlowingText() {
-         return this.front.isGlowingText();
diff --git a/patches/server/Add-EntityInsideBlockEvent.patch b/patches/server/Add-EntityInsideBlockEvent.patch
index 11ec92768c..78f73c5cd5 100644
--- a/patches/server/Add-EntityInsideBlockEvent.patch
+++ b/patches/server/Add-EntityInsideBlockEvent.patch
@@ -97,7 +97,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      @Override
      public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
 +        if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper
-         if (entity instanceof Ravager && !CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)).isCancelled()) { // CraftBukkit
+         if (entity instanceof Ravager && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit
              world.destroyBlock(pos, true, entity);
          }
 diff --git a/src/main/java/net/minecraft/world/level/block/DetectorRailBlock.java b/src/main/java/net/minecraft/world/level/block/DetectorRailBlock.java
@@ -253,9 +253,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
          super.entityInside(state, world, pos, entity);
 +        if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper
-         if (world instanceof ServerLevel && entity instanceof Boat && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState()).isCancelled()) { // CraftBukkit
-             world.destroyBlock(new BlockPos(pos), true, entity);
-         }
+         if (world instanceof ServerLevel && entity instanceof Boat) {
+             // CraftBukkit start
+             if (!CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState())) {
 diff --git a/src/main/java/net/minecraft/world/level/block/WebBlock.java b/src/main/java/net/minecraft/world/level/block/WebBlock.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/level/block/WebBlock.java
diff --git a/patches/server/Add-EntityZapEvent.patch b/patches/server/Add-EntityZapEvent.patch
index 33ebee0b67..2a60b912b2 100644
--- a/patches/server/Add-EntityZapEvent.patch
+++ b/patches/server/Add-EntityZapEvent.patch
@@ -32,7 +32,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
 +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
 @@ -0,0 +0,0 @@ public class CraftEventFactory {
-         return event;
+         return !event.isCancelled();
      }
  
 +    // Paper start
@@ -43,6 +43,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
 +    // Paper end
 +
-     public static HorseJumpEvent callHorseJumpEvent(Entity horse, float power) {
-         HorseJumpEvent event = new HorseJumpEvent((AbstractHorse) horse.getBukkitEntity(), power);
-         horse.getBukkitEntity().getServer().getPluginManager().callEvent(event);
+     public static boolean callEntityChangeBlockEvent(Entity entity, BlockPos position, net.minecraft.world.level.block.state.BlockState newBlock) {
+         return CraftEventFactory.callEntityChangeBlockEvent(entity, position, newBlock, false);
+     }
diff --git a/patches/server/Add-ThrownEggHatchEvent.patch b/patches/server/Add-ThrownEggHatchEvent.patch
index a80f6cb56a..db2f39695c 100644
--- a/patches/server/Add-ThrownEggHatchEvent.patch
+++ b/patches/server/Add-ThrownEggHatchEvent.patch
@@ -11,17 +11,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEgg.java
 +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEgg.java
 @@ -0,0 +0,0 @@ public class ThrownEgg extends ThrowableItemProjectile {
-                     hatchingType = event.getHatchingType();
+                     }
                  }
- 
+                 // CraftBukkit end
 +                // Paper start
 +                com.destroystokyo.paper.event.entity.ThrownEggHatchEvent event = new com.destroystokyo.paper.event.entity.ThrownEggHatchEvent((org.bukkit.entity.Egg) getBukkitEntity(), hatching, b0, hatchingType);
 +                event.callEvent();
-+
 +                b0 = event.getNumHatches();
-+                hatching = event.isHatching();
 +                hatchingType = event.getHatchingType();
 +                // Paper end
-                 if (hatching) {
-                     for (int i = 0; i < b0; ++i) {
-                         Entity entity = this.level().getWorld().createEntity(new org.bukkit.Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F), hatchingType.getEntityClass());
+ 
+                 for (int i = 0; i < b0; ++i) {
+                     Entity entitychicken = this.level().getWorld().createEntity(new org.bukkit.Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F), hatchingType.getEntityClass()); // CraftBukkit
diff --git a/patches/server/Add-player-health-update-API.patch b/patches/server/Add-player-health-update-API.patch
deleted file mode 100644
index ee6dcf17ea..0000000000
--- a/patches/server/Add-player-health-update-API.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: SamB440 <sam@islandearth.net>
-Date: Wed, 17 Nov 2021 12:31:42 +0000
-Subject: [PATCH] Add player health update API
-
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
-         this.getHandle().maxHealthCache = getMaxHealth();
-     }
- 
--    public void sendHealthUpdate() {
-+    // Paper start
-+    @Override
-+    public void sendHealthUpdate(final double health, final int foodLevel, final float saturationLevel) {
-         // Paper start - cancellable death event
--        ClientboundSetHealthPacket packet = new ClientboundSetHealthPacket(this.getScaledHealth(), this.getHandle().getFoodData().getFoodLevel(), this.getHandle().getFoodData().getSaturationLevel());
-+        ClientboundSetHealthPacket packet = new ClientboundSetHealthPacket((float) health, foodLevel, saturationLevel);
-         if (this.getHandle().queueHealthUpdatePacket) {
-             this.getHandle().queuedHealthUpdatePacket = packet;
-         } else {
-@@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
-         // Paper end
-     }
- 
-+    @Override
-+    public void sendHealthUpdate() {
-+        this.sendHealthUpdate(this.getScaledHealth(), this.getHandle().getFoodData().getFoodLevel(), this.getHandle().getFoodData().getSaturationLevel());
-+    }
-+    // Paper end
-+
-     public void injectScaledMaxHealth(Collection<AttributeInstance> collection, boolean force) {
-         if (!this.scaledHealth && !force) {
-             return;
diff --git a/patches/server/Build-system-changes.patch b/patches/server/Build-system-changes.patch
index 050771abfd..3a8579debc 100644
--- a/patches/server/Build-system-changes.patch
+++ b/patches/server/Build-system-changes.patch
@@ -90,7 +90,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +                    Date buildDate = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").parse(Main.class.getPackage().getImplementationVendor()); // Paper
  
                      Calendar deadline = Calendar.getInstance();
-                     deadline.add(Calendar.DAY_OF_YEAR, -3);
+                     deadline.add(Calendar.DAY_OF_YEAR, -7);
 diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
diff --git a/patches/server/CB-fixes.patch b/patches/server/CB-fixes.patch
index b002f67081..66002d856e 100644
--- a/patches/server/CB-fixes.patch
+++ b/patches/server/CB-fixes.patch
@@ -29,21 +29,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          this.structureManager = new StructureManager(this, this.serverLevelData.worldGenOptions(), this.structureCheck); // CraftBukkit
          if ((this.dimension() == Level.END && this.dimensionTypeRegistration().is(BuiltinDimensionTypes.END)) || env == org.bukkit.World.Environment.THE_END) { // CraftBukkit - Allow to create EnderDragonBattle in default and custom END
              this.dragonFight = new EndDragonFight(this, this.serverLevelData.worldGenOptions().seed(), this.serverLevelData.endDragonFightData()); // CraftBukkit
-diff --git a/src/main/java/net/minecraft/world/entity/Marker.java b/src/main/java/net/minecraft/world/entity/Marker.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/entity/Marker.java
-+++ b/src/main/java/net/minecraft/world/entity/Marker.java
-@@ -0,0 +0,0 @@ public class Marker extends Entity {
-     }
- 
-     @Override
--    protected void addPassenger(Entity passenger) {
--        throw new IllegalStateException("Should never addPassenger without checking couldAcceptPassenger()");
-+    protected boolean addPassenger(Entity passenger) { // Paper - fix return type
-+        return false; // Paper
-     }
- 
-     @Override
 diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java
diff --git a/patches/server/Don-t-allow-entities-to-ride-themselves-572.patch b/patches/server/Don-t-allow-entities-to-ride-themselves-572.patch
deleted file mode 100644
index c4a7431104..0000000000
--- a/patches/server/Don-t-allow-entities-to-ride-themselves-572.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Alfie Cleveland <alfeh@me.com>
-Date: Sun, 8 Jan 2017 04:31:36 +0000
-Subject: [PATCH] Don't allow entities to ride themselves - #572
-
-
-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
-+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
-     }
- 
-     protected boolean addPassenger(Entity entity) { // CraftBukkit
-+        if (entity == this) throw new IllegalArgumentException("Entities cannot become a passenger of themselves"); // Paper - issue 572
-         if (entity.getVehicle() != this) {
-             throw new IllegalStateException("Use x.startRiding(y), not y.addPassenger(x)");
-         } else {
diff --git a/patches/server/EndermanEscapeEvent.patch b/patches/server/EndermanEscapeEvent.patch
index 798d169bf7..21976b9f4f 100644
--- a/patches/server/EndermanEscapeEvent.patch
+++ b/patches/server/EndermanEscapeEvent.patch
@@ -12,7 +12,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
 +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
 @@ -0,0 +0,0 @@ public class EnderMan extends Monster implements NeutralMob {
-         this.setTarget(target, org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN, true);
+         this.setTarget(target, EntityTargetEvent.TargetReason.UNKNOWN, true);
      }
  
 +    // Paper start
@@ -22,7 +22,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    // Paper end
 +
      @Override
-     public boolean setTarget(LivingEntity entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fireEvent) {
+     public boolean setTarget(LivingEntity entityliving, EntityTargetEvent.TargetReason reason, boolean fireEvent) {
          if (!super.setTarget(entityliving, reason, fireEvent)) {
 @@ -0,0 +0,0 @@ public class EnderMan extends Monster implements NeutralMob {
          if (this.level().isDay() && this.tickCount >= this.targetChangeTime + 600) {
diff --git a/patches/server/Ensure-entity-passenger-world-matches-ridden-entity.patch b/patches/server/Ensure-entity-passenger-world-matches-ridden-entity.patch
index ae19c8bb22..ff4311d3b3 100644
--- a/patches/server/Ensure-entity-passenger-world-matches-ridden-entity.patch
+++ b/patches/server/Ensure-entity-passenger-world-matches-ridden-entity.patch
@@ -12,13 +12,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
      }
  
-     protected boolean addPassenger(Entity entity) { // CraftBukkit
-+        // Paper start
-+        if (entity.level != this.level) {
-+            LOGGER.error("Entity passenger world must match, cannot add " + entity + " as passenger to " + this, new Throwable());
-+            return false;
-+        }
-+        // Paper end
-         if (entity == this) throw new IllegalArgumentException("Entities cannot become a passenger of themselves"); // Paper - issue 572
-         if (entity.getVehicle() != this) {
-             throw new IllegalStateException("Use x.startRiding(y), not y.addPassenger(x)");
+     public boolean startRiding(Entity entity, boolean force) {
+-        if (entity == this.vehicle) {
++        if (entity == this.vehicle || entity.level != this.level) { // Paper - check level
+             return false;
+         } else if (!entity.couldAcceptPassenger()) {
+             return false;
diff --git a/patches/server/Fire-EntityChangeBlockEvent-in-more-places.patch b/patches/server/Fire-EntityChangeBlockEvent-in-more-places.patch
index 6c5e75a276..56232f75bd 100644
--- a/patches/server/Fire-EntityChangeBlockEvent-in-more-places.patch
+++ b/patches/server/Fire-EntityChangeBlockEvent-in-more-places.patch
@@ -34,7 +34,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -            world.setBlockAndUpdate(blockposition1, WeatheringCopper.getFirst(world.getBlockState(blockposition1)));
 +            // Paper start - call EntityChangeBlockEvent
 +            BlockState newBlock = WeatheringCopper.getFirst(world.getBlockState(blockposition1));
-+            if (!CraftEventFactory.callEntityChangeBlockEvent(lightning, blockposition1, newBlock).isCancelled()) {
++            if (CraftEventFactory.callEntityChangeBlockEvent(lightning, blockposition1, newBlock)) {
 +                world.setBlockAndUpdate(blockposition1, newBlock);
 +            }
 +            // Paper end
@@ -74,7 +74,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
          BlockPos blockposition1Final = blockposition1; // CraftBukkit - decompile error
          WeatheringCopper.getPrevious(iblockdata).ifPresent((iblockdata1) -> {
-+            if (!CraftEventFactory.callEntityChangeBlockEvent(lightning, blockposition1Final, iblockdata1).isCancelled()) // Paper - call EntityChangeBlockEvent
++            if (CraftEventFactory.callEntityChangeBlockEvent(lightning, blockposition1Final, iblockdata1)) // Paper - call EntityChangeBlockEvent
              world.setBlockAndUpdate(blockposition1Final, iblockdata1); // CraftBukkit - decompile error
          });
          world.levelEvent(3002, blockposition1, -1);
@@ -87,7 +87,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                                  if (world.getBlockState(blockPos3).isAir()) {
                                      BlockState blockState = frogSpawn.defaultBlockState();
 +                                    // Paper start
-+                                    if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, blockPos3, blockState).isCancelled()) {
++                                    if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, blockPos3, blockState)) {
 +                                        isPregnant.erase(); // forgot pregnant memory
 +                                        return true;
 +                                    }
@@ -104,7 +104,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
          if (optional4.isPresent()) {
 +            // Paper start - EntityChangeBlockEvent
-+            if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, blockPos, optional4.get()).isCancelled()) {
++            if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, blockPos, optional4.get())) {
 +                return InteractionResult.PASS;
 +            }
 +            // Paper end
@@ -120,7 +120,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              } else {
                  BlockState iblockdata1 = (BlockState) iblockdata.setValue(EndPortalFrameBlock.HAS_EYE, true);
 +                // Paper start
-+                if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(context.getPlayer(), blockposition, iblockdata1).isCancelled()) {
++                if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(context.getPlayer(), blockposition, iblockdata1)) {
 +                    return InteractionResult.PASS;
 +                }
 +                // Paper end
@@ -136,7 +136,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              Player player = context.getPlayer();
              ItemStack itemStack = context.getItemInHand();
 +            // Paper start - EntityChangeBlockEvent
-+            if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, blockPos, state).isCancelled()) {
++            if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, blockPos, state)) {
 +                if (!player.isCreative()) {
 +                    player.containerMenu.sendAllDataToRemote();
 +                }
@@ -155,7 +155,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
          if (context.getClickedFace() != Direction.DOWN && iblockdata.is(BlockTags.CONVERTABLE_TO_MUD) && PotionUtils.getPotion(itemstack) == Potions.WATER) {
 +            // Paper start
-+            if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entityhuman, blockposition, Blocks.MUD.defaultBlockState()).isCancelled()) {
++            if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entityhuman, blockposition, Blocks.MUD.defaultBlockState())) {
 +                entityhuman.containerMenu.sendAllDataToRemote();
 +                return InteractionResult.PASS;
 +            }
@@ -190,7 +190,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              if (blockState3 != null) {
                  if (!level.isClientSide) {
 +                    // Paper start
-+                    if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(context.getPlayer(), blockPos, blockState3).isCancelled()) {
++                    if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(context.getPlayer(), blockPos, blockState3)) {
 +                        return InteractionResult.PASS;
 +                    }
 +                    afterAction.run();
@@ -219,9 +219,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              // CraftBukkit start
              double rand = world.getRandom().nextDouble();
 -            BlockState iblockdata1 = ComposterBlock.addItem(user, state, DummyGeneratorAccess.INSTANCE, pos, stack, rand);
--            if (state == iblockdata1 || org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(user, pos, iblockdata1).isCancelled()) {
+-            if (state == iblockdata1 || !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(user, pos, iblockdata1)) {
 +            BlockState iblockdata1 = null; // Paper
-+            if (false && (state == iblockdata1 || org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(user, pos, iblockdata1).isCancelled())) { // Paper - call it later
++            if (false && (state == iblockdata1 || !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(user, pos, iblockdata1))) { // Paper - move event call into addItem
                  return state;
              }
              iblockdata1 = ComposterBlock.addItem(user, state, world, pos, stack, rand);
@@ -252,7 +252,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              int j = i + 1;
              BlockState iblockdata1 = (BlockState) iblockdata.setValue(ComposterBlock.LEVEL, j);
 +            // Paper start - move the EntityChangeBlockEvent here to avoid conflict later for the compost events
-+            if (entity != null && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition, iblockdata1).isCancelled()) {
++            if (entity != null && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition, iblockdata1)) {
 +                return null;
 +            }
 +            // Paper end
diff --git a/patches/server/Fix-api-checking-banned-ips.patch b/patches/server/Fix-api-checking-banned-ips.patch
deleted file mode 100644
index 0334e1c24e..0000000000
--- a/patches/server/Fix-api-checking-banned-ips.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic <jake.m.potrebic@gmail.com>
-Date: Wed, 22 Mar 2023 13:12:01 -0700
-Subject: [PATCH] Fix api checking banned ips
-
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftIpBanList.java b/src/main/java/org/bukkit/craftbukkit/CraftIpBanList.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftIpBanList.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftIpBanList.java
-@@ -0,0 +0,0 @@ public class CraftIpBanList implements org.bukkit.BanList {
-     public boolean isBanned(String target) {
-         Preconditions.checkArgument(target != null, "Target cannot be null");
- 
--        return this.list.isBanned(InetSocketAddress.createUnresolved(target, 0));
-+        return this.list.isBanned(target); // Paper - fix checking banned ips
-     }
- 
-     @Override
diff --git a/patches/server/Fix-cancelled-powdered-snow-bucket-placement.patch b/patches/server/Fix-cancelled-powdered-snow-bucket-placement.patch
index 984375188f..4f792cc631 100644
--- a/patches/server/Fix-cancelled-powdered-snow-bucket-placement.patch
+++ b/patches/server/Fix-cancelled-powdered-snow-bucket-placement.patch
@@ -25,7 +25,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +++ b/src/main/java/net/minecraft/world/item/ItemStack.java
 @@ -0,0 +0,0 @@ public final class ItemStack {
              int oldCount = this.getCount();
-             ServerLevel world = (ServerLevel) itemactioncontext.getLevel();
+             ServerLevel world = (ServerLevel) context.getLevel();
  
 -            if (!(this.getItem() instanceof BucketItem || this.getItem() instanceof SolidBucketItem)) { // if not bucket
 +            if (!(this.getItem() instanceof BucketItem/* || this.getItem() instanceof SolidBucketItem*/)) { // if not bucket // Paper - capture block states for snow buckets
diff --git a/patches/server/Fix-new-block-data-for-EntityChangeBlockEvent.patch b/patches/server/Fix-new-block-data-for-EntityChangeBlockEvent.patch
index 71b7e2ed92..bf5a1e38fa 100644
--- a/patches/server/Fix-new-block-data-for-EntityChangeBlockEvent.patch
+++ b/patches/server/Fix-new-block-data-for-EntityChangeBlockEvent.patch
@@ -10,11 +10,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java
 +++ b/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java
 @@ -0,0 +0,0 @@ public class EatBlockGoal extends Goal {
+                 BlockPos blockposition1 = blockposition.below();
  
                  if (this.level.getBlockState(blockposition1).is(Blocks.GRASS_BLOCK)) {
-                     // CraftBukkit
--                    if (!CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition1, Blocks.AIR.defaultBlockState(), !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)).isCancelled()) {
-+                    if (!CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition1, Blocks.DIRT.defaultBlockState(), !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)).isCancelled()) { // Paper - Fix wrong block state
+-                    if (CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition1, Blocks.AIR.defaultBlockState(), !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit
++                    if (CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition1, Blocks.DIRT.defaultBlockState(), !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - Fix wrong block state
                          this.level.levelEvent(2001, blockposition1, Block.getId(Blocks.GRASS_BLOCK.defaultBlockState()));
                          this.level.setBlock(blockposition1, Blocks.DIRT.defaultBlockState(), 2);
                      }
@@ -26,8 +26,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
                                  if (WitherBoss.canDestroy(iblockdata)) {
                                      // CraftBukkit start
--                                    if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, Blocks.AIR.defaultBlockState()).isCancelled()) {
-+                                    if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.getFluidState().createLegacyBlock()).isCancelled()) { // Paper
+-                                    if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, Blocks.AIR.defaultBlockState())) {
++                                    if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.getFluidState().createLegacyBlock())) { // Paper
                                          continue;
                                      }
                                      // CraftBukkit end
@@ -36,14 +36,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java
 +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java
 @@ -0,0 +0,0 @@ public class Ravager extends Raider {
-                     BlockState iblockdata = this.level().getBlockState(blockposition);
-                     Block block = iblockdata.getBlock();
  
--                    if (block instanceof LeavesBlock && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState()).isCancelled()) { // CraftBukkit
-+                    if (block instanceof LeavesBlock && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.getFluidState().createLegacyBlock()).isCancelled()) { // CraftBukkit // Paper
-                         flag = this.level().destroyBlock(blockposition, true, this) || flag;
-                     }
-                 }
+                     if (block instanceof LeavesBlock) {
+                         // CraftBukkit start
+-                        if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState())) {
++                        if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.getFluidState().createLegacyBlock())) { // Paper - use correct block state
+                             continue;
+                         }
+                         // CraftBukkit end
 diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
@@ -52,12 +52,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
                              if (block instanceof InfestedBlock) {
                                  // CraftBukkit start
--                                if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition1, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState()).isCancelled()) {
-+                                // Paper start
-+                                BlockState afterState = world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? net.minecraft.world.level.block.Blocks.AIR.defaultBlockState() : ((InfestedBlock) block).hostStateByInfested(world.getBlockState(blockposition1));
-+                                org.bukkit.event.entity.EntityChangeBlockEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition1, afterState);
-+                                if (event.isCancelled()) {
-+                                // Paper end
+-                                if (!CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition1, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState())) {
++                                // Paper start - use correct block state
++                                final BlockState afterState = world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? net.minecraft.world.level.block.Blocks.AIR.defaultBlockState() : ((InfestedBlock) block).hostStateByInfested(world.getBlockState(blockposition1));
++                                if (!CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition1, afterState)) {
++                                    // Paper end - use correct block state
                                      continue;
                                  }
                                  // CraftBukkit end
@@ -69,8 +68,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
          if (!world.isClientSide && projectile.mayInteract(world, blockposition) && projectile instanceof ThrownTrident && projectile.getDeltaMovement().length() > 0.6D) {
              // CraftBukkit start
--            if (CraftEventFactory.callEntityChangeBlockEvent(projectile, blockposition, Blocks.AIR.defaultBlockState()).isCancelled()) {
-+            if (CraftEventFactory.callEntityChangeBlockEvent(projectile, blockposition, state.getFluidState().createLegacyBlock()).isCancelled()) { // Paper
+-            if (!CraftEventFactory.callEntityChangeBlockEvent(projectile, blockposition, Blocks.AIR.defaultBlockState())) {
++            if (!CraftEventFactory.callEntityChangeBlockEvent(projectile, blockposition, state.getFluidState().createLegacyBlock())) { // Paper - use correct block state
                  return;
              }
              // CraftBukkit end
diff --git a/patches/server/Fix-spigot-sound-playing-for-BlockItem-ItemStacks.patch b/patches/server/Fix-spigot-sound-playing-for-BlockItem-ItemStacks.patch
index 77d52c26dc..3c0ccaceb7 100644
--- a/patches/server/Fix-spigot-sound-playing-for-BlockItem-ItemStacks.patch
+++ b/patches/server/Fix-spigot-sound-playing-for-BlockItem-ItemStacks.patch
@@ -14,7 +14,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                      if (this.item instanceof BlockItem) {
 -                        SoundType soundeffecttype = ((BlockItem) this.item).getBlock().defaultBlockState().getSoundType(); // TODO: not strictly correct, however currently only affects decorated pots
 +                        // Paper start
-+                        BlockPos position = new net.minecraft.world.item.context.BlockPlaceContext(itemactioncontext).getClickedPos();
++                        BlockPos position = new net.minecraft.world.item.context.BlockPlaceContext(context).getClickedPos();
 +                        net.minecraft.world.level.block.state.BlockState blockData = world.getBlockState(position);
 +                        SoundType soundeffecttype = blockData.getSoundType();
 +                        // Paper end
diff --git a/patches/server/Fix-this-stupid-bullshit.patch b/patches/server/Fix-this-stupid-bullshit.patch
index 997faaa22d..6cf977ef88 100644
--- a/patches/server/Fix-this-stupid-bullshit.patch
+++ b/patches/server/Fix-this-stupid-bullshit.patch
@@ -36,7 +36,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +++ b/src/main/java/org/bukkit/craftbukkit/Main.java
 @@ -0,0 +0,0 @@ public class Main {
                      Calendar deadline = Calendar.getInstance();
-                     deadline.add(Calendar.DAY_OF_YEAR, -3);
+                     deadline.add(Calendar.DAY_OF_YEAR, -7);
                      if (buildDate.before(deadline.getTime())) {
 -                        System.err.println("*** Error, this build is outdated ***");
 +                        // Paper start - This is some stupid bullshit
diff --git a/patches/server/Implement-alternative-item-despawn-rate.patch b/patches/server/Implement-alternative-item-despawn-rate.patch
index fa81e7fe6c..5eef75f5dd 100644
--- a/patches/server/Implement-alternative-item-despawn-rate.patch
+++ b/patches/server/Implement-alternative-item-despawn-rate.patch
@@ -24,7 +24,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -            if (!this.level().isClientSide && this.age >= this.level().spigotConfig.itemDespawnRate) { // Spigot
 +            if (!this.level().isClientSide && this.age >= this.despawnRate) { // Spigot // Paper
                  // CraftBukkit start - fire ItemDespawnEvent
-                 if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) {
+                 if (CraftEventFactory.callItemDespawnEvent(this).isCancelled()) {
                      this.age = 0;
 @@ -0,0 +0,0 @@ public class ItemEntity extends Entity implements TraceableEntity {
          this.lastTick = MinecraftServer.currentTick;
@@ -45,9 +45,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
      private void tryToMerge(ItemEntity other) {
 @@ -0,0 +0,0 @@ public class ItemEntity extends Entity implements TraceableEntity {
+     public void setItem(ItemStack stack) {
          com.google.common.base.Preconditions.checkArgument(!stack.isEmpty(), "Cannot drop air"); // CraftBukkit
          this.getEntityData().set(ItemEntity.DATA_ITEM, stack);
-         this.getEntityData().markDirty(ItemEntity.DATA_ITEM); // CraftBukkit - SPIGOT-4591, must mark dirty
 +        this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper
      }
  
diff --git a/patches/server/Implemented-BlockFailedDispenseEvent.patch b/patches/server/Implemented-BlockFailedDispenseEvent.patch
index 017e82a105..ac9062f8c0 100644
--- a/patches/server/Implemented-BlockFailedDispenseEvent.patch
+++ b/patches/server/Implemented-BlockFailedDispenseEvent.patch
@@ -36,8 +36,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
 +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
 @@ -0,0 +0,0 @@ public class CraftEventFactory {
- 
-         return !event.isCancelled();
+         Bukkit.getPluginManager().callEvent(event);
+         return event;
      }
 +
 +    // Paper start
diff --git a/patches/server/Improve-death-events.patch b/patches/server/Improve-death-events.patch
index 7c6f119de4..e49ce48143 100644
--- a/patches/server/Improve-death-events.patch
+++ b/patches/server/Improve-death-events.patch
@@ -396,12 +396,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
 +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
 @@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
-     }
- 
+     @Override
      public void sendHealthUpdate() {
--        this.getHandle().connection.send(new ClientboundSetHealthPacket(this.getScaledHealth(), this.getHandle().getFoodData().getFoodLevel(), this.getHandle().getFoodData().getSaturationLevel()));
+         FoodData foodData = this.getHandle().getFoodData();
+-        this.sendHealthUpdate(this.getScaledHealth(), foodData.getFoodLevel(), foodData.getSaturationLevel());
 +        // Paper start - cancellable death event
-+        ClientboundSetHealthPacket packet = new ClientboundSetHealthPacket(this.getScaledHealth(), this.getHandle().getFoodData().getFoodLevel(), this.getHandle().getFoodData().getSaturationLevel());
++        ClientboundSetHealthPacket packet = new ClientboundSetHealthPacket(this.getScaledHealth(), foodData.getFoodLevel(), foodData.getSaturationLevel());
 +        if (this.getHandle().queueHealthUpdatePacket) {
 +            this.getHandle().queuedHealthUpdatePacket = packet;
 +        } else {
diff --git a/patches/server/Missing-Entity-Behavior-API.patch b/patches/server/Missing-Entity-Behavior-API.patch
index 22a324a679..f551d3d65f 100644
--- a/patches/server/Missing-Entity-Behavior-API.patch
+++ b/patches/server/Missing-Entity-Behavior-API.patch
@@ -945,8 +945,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java
 +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java
 @@ -0,0 +0,0 @@ public class CraftRabbit extends CraftAnimals implements Rabbit {
- 
-         entity.setVariant(net.minecraft.world.entity.animal.Rabbit.Variant.values()[type.ordinal()]);
+     public void setRabbitType(Type type) {
+         this.getHandle().setVariant(net.minecraft.world.entity.animal.Rabbit.Variant.values()[type.ordinal()]);
      }
 +    // Paper start
 +    @Override
@@ -958,27 +958,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    public int getMoreCarrotTicks() {
 +        return this.getHandle().moreCarrotTicks;
 +    }
-+    // Paper end
- }
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java
-@@ -0,0 +0,0 @@ public abstract class CraftRaider extends CraftMonster implements Raider {
-     public Sound getCelebrationSound() {
-         return CraftSound.getBukkit(this.getHandle().getCelebrateSound());
-     }
-+
-+    // Paper start
-+    @Override
-+    public boolean isCelebrating() {
-+        return this.getHandle().isCelebrating();
-+    }
-+
-+    @Override
-+    public void setCelebrating(boolean celebrating) {
-+        this.getHandle().setCelebrating(celebrating);
-+    }
 +    // Paper end
  }
 diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftRavager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftRavager.java
diff --git a/patches/server/Player.setPlayerProfile-API.patch b/patches/server/Player.setPlayerProfile-API.patch
index e50879ed81..e02b05e242 100644
--- a/patches/server/Player.setPlayerProfile-API.patch
+++ b/patches/server/Player.setPlayerProfile-API.patch
@@ -58,7 +58,7 @@ diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
 +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -0,0 +0,0 @@ import net.minecraft.world.entity.ai.attributes.Attributes;
+@@ -0,0 +0,0 @@ import net.minecraft.world.food.FoodData;
  import net.minecraft.world.inventory.AbstractContainerMenu;
  import net.minecraft.world.level.GameType;
  import net.minecraft.world.level.block.Blocks;
diff --git a/patches/server/PlayerAttemptPickupItemEvent.patch b/patches/server/PlayerAttemptPickupItemEvent.patch
index ffe242d238..bf3e7fc61a 100644
--- a/patches/server/PlayerAttemptPickupItemEvent.patch
+++ b/patches/server/PlayerAttemptPickupItemEvent.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
 +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
-@@ -0,0 +0,0 @@ import net.minecraft.stats.Stats;
+@@ -0,0 +0,0 @@ import org.bukkit.entity.Player;
  import org.bukkit.event.entity.EntityPickupItemEvent;
  import org.bukkit.event.player.PlayerPickupItemEvent;
  // CraftBukkit end
diff --git a/patches/server/PlayerPickupItemEvent-setFlyAtPlayer.patch b/patches/server/PlayerPickupItemEvent-setFlyAtPlayer.patch
index 046fb6bae4..92a2b65edc 100644
--- a/patches/server/PlayerPickupItemEvent-setFlyAtPlayer.patch
+++ b/patches/server/PlayerPickupItemEvent-setFlyAtPlayer.patch
@@ -17,7 +17,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              if (this.pickupDelay <= 0 && canHold > 0) {
                  itemstack.setCount(canHold);
 @@ -0,0 +0,0 @@ public class ItemEntity extends Entity implements TraceableEntity {
-                 PlayerPickupItemEvent playerEvent = new PlayerPickupItemEvent((org.bukkit.entity.Player) player.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining);
+                 PlayerPickupItemEvent playerEvent = new PlayerPickupItemEvent((Player) player.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining);
                  playerEvent.setCancelled(!playerEvent.getPlayer().getCanPickupItems());
                  this.level().getCraftServer().getPluginManager().callEvent(playerEvent);
 +                flyAtPlayer = playerEvent.getFlyAtPlayer(); // Paper
diff --git a/patches/server/PortalCreateEvent-needs-to-know-its-entity.patch b/patches/server/PortalCreateEvent-needs-to-know-its-entity.patch
index 81ddf2e569..8f78da15e1 100644
--- a/patches/server/PortalCreateEvent-needs-to-know-its-entity.patch
+++ b/patches/server/PortalCreateEvent-needs-to-know-its-entity.patch
@@ -13,7 +13,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
                          if (!(block.getBlock() instanceof BaseEntityBlock)) { // Containers get placed automatically
 -                            block.getBlock().onPlace(block, world, newblockposition, oldBlock, true);
-+                            block.getBlock().onPlace(block, world, newblockposition, oldBlock, true, itemactioncontext); // Paper - pass itemactioncontext
++                            block.getBlock().onPlace(block, world, newblockposition, oldBlock, true, context); // Paper - pass context
                          }
  
                          world.notifyAndUpdatePhysics(newblockposition, null, oldBlock, block, world.getBlockState(newblockposition), updateFlag, 512); // send null chunk as chunk.k() returns false by this point
diff --git a/patches/server/Prevent-empty-items-from-being-added-to-world.patch b/patches/server/Prevent-empty-items-from-being-added-to-world.patch
index 3c8f5b5d86..3d02bf1370 100644
--- a/patches/server/Prevent-empty-items-from-being-added-to-world.patch
+++ b/patches/server/Prevent-empty-items-from-being-added-to-world.patch
@@ -29,5 +29,5 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -        com.google.common.base.Preconditions.checkArgument(!stack.isEmpty(), "Cannot drop air"); // CraftBukkit
 +        // com.google.common.base.Preconditions.checkArgument(!stack.isEmpty(), "Cannot drop air"); // CraftBukkit // Paper - Remove check
          this.getEntityData().set(ItemEntity.DATA_ITEM, stack);
-         this.getEntityData().markDirty(ItemEntity.DATA_ITEM); // CraftBukkit - SPIGOT-4591, must mark dirty
          this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper
+     }
diff --git a/patches/server/Properly-remove-the-experimental-smithing-inventory-.patch b/patches/server/Properly-remove-the-experimental-smithing-inventory-.patch
deleted file mode 100644
index 8945e36c52..0000000000
--- a/patches/server/Properly-remove-the-experimental-smithing-inventory-.patch
+++ /dev/null
@@ -1,130 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic <jake.m.potrebic@gmail.com>
-Date: Thu, 8 Jun 2023 14:45:18 -0700
-Subject: [PATCH] Properly remove the experimental smithing inventory type
-
-
-diff --git a/src/main/java/net/minecraft/world/inventory/SmithingMenu.java b/src/main/java/net/minecraft/world/inventory/SmithingMenu.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/inventory/SmithingMenu.java
-+++ b/src/main/java/net/minecraft/world/inventory/SmithingMenu.java
-@@ -0,0 +0,0 @@ public class SmithingMenu extends ItemCombinerMenu {
-             return this.bukkitEntity;
-         }
- 
--        org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventorySmithingNew(
-+        org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventorySmithing( // Paper
-                 access.getLocation(), this.inputSlots, this.resultSlots);
-         this.bukkitEntity = new CraftInventoryView(this.player.getBukkitEntity(), inventory, this);
-         return this.bukkitEntity;
-diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java
-+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java
-@@ -0,0 +0,0 @@ public class CraftContainer extends AbstractContainerMenu {
-             case STONECUTTER:
-                 return MenuType.STONECUTTER;
-             case SMITHING_NEW:
-+            case SMITHING:
-                 return MenuType.SMITHING;
-             case CREATIVE:
-             case CRAFTING:
-@@ -0,0 +0,0 @@ public class CraftContainer extends AbstractContainerMenu {
-                 this.delegate = new HopperMenu(windowId, bottom, top);
-                 break;
-             case ANVIL:
--            case SMITHING:
-                 this.setupAnvil(top, bottom); // SPIGOT-6783 - manually set up slots so we can use the delegated inventory and not the automatically created one
-                 break;
-             case BEACON:
-@@ -0,0 +0,0 @@ public class CraftContainer extends AbstractContainerMenu {
-             case MERCHANT:
-                 this.delegate = new MerchantMenu(windowId, bottom);
-                 break;
-+            case SMITHING: // Paper
-             case SMITHING_NEW:
-                 this.setupSmithing(top, bottom); // SPIGOT-6783 - manually set up slots so we can use the delegated inventory and not the automatically created one
-                 break;
-diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
-+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
-@@ -0,0 +0,0 @@ public class CraftInventory implements Inventory {
-             return InventoryType.COMPOSTER;
-         } else if (this.inventory instanceof JukeboxBlockEntity) {
-             return InventoryType.JUKEBOX;
--        } else if (this instanceof CraftInventorySmithingNew) {
--            return InventoryType.SMITHING_NEW;
-+            // Paper - remove
-         } else {
-             return InventoryType.CHEST;
-         }
-diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventorySmithing.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventorySmithing.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventorySmithing.java
-+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventorySmithing.java
-@@ -0,0 +0,0 @@ public class CraftInventorySmithing extends CraftResultInventory implements Smit
- 
-     @Override
-     public ItemStack getResult() {
--        return getItem(2);
-+        return getItem(net.minecraft.world.inventory.SmithingMenu.RESULT_SLOT); // Paper
-     }
- 
-     @Override
-     public void setResult(ItemStack item) {
--        setItem(2, item);
-+        setItem(net.minecraft.world.inventory.SmithingMenu.RESULT_SLOT, item); // Paper
-     }
- 
-     @Override
-diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventorySmithingNew.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventorySmithingNew.java
-deleted file mode 100644
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventorySmithingNew.java
-+++ /dev/null
-@@ -0,0 +0,0 @@
--package org.bukkit.craftbukkit.inventory;
--
--import net.minecraft.world.Container;
--import net.minecraft.world.inventory.ResultContainer;
--import org.bukkit.Location;
--import org.bukkit.inventory.ItemStack;
--import org.bukkit.inventory.Recipe;
--import org.bukkit.inventory.SmithingInventory;
--
--public class CraftInventorySmithingNew extends CraftResultInventory implements SmithingInventory {
--
--    private final Location location;
--
--    public CraftInventorySmithingNew(Location location, Container inventory, ResultContainer resultInventory) {
--        super(inventory, resultInventory);
--        this.location = location;
--    }
--
--    @Override
--    public ResultContainer getResultInventory() {
--        return (ResultContainer) super.getResultInventory();
--    }
--
--    @Override
--    public Location getLocation() {
--        return this.location;
--    }
--
--    @Override
--    public ItemStack getResult() {
--        return getItem(3);
--    }
--
--    @Override
--    public void setResult(ItemStack item) {
--        setItem(3, item);
--    }
--
--    @Override
--    public Recipe getRecipe() {
--        net.minecraft.world.item.crafting.Recipe recipe = this.getResultInventory().getRecipeUsed();
--        return (recipe == null) ? null : recipe.toBukkitRecipe();
--    }
--}
diff --git a/patches/server/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch b/patches/server/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch
index c1093120a8..a46534b52e 100644
--- a/patches/server/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch
+++ b/patches/server/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch
@@ -36,7 +36,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/org/bukkit/craftbukkit/Main.java
 +++ b/src/main/java/org/bukkit/craftbukkit/Main.java
 @@ -0,0 +0,0 @@ public class Main {
-                     deadline.add(Calendar.DAY_OF_YEAR, -3);
+                     deadline.add(Calendar.DAY_OF_YEAR, -7);
                      if (buildDate.before(deadline.getTime())) {
                          System.err.println("*** Error, this build is outdated ***");
 -                        System.err.println("*** Please download a new build as per instructions from https://www.spigotmc.org/go/outdated-spigot ***");
diff --git a/patches/server/Turtle-API.patch b/patches/server/Turtle-API.patch
index 8ccba0b1c7..6ec0a52216 100644
--- a/patches/server/Turtle-API.patch
+++ b/patches/server/Turtle-API.patch
@@ -37,12 +37,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
                  } else if (this.turtle.layEggCounter > this.adjustedTickDelay(200)) {
                      Level world = this.turtle.level();
  
-                     // CraftBukkit start
--                    if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.turtle, this.blockPos.above(), (BlockState) Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, this.turtle.random.nextInt(4) + 1)).isCancelled()) {
+-                    if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.turtle, this.blockPos.above(), (BlockState) Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, this.turtle.random.nextInt(4) + 1))) { // CraftBukkit
++                    // CraftBukkit start
 +                    // Paper start
 +                    int eggCount = this.turtle.random.nextInt(4) + 1;
 +                    com.destroystokyo.paper.event.entity.TurtleLayEggEvent layEggEvent = new com.destroystokyo.paper.event.entity.TurtleLayEggEvent((org.bukkit.entity.Turtle) this.turtle.getBukkitEntity(), io.papermc.paper.util.MCUtil.toLocation(this.turtle.level(), this.blockPos.above()), eggCount);
-+                    if (layEggEvent.callEvent() && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.turtle, this.blockPos.above(), Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, layEggEvent.getEggCount())).isCancelled()) {
++                    if (layEggEvent.callEvent() && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.turtle, this.blockPos.above(), Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, layEggEvent.getEggCount()))) {
                      world.playSound((Player) null, blockposition, SoundEvents.TURTLE_LAY_EGG, SoundSource.BLOCKS, 0.3F, 0.9F + world.random.nextFloat() * 0.2F);
                      BlockPos blockposition1 = this.blockPos.above();
 -                    BlockState iblockdata = (BlockState) Blocks.TURTLE_EGG.defaultBlockState().setValue(TurtleEggBlock.EGGS, this.turtle.random.nextInt(4) + 1);
diff --git a/patches/server/Unset-Ignited-flag-on-cancel-of-Explosion-Event.patch b/patches/server/Unset-Ignited-flag-on-cancel-of-Explosion-Event.patch
index 9e2b2334bd..dd01def422 100644
--- a/patches/server/Unset-Ignited-flag-on-cancel-of-Explosion-Event.patch
+++ b/patches/server/Unset-Ignited-flag-on-cancel-of-Explosion-Event.patch
@@ -10,7 +10,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java
 +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java
 @@ -0,0 +0,0 @@ public class Creeper extends Monster implements PowerableMob {
-                 this.spawnLingeringCloud();
+             // CraftBukkit start
              } else {
                  this.swell = 0;
 +                this.entityData.set(DATA_IS_IGNITED, Boolean.valueOf(false)); // Paper
diff --git a/patches/server/Use-ConcurrentHashMap-in-JsonList.patch b/patches/server/Use-ConcurrentHashMap-in-JsonList.patch
index b47711e018..1ee09412f2 100644
--- a/patches/server/Use-ConcurrentHashMap-in-JsonList.patch
+++ b/patches/server/Use-ConcurrentHashMap-in-JsonList.patch
@@ -89,7 +89,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
      public void remove(K key) {
 @@ -0,0 +0,0 @@ public abstract class StoredUserList<K, V extends StoredUserEntry<K>> {
-     // CraftBukkit end
+     }
  
      public boolean isEmpty() {
 -        return this.map.size() < 1;
diff --git a/patches/server/Use-a-Shared-Random-for-Entities.patch b/patches/server/Use-a-Shared-Random-for-Entities.patch
index 67e9f60cf4..f2f74ba205 100644
--- a/patches/server/Use-a-Shared-Random-for-Entities.patch
+++ b/patches/server/Use-a-Shared-Random-for-Entities.patch
@@ -106,8 +106,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
      public Squid(EntityType<? extends Squid> type, Level world) {
          super(type, world);
--        this.random.setSeed((long) this.getId());
-+        //this.random.setSeed((long) this.getId()); // Paper - we set the random to shared, do not clobber the seed
+-        this.random.setSeed((long)this.getId());
++        //this.random.setSeed((long)this.getId()); // Paper - we set the random to shared, do not clobber the seed
          this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F;
      }
  
diff --git a/patches/server/force-entity-dismount-during-teleportation.patch b/patches/server/force-entity-dismount-during-teleportation.patch
index 7ae95425a8..1b88b43446 100644
--- a/patches/server/force-entity-dismount-during-teleportation.patch
+++ b/patches/server/force-entity-dismount-during-teleportation.patch
@@ -42,7 +42,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
      }
 @@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
-         return true; // CraftBukkit
+         }
      }
  
 -    protected boolean removePassenger(Entity entity) { // CraftBukkit
diff --git a/work/Bukkit b/work/Bukkit
index 0c5d870919..01aa02eb53 160000
--- a/work/Bukkit
+++ b/work/Bukkit
@@ -1 +1 @@
-Subproject commit 0c5d870919854258f5f51530a66d839fba20e288
+Subproject commit 01aa02eb531ba554701b02986193c874ccb7635d
diff --git a/work/CraftBukkit b/work/CraftBukkit
index b6b514b7ec..b60a95c8cf 160000
--- a/work/CraftBukkit
+++ b/work/CraftBukkit
@@ -1 +1 @@
-Subproject commit b6b514b7ec49531dc334c4e7bfee2569cfe33398
+Subproject commit b60a95c8cf3ca3a6353be1ecf2a6baa6f9072c57
diff --git a/work/Spigot b/work/Spigot
index c62f4bd99c..9ebce8afbf 160000
--- a/work/Spigot
+++ b/work/Spigot
@@ -1 +1 @@
-Subproject commit c62f4bd99c6f565026bdba8eabb941b0c58a19d8
+Subproject commit 9ebce8afbf14ba4b857ce5befe716fecbd6d8879