diff --git a/patches/api/Add-API-to-get-the-collision-shape-of-a-block-before.patch b/patches/api/Add-API-to-get-the-collision-shape-of-a-block-before.patch
index a6ea0ac298..6e321886fa 100644
--- a/patches/api/Add-API-to-get-the-collision-shape-of-a-block-before.patch
+++ b/patches/api/Add-API-to-get-the-collision-shape-of-a-block-before.patch
@@ -27,5 +27,5 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    // Paper end
 +
      /**
-      * Gets the material that a player would use to place this block.
-      * <p>
+      * Gets the color this block should appear as when rendered on a map.
+      *
diff --git a/patches/api/Add-FastUtil-to-Bukkit.patch b/patches/api/Add-FastUtil-to-Bukkit.patch
index 58114b0f3c..2f6d14cfee 100644
--- a/patches/api/Add-FastUtil-to-Bukkit.patch
+++ b/patches/api/Add-FastUtil-to-Bukkit.patch
@@ -16,4 +16,4 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    api("it.unimi.dsi:fastutil:8.5.6")
      // Paper end
  
-     compileOnly("org.apache.maven:maven-resolver-provider:3.8.5")
+     compileOnly("org.apache.maven:maven-resolver-provider:3.9.6")
diff --git a/patches/api/Adventure.patch b/patches/api/Adventure.patch
index 4d9c04b117..acb17cdd86 100644
--- a/patches/api/Adventure.patch
+++ b/patches/api/Adventure.patch
@@ -53,7 +53,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    apiAndDocs("net.kyori:adventure-text-logger-slf4j")
      // Paper end
  
-     compileOnly("org.apache.maven:maven-resolver-provider:3.8.5")
+     compileOnly("org.apache.maven:maven-resolver-provider:3.9.6")
 @@ -0,0 +0,0 @@ tasks.withType<Javadoc> {
          "https://guava.dev/releases/32.1.2-jre/api/docs/",
          "https://javadoc.io/doc/org.yaml/snakeyaml/2.2/",
@@ -2681,8 +2681,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    // Paper end
 +
      /**
-      * Gets the Scoreboard displayed to this player
-      *
+      * Request that the player's client remove a resource pack sent by the
+      * server.
 @@ -0,0 +0,0 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
       *
       * @param title Title text
diff --git a/patches/api/Build-system-changes.patch b/patches/api/Build-system-changes.patch
index 6211257dcc..a3eddbaa24 100644
--- a/patches/api/Build-system-changes.patch
+++ b/patches/api/Build-system-changes.patch
@@ -18,9 +18,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
 +    // Paper end
  
-     compileOnly("org.apache.maven:maven-resolver-provider:3.8.5")
-     compileOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3")
-     compileOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.3")
+     compileOnly("org.apache.maven:maven-resolver-provider:3.9.6")
+     compileOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18")
+     compileOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.18")
  
 -    val annotations = "org.jetbrains:annotations-java5:$annotationsVersion"
 +    val annotations = "org.jetbrains:annotations:$annotationsVersion" // Paper - we don't want Java 5 annotations...
diff --git a/patches/api/Complete-resource-pack-API.patch b/patches/api/Complete-resource-pack-API.patch
index e90fd0bcf7..a9c5b4a6de 100644
--- a/patches/api/Complete-resource-pack-API.patch
+++ b/patches/api/Complete-resource-pack-API.patch
@@ -182,8 +182,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    // Paper end - more resource pack API
 +
      /**
-      * Gets the Scoreboard displayed to this player
-      *
+      * Request that the player's client remove a resource pack sent by the
+      * server.
 diff --git a/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java b/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/event/player/PlayerResourcePackStatusEvent.java
diff --git a/patches/api/Convert-project-to-Gradle.patch b/patches/api/Convert-project-to-Gradle.patch
index e4881c2ef2..c0c02107ea 100644
--- a/patches/api/Convert-project-to-Gradle.patch
+++ b/patches/api/Convert-project-to-Gradle.patch
@@ -52,9 +52,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    api("org.yaml:snakeyaml:2.2")
 +    api("org.joml:joml:1.10.5")
 +
-+    compileOnly("org.apache.maven:maven-resolver-provider:3.8.5")
-+    compileOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3")
-+    compileOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.3")
++    compileOnly("org.apache.maven:maven-resolver-provider:3.9.6")
++    compileOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18")
++    compileOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.18")
 +
 +    val annotations = "org.jetbrains:annotations-java5:$annotationsVersion"
 +    compileOnly(annotations)
@@ -199,19 +199,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -        <dependency>
 -            <groupId>org.apache.maven</groupId>
 -            <artifactId>maven-resolver-provider</artifactId>
--            <version>3.8.5</version>
+-            <version>3.9.6</version>
 -            <scope>provided</scope>
 -        </dependency>
 -        <dependency>
 -            <groupId>org.apache.maven.resolver</groupId>
 -            <artifactId>maven-resolver-connector-basic</artifactId>
--            <version>1.7.3</version>
+-            <version>1.9.18</version>
 -            <scope>provided</scope>
 -        </dependency>
 -        <dependency>
 -            <groupId>org.apache.maven.resolver</groupId>
 -            <artifactId>maven-resolver-transport-http</artifactId>
--            <version>1.7.3</version>
+-            <version>1.9.18</version>
 -            <scope>provided</scope>
 -        </dependency>
 -        <!-- annotations -->
@@ -370,7 +370,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -                        </executions>
 -                        <configuration>
 -                            <configLocation>checkstyle.xml</configLocation>
--                            <suppressionsLocation>checkstyle-suppressions.xml</suppressionsLocation>
 -                            <includeTestSourceDirectory>true</includeTestSourceDirectory>
 -                        </configuration>
 -                        <dependencies>
diff --git a/patches/api/Fix-upstream-javadocs.patch b/patches/api/Fix-upstream-javadocs.patch
index 409ad7ff86..94eb0fb6d4 100644
--- a/patches/api/Fix-upstream-javadocs.patch
+++ b/patches/api/Fix-upstream-javadocs.patch
@@ -471,46 +471,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
       *     the player loaded the pack!
 -     * <li>There is no concept of resetting resource packs back to default
 -     *     within Minecraft, so players will have to relog to do so or you
--     *     have to send an empty pack.
-      * <li>The request is sent with empty string as the hash when the hash is
-      *     not provided. This might result in newer versions not loading the
-      *     pack correctly.
-@@ -0,0 +0,0 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
-      *     case this method will have no affect on them. Use the
-      *     {@link PlayerResourcePackStatusEvent} to figure out whether or not
-      *     the player loaded the pack!
--     * <li>There is no concept of resetting resource packs back to default
--     *     within Minecraft, so players will have to relog to do so or you
--     *     have to send an empty pack.
-      * <li>The request is sent with empty string as the hash when the hash is
-      *     not provided. This might result in newer versions not loading the
-      *     pack correctly.
-@@ -0,0 +0,0 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
-      *     case this method will have no affect on them. Use the
-      *     {@link PlayerResourcePackStatusEvent} to figure out whether or not
-      *     the player loaded the pack!
--     * <li>There is no concept of resetting resource packs back to default
--     *     within Minecraft, so players will have to relog to do so or you
--     *     have to send an empty pack.
-      * <li>The request is sent with empty string as the hash when the hash is
-      *     not provided. This might result in newer versions not loading the
-      *     pack correctly.
-@@ -0,0 +0,0 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
-      *     case this method will have no affect on them. Use the
-      *     {@link PlayerResourcePackStatusEvent} to figure out whether or not
-      *     the player loaded the pack!
--     * <li>There is no concept of resetting resource packs back to default
--     *     within Minecraft, so players will have to relog to do so or you
--     *     have to send an empty pack.
-      * <li>The request is sent with empty string as the hash when the hash is
-      *     not provided. This might result in newer versions not loading the
-      *     pack correctly.
-@@ -0,0 +0,0 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
-      *     case this method will have no affect on them. Use the
-      *     {@link PlayerResourcePackStatusEvent} to figure out whether or not
-      *     the player loaded the pack!
--     * <li>There is no concept of resetting resource packs back to default
--     *     within Minecraft, so players will have to relog to do so or you
 -     *     have to send an empty pack.
       * <li>The request is sent with empty string as the hash when the hash is
       *     not provided. This might result in newer versions not loading the
diff --git a/patches/api/Paper-Plugins.patch b/patches/api/Paper-Plugins.patch
index b73a55beaf..8b515ddce1 100644
--- a/patches/api/Paper-Plugins.patch
+++ b/patches/api/Paper-Plugins.patch
@@ -12,10 +12,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      implementation("org.ow2.asm:asm-commons:9.5")
      // Paper end
  
--    compileOnly("org.apache.maven:maven-resolver-provider:3.8.5")
-+    api("org.apache.maven:maven-resolver-provider:3.8.5")
-     compileOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3")
-     compileOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.3")
+-    compileOnly("org.apache.maven:maven-resolver-provider:3.9.6")
++    api("org.apache.maven:maven-resolver-provider:3.9.6") // Paper - make API dependency for Paper Plugins
+     compileOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18")
+     compileOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.18")
  
 @@ -0,0 +0,0 @@ tasks.withType<Javadoc> {
          "https://jd.advntr.dev/text-serializer-plain/$adventureVersion/",
diff --git a/patches/api/Use-ASM-for-event-executors.patch b/patches/api/Use-ASM-for-event-executors.patch
index f38294dbf4..9e03995c7a 100644
--- a/patches/api/Use-ASM-for-event-executors.patch
+++ b/patches/api/Use-ASM-for-event-executors.patch
@@ -18,7 +18,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    implementation("org.ow2.asm:asm-commons:9.5")
      // Paper end
  
-     compileOnly("org.apache.maven:maven-resolver-provider:3.8.5")
+     compileOnly("org.apache.maven:maven-resolver-provider:3.9.6")
 diff --git a/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java b/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java
 new file mode 100644
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
diff --git a/patches/server/Add-API-to-get-the-collision-shape-of-a-block-before.patch b/patches/server/Add-API-to-get-the-collision-shape-of-a-block-before.patch
index 99c377b01c..415c0af28d 100644
--- a/patches/server/Add-API-to-get-the-collision-shape-of-a-block-before.patch
+++ b/patches/server/Add-API-to-get-the-collision-shape-of-a-block-before.patch
@@ -28,5 +28,5 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    // Paper end
 +
      @Override
-     public Material getPlacementMaterial() {
-         return CraftMagicNumbers.getMaterial(this.state.getBlock().asItem());
+     public Color getMapColor() {
+         return Color.fromRGB(this.state.getMapColor(null, null).col);
diff --git a/patches/server/Adventure.patch b/patches/server/Adventure.patch
index 9f4a275c18..678fca5d54 100644
--- a/patches/server/Adventure.patch
+++ b/patches/server/Adventure.patch
@@ -4227,14 +4227,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        } else {
 +            hash = "";
 +        }
-+        this.getHandle().connection.send(new net.minecraft.network.protocol.common.ClientboundResourcePackPopPacket(Optional.empty()));
++        this.getHandle().connection.send(new ClientboundResourcePackPopPacket(Optional.empty()));
 +        this.getHandle().connection.send(new ClientboundResourcePackPushPacket(uuid, url, hash, force, io.papermc.paper.adventure.PaperAdventure.asVanilla(prompt)));
 +    }
 +    // Paper end - adventure
 +
-     public void addChannel(String channel) {
-         Preconditions.checkState(this.channels.size() < 128, "Cannot register channel '%s'. Too many channels registered!", channel);
-         channel = StandardMessenger.validateAndCorrectChannel(channel);
+     @Override
+     public void removeResourcePack(UUID id) {
+         Preconditions.checkArgument(id != null, "Resource pack id cannot be null");
 @@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
          return (this.getHandle().requestedViewDistance() == 0) ? Bukkit.getViewDistance() : this.getHandle().requestedViewDistance();
      }
diff --git a/patches/server/Allow-spawning-Item-entities-with-World.spawnEntity.patch b/patches/server/Allow-spawning-Item-entities-with-World.spawnEntity.patch
deleted file mode 100644
index 2cbc6f8e47..0000000000
--- a/patches/server/Allow-spawning-Item-entities-with-World.spawnEntity.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar <aikar@aikar.co>
-Date: Mon, 4 Jun 2018 20:39:20 -0400
-Subject: [PATCH] Allow spawning Item entities with World.spawnEntity
-
-This API has more capabilities than .dropItem with the Consumer function
-
-Item can be set inside of the Consumer pre spawn function.
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-@@ -0,0 +0,0 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
-                 entity = net.minecraft.world.entity.EntityType.BOAT.create(world);
-             }
-             entity.moveTo(x, y, z, yaw, pitch);
-+            // Paper start
-+        } else if (org.bukkit.entity.Item.class.isAssignableFrom(clazz)) {
-+            entity = new net.minecraft.world.entity.item.ItemEntity(world, x, y, z, new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.DIRT));
-+            // Paper end
-         } else if (FallingBlock.class.isAssignableFrom(clazz)) {
-             BlockPos pos = BlockPos.containing(x, y, z);
-             entity = FallingBlockEntity.fall(world, pos, this.getHandle().getBlockState(pos));
diff --git a/patches/server/Anti-Xray.patch b/patches/server/Anti-Xray.patch
index e690b0409f..430177f29d 100644
--- a/patches/server/Anti-Xray.patch
+++ b/patches/server/Anti-Xray.patch
@@ -1602,11 +1602,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      private Set<BlockPos> tiles;
      private final Set<BlockPos> lights = new HashSet<>();
 +    // Paper start - Anti-Xray - Add parameters
-+    private final World world;
++    private final org.bukkit.World world;
  
 -    public OldCraftChunkData(int minHeight, int maxHeight, Registry<net.minecraft.world.level.biome.Biome> biomes) {
 +    @Deprecated @io.papermc.paper.annotation.DoNotUse public OldCraftChunkData(int minHeight, int maxHeight, Registry<net.minecraft.world.level.biome.Biome> biomes) { this(minHeight, maxHeight, biomes, null); }
-+    public OldCraftChunkData(int minHeight, int maxHeight, Registry<net.minecraft.world.level.biome.Biome> biomes, World world) {
++    public OldCraftChunkData(int minHeight, int maxHeight, Registry<net.minecraft.world.level.biome.Biome> biomes, org.bukkit.World world) {
 +        this.world = world;
 +        // Paper end
          this.minHeight = minHeight;
diff --git a/patches/server/Build-system-changes.patch b/patches/server/Build-system-changes.patch
index 83651e373b..d72905ce9f 100644
--- a/patches/server/Build-system-changes.patch
+++ b/patches/server/Build-system-changes.patch
@@ -24,7 +24,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    implementation("org.ow2.asm:asm-commons:9.5") // Paper - ASM event executor generation
      implementation("commons-lang:commons-lang:2.6")
      runtimeOnly("org.xerial:sqlite-jdbc:3.42.0.1")
-     runtimeOnly("com.mysql:mysql-connector-j:8.1.0")
+     runtimeOnly("com.mysql:mysql-connector-j:8.2.0")
 @@ -0,0 +0,0 @@ tasks.jar {
          val gitHash = git("rev-parse", "--short=7", "HEAD").getText().trim()
          val implementationVersion = System.getenv("BUILD_NUMBER") ?: "\"$gitHash\""
@@ -148,7 +148,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/Collision-API.patch b/patches/server/Collision-API.patch
index 7a2da86c36..cb43d44d52 100644
--- a/patches/server/Collision-API.patch
+++ b/patches/server/Collision-API.patch
@@ -15,7 +15,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +
 +    @Override
 +    public boolean hasCollisionsIn(@org.jetbrains.annotations.NotNull org.bukkit.util.BoundingBox boundingBox) {
-+        net.minecraft.world.phys.AABB aabb = new AABB(boundingBox.getMinX(), boundingBox.getMinY(), boundingBox.getMinZ(), boundingBox.getMaxX(), boundingBox.getMaxY(), boundingBox.getMaxZ(), false);
++        net.minecraft.world.phys.AABB aabb = new net.minecraft.world.phys.AABB(boundingBox.getMinX(), boundingBox.getMinY(), boundingBox.getMinZ(), boundingBox.getMaxX(), boundingBox.getMaxY(), boundingBox.getMaxZ(), false);
 +
 +        return !this.getHandle().noCollision(aabb);
 +    }
diff --git a/patches/server/Complete-resource-pack-API.patch b/patches/server/Complete-resource-pack-API.patch
index af44f8050b..f11a740b52 100644
--- a/patches/server/Complete-resource-pack-API.patch
+++ b/patches/server/Complete-resource-pack-API.patch
@@ -46,7 +46,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        final net.minecraft.network.chat.Component promptComponent = resourcePackPrompt != null ?
 +            io.papermc.paper.adventure.PaperAdventure.asVanilla(resourcePackPrompt) :
 +            null;
-+        this.getHandle().connection.send(new net.minecraft.network.protocol.common.ClientboundResourcePackPopPacket(Optional.empty()));
++        this.getHandle().connection.send(new ClientboundResourcePackPopPacket(Optional.empty()));
 +        this.getHandle().connection.send(new ClientboundResourcePackPushPacket(uuid, url, hash, required, promptComponent));
 +    }
 +
@@ -56,6 +56,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
 +    // Paper end - more resource pack API
 +
-     public void addChannel(String channel) {
-         Preconditions.checkState(this.channels.size() < 128, "Cannot register channel '%s'. Too many channels registered!", channel);
-         channel = StandardMessenger.validateAndCorrectChannel(channel);
+     @Override
+     public void removeResourcePack(UUID id) {
+         Preconditions.checkArgument(id != null, "Resource pack id cannot be null");
diff --git a/patches/server/Convert-legacy-attributes-in-Item-Meta.patch b/patches/server/Convert-legacy-attributes-in-Item-Meta.patch
index 450ae58c26..1d3ee63d40 100644
--- a/patches/server/Convert-legacy-attributes-in-Item-Meta.patch
+++ b/patches/server/Convert-legacy-attributes-in-Item-Meta.patch
@@ -38,7 +38,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              AttributeModifier attribMod = CraftAttributeInstance.convert(nmsModifier);
  
 -            String attributeName = entry.getString(CraftMetaItem.ATTRIBUTES_IDENTIFIER.NBT);
-+            String attributeName = CraftAttributeMap.convertIfNeeded(entry.getString(CraftMetaItem.ATTRIBUTES_IDENTIFIER.NBT)); // Paper
++            String attributeName = org.bukkit.craftbukkit.attribute.CraftAttributeMap.convertIfNeeded(entry.getString(CraftMetaItem.ATTRIBUTES_IDENTIFIER.NBT)); // Paper
              if (attributeName == null || attributeName.isEmpty()) {
                  continue;
              }
diff --git a/patches/server/Deobfuscate-stacktraces-in-log-messages-crash-report.patch b/patches/server/Deobfuscate-stacktraces-in-log-messages-crash-report.patch
index 95fd11f5d4..177051e0d7 100644
--- a/patches/server/Deobfuscate-stacktraces-in-log-messages-crash-report.patch
+++ b/patches/server/Deobfuscate-stacktraces-in-log-messages-crash-report.patch
@@ -15,7 +15,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      implementation("commons-lang:commons-lang:2.6")
 +    implementation("net.fabricmc:mapping-io:0.5.0") // Paper - needed to read mappings for stacktrace deobfuscation
      runtimeOnly("org.xerial:sqlite-jdbc:3.42.0.1")
-     runtimeOnly("com.mysql:mysql-connector-j:8.1.0")
+     runtimeOnly("com.mysql:mysql-connector-j:8.2.0")
      runtimeOnly("com.lmax:disruptor:3.4.4") // Paper
 @@ -0,0 +0,0 @@ tasks.check {
  }
diff --git a/patches/server/Don-t-tick-signs.patch b/patches/server/Don-t-tick-signs.patch
deleted file mode 100644
index 450b2434cd..0000000000
--- a/patches/server/Don-t-tick-signs.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
-Date: Wed, 12 Jul 2023 17:38:26 -0400
-Subject: [PATCH] Don't tick signs
-
-Minecraft now ticks signs in order to validate the playerWhoMayEdit field. This is a horrible idea, as this means that even waxed signs are ticked for essentially no reason. This moves the logic lazily onto the getter.
-
-== AT ==
-private net.minecraft.world.level.block.entity.SignBlockEntity playerWhoMayEdit
-
-diff --git a/src/main/java/net/minecraft/world/level/block/CeilingHangingSignBlock.java b/src/main/java/net/minecraft/world/level/block/CeilingHangingSignBlock.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/level/block/CeilingHangingSignBlock.java
-+++ b/src/main/java/net/minecraft/world/level/block/CeilingHangingSignBlock.java
-@@ -0,0 +0,0 @@ public class CeilingHangingSignBlock extends SignBlock {
-     @Nullable
-     @Override
-     public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level world, BlockState state, BlockEntityType<T> type) {
--        return createTickerHelper(type, BlockEntityType.HANGING_SIGN, SignBlockEntity::tick);
-+        return null; // Paper
-     }
- }
-diff --git a/src/main/java/net/minecraft/world/level/block/SignBlock.java b/src/main/java/net/minecraft/world/level/block/SignBlock.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/level/block/SignBlock.java
-+++ b/src/main/java/net/minecraft/world/level/block/SignBlock.java
-@@ -0,0 +0,0 @@ public abstract class SignBlock extends BaseEntityBlock implements SimpleWaterlo
-     @Nullable
-     @Override
-     public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level world, BlockState state, BlockEntityType<T> type) {
--        return createTickerHelper(type, BlockEntityType.SIGN, SignBlockEntity::tick);
-+        return null; // Paper
-     }
- }
-diff --git a/src/main/java/net/minecraft/world/level/block/WallHangingSignBlock.java b/src/main/java/net/minecraft/world/level/block/WallHangingSignBlock.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/level/block/WallHangingSignBlock.java
-+++ b/src/main/java/net/minecraft/world/level/block/WallHangingSignBlock.java
-@@ -0,0 +0,0 @@ public class WallHangingSignBlock extends SignBlock {
-     @Nullable
-     @Override
-     public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level world, BlockState state, BlockEntityType<T> type) {
--        return createTickerHelper(type, BlockEntityType.HANGING_SIGN, SignBlockEntity::tick);
-+        return null; // Paper
-     }
- }
-diff --git a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java
-+++ b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java
-@@ -0,0 +0,0 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C
- 
-     @Nullable
-     public UUID getPlayerWhoMayEdit() {
-+        // Paper start
-+        if (this.hasLevel() && this.playerWhoMayEdit != null) {
-+            // Manually invalidate the value lazily.
-+            this.clearInvalidPlayerWhoMayEdit(this, this.getLevel(), this.playerWhoMayEdit);
-+        }
-+        // Paper end
-         return this.playerWhoMayEdit;
-     }
- 
diff --git a/patches/server/ExperienceOrbs-API-for-Reason-Source-Triggering-play.patch b/patches/server/ExperienceOrbs-API-for-Reason-Source-Triggering-play.patch
index 82375ed55d..0255ae8227 100644
--- a/patches/server/ExperienceOrbs-API-for-Reason-Source-Triggering-play.patch
+++ b/patches/server/ExperienceOrbs-API-for-Reason-Source-Triggering-play.patch
@@ -323,19 +323,19 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      }
  
      @Override
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-@@ -0,0 +0,0 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
-         } else if (TNTPrimed.class.isAssignableFrom(clazz)) {
-             entity = new PrimedTnt(world, x, y, z, null);
-         } else if (ExperienceOrb.class.isAssignableFrom(clazz)) {
--            entity = new net.minecraft.world.entity.ExperienceOrb(world, x, y, z, 0);
-+            entity = new net.minecraft.world.entity.ExperienceOrb(world, x, y, z, 0, org.bukkit.entity.ExperienceOrb.SpawnReason.CUSTOM, null, null); // Paper
-         } else if (LightningStrike.class.isAssignableFrom(clazz)) {
-             entity = net.minecraft.world.entity.EntityType.LIGHTNING_BOLT.create(world);
-             entity.moveTo(location.getX(), location.getY(), location.getZ());
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
+@@ -0,0 +0,0 @@ public final class CraftEntityTypes {
+             return item;
+         }));
+         register(new EntityTypeData<>(EntityType.EXPERIENCE_ORB, ExperienceOrb.class, CraftExperienceOrb::new,
+-                spawnData -> new net.minecraft.world.entity.ExperienceOrb(spawnData.minecraftWorld(), spawnData.x(), spawnData.z(), spawnData.z(), 0)
++                spawnData -> new net.minecraft.world.entity.ExperienceOrb(spawnData.minecraftWorld(), spawnData.x(), spawnData.z(), spawnData.z(), 0, org.bukkit.entity.ExperienceOrb.SpawnReason.CUSTOM, null, null) // Paper
+         ));
+         register(new EntityTypeData<>(EntityType.AREA_EFFECT_CLOUD, AreaEffectCloud.class, CraftAreaEffectCloud::new, spawnData -> new net.minecraft.world.entity.AreaEffectCloud(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z())));
+         register(new EntityTypeData<>(EntityType.EGG, Egg.class, CraftEgg::new, spawnData -> new ThrownEgg(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z())));
 diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftExperienceOrb.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftExperienceOrb.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftExperienceOrb.java
diff --git a/patches/server/Fix-PotionEffect-ignores-icon-flag.patch b/patches/server/Fix-PotionEffect-ignores-icon-flag.patch
index 5c24236e10..f96d586958 100644
--- a/patches/server/Fix-PotionEffect-ignores-icon-flag.patch
+++ b/patches/server/Fix-PotionEffect-ignores-icon-flag.patch
@@ -14,7 +14,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      @Override
      public boolean addPotionEffect(PotionEffect effect, boolean force) {
 -        this.getHandle().addEffect(new MobEffectInstance(CraftPotionEffectType.bukkitToMinecraft(effect.getType()), effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), effect.hasParticles()), EntityPotionEffectEvent.Cause.PLUGIN);
-+        this.getHandle().addEffect(CraftPotionUtil.fromBukkit(effect), EntityPotionEffectEvent.Cause.PLUGIN); // Paper - Don't ignore icon
++        this.getHandle().addEffect(org.bukkit.craftbukkit.potion.CraftPotionUtil.fromBukkit(effect), EntityPotionEffectEvent.Cause.PLUGIN); // Paper - Don't ignore icon
          return true;
      }
  
@@ -23,7 +23,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public PotionEffect getPotionEffect(PotionEffectType type) {
          MobEffectInstance handle = this.getHandle().getEffect(CraftPotionEffectType.bukkitToMinecraft(type));
 -        return (handle == null) ? null : new PotionEffect(CraftPotionEffectType.minecraftToBukkit(handle.getEffect()), handle.getDuration(), handle.getAmplifier(), handle.isAmbient(), handle.isVisible());
-+        return (handle == null) ? null : CraftPotionUtil.toBukkit(handle); // Paper
++        return (handle == null) ? null : org.bukkit.craftbukkit.potion.CraftPotionUtil.toBukkit(handle); // Paper
      }
  
      @Override
@@ -32,7 +32,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          List<PotionEffect> effects = new ArrayList<PotionEffect>();
          for (MobEffectInstance handle : this.getHandle().activeEffects.values()) {
 -            effects.add(new PotionEffect(CraftPotionEffectType.minecraftToBukkit(handle.getEffect()), handle.getDuration(), handle.getAmplifier(), handle.isAmbient(), handle.isVisible()));
-+            effects.add(CraftPotionUtil.toBukkit(handle)); // Paper
++            effects.add(org.bukkit.craftbukkit.potion.CraftPotionUtil.toBukkit(handle)); // Paper
          }
          return effects;
      }
diff --git a/patches/server/Fix-a-bunch-of-vanilla-bugs.patch b/patches/server/Fix-a-bunch-of-vanilla-bugs.patch
index 2f34244be1..06fa5ca9f9 100644
--- a/patches/server/Fix-a-bunch-of-vanilla-bugs.patch
+++ b/patches/server/Fix-a-bunch-of-vanilla-bugs.patch
@@ -48,9 +48,6 @@ https://bugs.mojang.com/browse/MC-123848
   by: BillyGalbreath <blake.galbreath@gmail.com>
   Fixes item frames dropping items above when pointing down
 
-https://bugs.mojang.com/browse/MC-264285
-  Fix unbreakable flint and steel being consumed when igniting creepers
-
 https://bugs.mojang.com/browse/MC-84789
   Fix wild wolves not considering bones interesting
 
@@ -319,19 +316,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      private void removeFramedMap(ItemStack itemstack) {
          this.getFramedMapId().ifPresent((i) -> {
              MapItemSavedData worldmap = MapItem.getSavedData(i, this.level());
-diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- 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.level().playSound(player, this.getX(), this.getY(), this.getZ(), soundeffect, this.getSoundSource(), 1.0F, this.random.nextFloat() * 0.4F + 0.8F);
-             if (!this.level().isClientSide) {
-                 this.ignite();
--                if (!itemstack.isDamageableItem()) {
-+                if (itemstack.getItem().getMaxDamage() == 0) { // Paper - fix MC-264285, only shrink the stack if the item type actually has no durability
-                     itemstack.shrink(1);
-                 } else {
-                     itemstack.hurtAndBreak(1, player, (entityhuman1) -> {
 diff --git a/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java b/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/entity/npc/CatSpawner.java
diff --git a/patches/server/Fix-falling-block-spawn-methods.patch b/patches/server/Fix-falling-block-spawn-methods.patch
index d4dc8ab609..1f7f96b6c9 100644
--- a/patches/server/Fix-falling-block-spawn-methods.patch
+++ b/patches/server/Fix-falling-block-spawn-methods.patch
@@ -10,19 +10,6 @@ Restores the API behavior from previous versions of the server
 == AT ==
 public net.minecraft.world.entity.item.FallingBlockEntity <init>(Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/level/block/state/BlockState;)V
 
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-@@ -0,0 +0,0 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
-             // Paper end
-         } else if (FallingBlock.class.isAssignableFrom(clazz)) {
-             BlockPos pos = BlockPos.containing(x, y, z);
--            entity = FallingBlockEntity.fall(world, pos, this.getHandle().getBlockState(pos));
-+            entity = new FallingBlockEntity(world, x, y, z, this.getHandle().getBlockState(pos)); // Paper
-         } else if (Projectile.class.isAssignableFrom(clazz)) {
-             if (Snowball.class.isAssignableFrom(clazz)) {
-                 entity = new net.minecraft.world.entity.projectile.Snowball(world, x, y, z);
 diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -55,3 +42,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          return (FallingBlock) entity.getBukkitEntity();
      }
  
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
+@@ -0,0 +0,0 @@ public final class CraftEntityTypes {
+         register(new EntityTypeData<>(EntityType.PRIMED_TNT, TNTPrimed.class, CraftTNTPrimed::new, spawnData -> new PrimedTnt(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), null)));
+         register(new EntityTypeData<>(EntityType.FALLING_BLOCK, FallingBlock.class, CraftFallingBlock::new, spawnData -> {
+             BlockPos pos = BlockPos.containing(spawnData.x(), spawnData.y(), spawnData.z());
+-            return FallingBlockEntity.fall(spawnData.minecraftWorld(), pos, spawnData.world().getBlockState(pos));
++            return new FallingBlockEntity(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), spawnData.world().getBlockState(pos)); // Paper - create falling block entities correctly
+         }));
+         register(new EntityTypeData<>(EntityType.FIREWORK, Firework.class, CraftFirework::new, spawnData -> new FireworkRocketEntity(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), net.minecraft.world.item.ItemStack.EMPTY)));
+         register(new EntityTypeData<>(EntityType.EVOKER_FANGS, EvokerFangs.class, CraftEvokerFangs::new, spawnData -> new net.minecraft.world.entity.projectile.EvokerFangs(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), (float) Math.toRadians(spawnData.yaw()), 0, null)));
diff --git a/patches/server/Fix-possible-NPE-on-painting-creation.patch b/patches/server/Fix-possible-NPE-on-painting-creation.patch
index aed73db03f..d48a987fd2 100644
--- a/patches/server/Fix-possible-NPE-on-painting-creation.patch
+++ b/patches/server/Fix-possible-NPE-on-painting-creation.patch
@@ -4,25 +4,31 @@ Date: Sat, 24 Jun 2023 09:42:53 -0700
 Subject: [PATCH] Fix possible NPE on painting creation
 
 
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-@@ -0,0 +0,0 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
-                         AABB bb = (ItemFrame.class.isAssignableFrom(clazz))
-                                 ? net.minecraft.world.entity.decoration.ItemFrame.calculateBoundingBox(null, pos, CraftBlock.blockFaceToNotch(dir).getOpposite(), width, height)
-                                 : HangingEntity.calculateBoundingBox(null, pos, CraftBlock.blockFaceToNotch(dir).getOpposite(), width, height);
-+                        if (!this.getHandle().noCollision(bb)) continue; // Paper - add collision check
-                         List<net.minecraft.world.entity.Entity> list = (List<net.minecraft.world.entity.Entity>) this.getHandle().getEntities(null, bb);
-                         for (Iterator<net.minecraft.world.entity.Entity> it = list.iterator(); !taken && it.hasNext(); ) {
-                             net.minecraft.world.entity.Entity e = it.next();
-@@ -0,0 +0,0 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
-                 if (Painting.class.isAssignableFrom(clazz)) {
-                     if (this.isNormalWorld() && randomizeData) {
-                         entity = net.minecraft.world.entity.decoration.Painting.create(world, pos, dir).orElse(null);
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
+@@ -0,0 +0,0 @@ public final class CraftEntityTypes {
+         // Hanging
+         register(new EntityTypeData<>(EntityType.PAINTING, Painting.class, CraftPainting::new, createHanging(Painting.class, (spawnData, hangingData) -> {
+                     if (spawnData.normalWorld && hangingData.randomize()) {
+-                        return net.minecraft.world.entity.decoration.Painting.create(spawnData.minecraftWorld(), hangingData.position(), hangingData.direction()).orElse(null);
 -                    } else {
-+                    } // Paper
-+                    if (entity == null) { // Paper - if randomizeData fails, force it
-                         entity = new net.minecraft.world.entity.decoration.Painting(net.minecraft.world.entity.EntityType.PAINTING, this.getHandle().getMinecraftWorld());
-                         entity.absMoveTo(x, y, z, yaw, pitch);
-                         ((net.minecraft.world.entity.decoration.Painting) entity).setDirection(dir);
++                        // Paper start - if randomizeData fails, force it
++                        final net.minecraft.world.entity.decoration.Painting entity = net.minecraft.world.entity.decoration.Painting.create(spawnData.minecraftWorld(), hangingData.position(), hangingData.direction()).orElse(null);
++                        if (entity != null) {
++                            return entity;
++                        }
++                    } /*else*/ {
++                        // Paper end - if randomizeData fails, force it
+                         net.minecraft.world.entity.decoration.Painting entity = new net.minecraft.world.entity.decoration.Painting(net.minecraft.world.entity.EntityType.PAINTING, spawnData.minecraftWorld());
+                         entity.absMoveTo(spawnData.x(), spawnData.y(), spawnData.z(), spawnData.yaw(), spawnData.pitch());
+                         entity.setDirection(hangingData.direction());
+@@ -0,0 +0,0 @@ public final class CraftEntityTypes {
+                     AABB bb = (ItemFrame.class.isAssignableFrom(clazz))
+                             ? net.minecraft.world.entity.decoration.ItemFrame.calculateBoundingBox(null, pos, CraftBlock.blockFaceToNotch(dir).getOpposite(), width, height)
+                             : HangingEntity.calculateBoundingBox(null, pos, CraftBlock.blockFaceToNotch(dir).getOpposite(), width, height);
++                    if (!spawnData.world.noCollision(bb)) continue; // Paper - add collision check
+                     List<net.minecraft.world.entity.Entity> list = spawnData.world().getEntities(null, bb);
+                     for (Iterator<net.minecraft.world.entity.Entity> it = list.iterator(); !taken && it.hasNext(); ) {
+                         net.minecraft.world.entity.Entity e = it.next();
diff --git a/patches/server/Fix-rotation-when-spawning-display-entities.patch b/patches/server/Fix-rotation-when-spawning-display-entities.patch
index 1b7f6daf3c..089eeadd65 100644
--- a/patches/server/Fix-rotation-when-spawning-display-entities.patch
+++ b/patches/server/Fix-rotation-when-spawning-display-entities.patch
@@ -4,15 +4,29 @@ Date: Sun, 30 Jul 2023 13:30:34 +0300
 Subject: [PATCH] Fix rotation when spawning display entities
 
 
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-@@ -0,0 +0,0 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
+@@ -0,0 +0,0 @@ public final class CraftEntityTypes {
+         Vector direction = spawnData.location().getDirection().multiply(10);
+         entity.setDirection(direction.getX(), direction.getY(), direction.getZ());
+     };
++    private static final BiConsumer<SpawnData, net.minecraft.world.entity.Entity> ROT = (spawnData, entity) -> entity.setRot(spawnData.yaw(), spawnData.pitch()); // Paper
+     private static final Map<Class<?>, EntityTypeData<?, ?>> CLASS_TYPE_DATA = new HashMap<>();
+     private static final Map<EntityType, EntityTypeData<?, ?>> ENTITY_TYPE_DATA = new HashMap<>();
  
-             if (entity != null) {
-                 entity.setPos(x, y, z);
-+                entity.setRot(yaw, pitch); // Paper - Set Display Rotation
-             }
-         }
+@@ -0,0 +0,0 @@ public final class CraftEntityTypes {
  
+         // Set pos
+         register(new EntityTypeData<>(EntityType.MARKER, Marker.class, CraftMarker::new, createAndSetPos(net.minecraft.world.entity.EntityType.MARKER)));
+-        register(new EntityTypeData<>(EntityType.BLOCK_DISPLAY, BlockDisplay.class, CraftBlockDisplay::new, createAndSetPos(net.minecraft.world.entity.EntityType.BLOCK_DISPLAY)));
++        register(new EntityTypeData<>(EntityType.BLOCK_DISPLAY, BlockDisplay.class, CraftBlockDisplay::new, combine(createAndSetPos(net.minecraft.world.entity.EntityType.BLOCK_DISPLAY), ROT))); // Paper
+         register(new EntityTypeData<>(EntityType.INTERACTION, Interaction.class, CraftInteraction::new, createAndSetPos(net.minecraft.world.entity.EntityType.INTERACTION)));
+-        register(new EntityTypeData<>(EntityType.ITEM_DISPLAY, ItemDisplay.class, CraftItemDisplay::new, createAndSetPos(net.minecraft.world.entity.EntityType.ITEM_DISPLAY)));
+-        register(new EntityTypeData<>(EntityType.TEXT_DISPLAY, TextDisplay.class, CraftTextDisplay::new, createAndSetPos(net.minecraft.world.entity.EntityType.TEXT_DISPLAY)));
++        register(new EntityTypeData<>(EntityType.ITEM_DISPLAY, ItemDisplay.class, CraftItemDisplay::new, combine(createAndSetPos(net.minecraft.world.entity.EntityType.ITEM_DISPLAY), ROT))); // Paper
++        register(new EntityTypeData<>(EntityType.TEXT_DISPLAY, TextDisplay.class, CraftTextDisplay::new, combine(createAndSetPos(net.minecraft.world.entity.EntityType.TEXT_DISPLAY), ROT))); // Paper
+ 
+         // MISC
+         register(new EntityTypeData<>(EntityType.DROPPED_ITEM, Item.class, CraftItem::new, spawnData -> {
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/Flag-to-disable-the-channel-limit.patch b/patches/server/Flag-to-disable-the-channel-limit.patch
index 09745a21db..fa2f639edc 100644
--- a/patches/server/Flag-to-disable-the-channel-limit.patch
+++ b/patches/server/Flag-to-disable-the-channel-limit.patch
@@ -21,7 +21,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public CraftPlayer(CraftServer server, ServerPlayer entity) {
          super(server, entity);
 @@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
-     // Paper end - more resource pack API
+     }
  
      public void addChannel(String channel) {
 -        Preconditions.checkState(this.channels.size() < 128, "Cannot register channel '%s'. Too many channels registered!", channel);
diff --git a/patches/server/Implement-Mob-Goal-API.patch b/patches/server/Implement-Mob-Goal-API.patch
index 107ad74d77..2c45cf35a0 100644
--- a/patches/server/Implement-Mob-Goal-API.patch
+++ b/patches/server/Implement-Mob-Goal-API.patch
@@ -9,8 +9,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/build.gradle.kts
 +++ b/build.gradle.kts
 @@ -0,0 +0,0 @@ dependencies {
-     runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3")
-     runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.3")
+     runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18")
+     runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.18")
  
 +    testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test
      testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
diff --git a/patches/server/Improve-and-expand-AsyncCatcher.patch b/patches/server/Improve-and-expand-AsyncCatcher.patch
index 9fc8447a29..c3f10784bb 100644
--- a/patches/server/Improve-and-expand-AsyncCatcher.patch
+++ b/patches/server/Improve-and-expand-AsyncCatcher.patch
@@ -174,7 +174,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      @Override
      public boolean addPotionEffect(PotionEffect effect, boolean force) {
 +        org.spigotmc.AsyncCatcher.catchOp("effect add"); // Paper
-         this.getHandle().addEffect(CraftPotionUtil.fromBukkit(effect), EntityPotionEffectEvent.Cause.PLUGIN); // Paper - Don't ignore icon
+         this.getHandle().addEffect(org.bukkit.craftbukkit.potion.CraftPotionUtil.fromBukkit(effect), EntityPotionEffectEvent.Cause.PLUGIN); // Paper - Don't ignore icon
          return true;
      }
 diff --git a/src/main/java/org/spigotmc/AsyncCatcher.java b/src/main/java/org/spigotmc/AsyncCatcher.java
diff --git a/patches/server/MC-Dev-fixes.patch b/patches/server/MC-Dev-fixes.patch
index 0f908d93d2..cfc893631e 100644
--- a/patches/server/MC-Dev-fixes.patch
+++ b/patches/server/MC-Dev-fixes.patch
@@ -193,40 +193,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          }));
          this.byName = Maps.newHashMap(builder.build()); // CraftBukkit
          RecipeManager.LOGGER.info("Loaded {} recipes", map1.size());
-diff --git a/src/main/java/net/minecraft/world/level/block/CeilingHangingSignBlock.java b/src/main/java/net/minecraft/world/level/block/CeilingHangingSignBlock.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/level/block/CeilingHangingSignBlock.java
-+++ b/src/main/java/net/minecraft/world/level/block/CeilingHangingSignBlock.java
-@@ -0,0 +0,0 @@ public class CeilingHangingSignBlock extends SignBlock {
-     public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
-         BlockEntity itemStack = world.getBlockEntity(pos);
-         if (itemStack instanceof SignBlockEntity signBlockEntity) {
--            ItemStack itemStack = player.getItemInHand(hand);
--            if (this.shouldTryToChainAnotherHangingSign(player, hit, signBlockEntity, itemStack)) {
-+            // Paper start - decompile fixes
-+            ItemStack itemStack0 = player.getItemInHand(hand);
-+            if (this.shouldTryToChainAnotherHangingSign(player, hit, signBlockEntity, itemStack0)) {
-+            // Paper end - decompile fixes
-                 return InteractionResult.PASS;
-             }
-         }
-diff --git a/src/main/java/net/minecraft/world/level/block/WallHangingSignBlock.java b/src/main/java/net/minecraft/world/level/block/WallHangingSignBlock.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/net/minecraft/world/level/block/WallHangingSignBlock.java
-+++ b/src/main/java/net/minecraft/world/level/block/WallHangingSignBlock.java
-@@ -0,0 +0,0 @@ public class WallHangingSignBlock extends SignBlock {
-     public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
-         BlockEntity itemStack = world.getBlockEntity(pos);
-         if (itemStack instanceof SignBlockEntity signBlockEntity) {
--            ItemStack itemStack = player.getItemInHand(hand);
--            if (this.shouldTryToChainAnotherHangingSign(state, player, hit, signBlockEntity, itemStack)) {
-+            // Paper start - decompile fixes
-+            ItemStack itemStack0 = player.getItemInHand(hand);
-+            if (this.shouldTryToChainAnotherHangingSign(state, player, hit, signBlockEntity, itemStack0)) {
-+            // Paper end
-                 return InteractionResult.PASS;
-             }
-         }
 diff --git a/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java b/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java
diff --git a/patches/server/Missing-Entity-API.patch b/patches/server/Missing-Entity-API.patch
index 82d5daa3ab..44656cefd1 100644
--- a/patches/server/Missing-Entity-API.patch
+++ b/patches/server/Missing-Entity-API.patch
@@ -370,36 +370,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      @Nullable
      @Override
      protected EntityHitResult findHitEntity(Vec3 currentPosition, Vec3 nextPosition) {
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-@@ -0,0 +0,0 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
-             } else if (Phantom.class.isAssignableFrom(clazz)) {
-                 entity = net.minecraft.world.entity.EntityType.PHANTOM.create(world);
-             } else if (Fish.class.isAssignableFrom(clazz)) {
--                if (Cod.class.isAssignableFrom(clazz)) {
--                    entity = net.minecraft.world.entity.EntityType.COD.create(world);
-+                // Paper start - Schooling Fish API
-+                if (io.papermc.paper.entity.SchoolableFish.class.isAssignableFrom(clazz)) {
-+                    if (Cod.class.isAssignableFrom(clazz)) {
-+                        entity = net.minecraft.world.entity.EntityType.COD.create(world);
-+                    } else if (Salmon.class.isAssignableFrom(clazz)) {
-+                        entity = net.minecraft.world.entity.EntityType.SALMON.create(world);
-+                    } else if (TropicalFish.class.isAssignableFrom(clazz)) {
-+                        entity = net.minecraft.world.entity.EntityType.TROPICAL_FISH.create(world);
-+                    }
-+                // Paper stop
-                 } else if (PufferFish.class.isAssignableFrom(clazz)) {
-                     entity = net.minecraft.world.entity.EntityType.PUFFERFISH.create(world);
--                } else if (Salmon.class.isAssignableFrom(clazz)) {
--                    entity = net.minecraft.world.entity.EntityType.SALMON.create(world);
--                } else if (TropicalFish.class.isAssignableFrom(clazz)) {
--                    entity = net.minecraft.world.entity.EntityType.TROPICAL_FISH.create(world);
-+                // Paper - remove old fish impl
-                 } else if (Tadpole.class.isAssignableFrom(clazz)) {
-                     entity = net.minecraft.world.entity.EntityType.TADPOLE.create(world);
-                 }
 diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java
@@ -668,30 +638,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
 +    // Paper end
  }
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-@@ -0,0 +0,0 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
-                     else { return new CraftSquid(server, (Squid) entity); }
-                 }
-                 else if (entity instanceof AbstractFish) {
--                    if (entity instanceof Cod) { return new CraftCod(server, (Cod) entity); }
-+                    // Paper start - Schooling Fish API
-+                    if (entity instanceof net.minecraft.world.entity.animal.AbstractSchoolingFish abstractSchoolingFish) {
-+                       if (entity instanceof Cod) { return new CraftCod(server, (Cod) entity); }
-+                       else if (entity instanceof Salmon) { return new CraftSalmon(server, (Salmon) entity); }
-+                       else if (entity instanceof TropicalFish) { return new CraftTropicalFish(server, (TropicalFish) entity); }
-+                       else { return new io.papermc.paper.entity.PaperSchoolableFish(server, abstractSchoolingFish); }
-+                    }
-+                    // Paper end
-                     else if (entity instanceof Pufferfish) { return new CraftPufferFish(server, (Pufferfish) entity); }
--                    else if (entity instanceof Salmon) { return new CraftSalmon(server, (Salmon) entity); }
--                    else if (entity instanceof TropicalFish) { return new CraftTropicalFish(server, (TropicalFish) entity); }
-+                    // Paper - move fish
-                     else if (entity instanceof Tadpole) { return new CraftTadpole(server, (Tadpole) entity); }
-                     else { return new CraftFish(server, (AbstractFish) entity); }
-                 }
 diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java
diff --git a/patches/server/More-Teleport-API.patch b/patches/server/More-Teleport-API.patch
index 8921c93074..7fe135ae5f 100644
--- a/patches/server/More-Teleport-API.patch
+++ b/patches/server/More-Teleport-API.patch
@@ -179,7 +179,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
          ServerPlayer entity = this.getHandle();
 @@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
-            return false;
+             return false;
          }
  
 -        if (entity.isVehicle()) {
diff --git a/patches/server/Paper-config-files.patch b/patches/server/Paper-config-files.patch
index 25161ee842..65628f5ab4 100644
--- a/patches/server/Paper-config-files.patch
+++ b/patches/server/Paper-config-files.patch
@@ -25,7 +25,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    implementation("org.spongepowered:configurate-yaml:4.2.0-SNAPSHOT") // Paper - config files
      implementation("commons-lang:commons-lang:2.6")
      runtimeOnly("org.xerial:sqlite-jdbc:3.42.0.1")
-     runtimeOnly("com.mysql:mysql-connector-j:8.1.0")
+     runtimeOnly("com.mysql:mysql-connector-j:8.2.0")
 diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
 new file mode 100644
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
diff --git a/patches/server/Respect-randomizeData-on-more-entities-when-spawning.patch b/patches/server/Respect-randomizeData-on-more-entities-when-spawning.patch
index aafe302747..7f6d103858 100644
--- a/patches/server/Respect-randomizeData-on-more-entities-when-spawning.patch
+++ b/patches/server/Respect-randomizeData-on-more-entities-when-spawning.patch
@@ -8,54 +8,61 @@ Subject: [PATCH] Respect randomizeData on more entities when spawning
 * FireworkRocketEntity
 * ExperienceOrb
 
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-@@ -0,0 +0,0 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
-         } else if (org.bukkit.entity.Item.class.isAssignableFrom(clazz)) {
-             entity = new net.minecraft.world.entity.item.ItemEntity(world, x, y, z, new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.DIRT));
-             // Paper end
-+            // Paper start - respect randomizeData
-+            if (!randomizeData) {
-+                entity.setDeltaMovement(net.minecraft.world.phys.Vec3.ZERO);
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
+@@ -0,0 +0,0 @@ public final class CraftEntityTypes {
+         entity.setDirection(direction.getX(), direction.getY(), direction.getZ());
+     };
+     private static final BiConsumer<SpawnData, net.minecraft.world.entity.Entity> ROT = (spawnData, entity) -> entity.setRot(spawnData.yaw(), spawnData.pitch()); // Paper
++    // Paper start - respect randomizeData
++    private static final BiConsumer<SpawnData, net.minecraft.world.entity.Entity> CLEAR_MOVE_IF_NOT_RANDOMIZED = (spawnData, entity) -> {
++        if (!spawnData.randomizeData()) {
++            entity.setDeltaMovement(net.minecraft.world.phys.Vec3.ZERO);
++        }
++    };
++    // Paper end - respect randomizeData
+     private static final Map<Class<?>, EntityTypeData<?, ?>> CLASS_TYPE_DATA = new HashMap<>();
+     private static final Map<EntityType, EntityTypeData<?, ?>> ENTITY_TYPE_DATA = new HashMap<>();
+ 
+@@ -0,0 +0,0 @@ public final class CraftEntityTypes {
+             net.minecraft.world.item.ItemStack itemStack = new net.minecraft.world.item.ItemStack(Items.STONE);
+             ItemEntity item = new ItemEntity(spawnData.minecraftWorld(), spawnData.x(), spawnData.z(), spawnData.z(), itemStack);
+             item.setPickUpDelay(10);
++            CLEAR_MOVE_IF_NOT_RANDOMIZED.accept(spawnData, item); // Paper - respect randomizeData
+ 
+             return item;
+         }));
+         register(new EntityTypeData<>(EntityType.EXPERIENCE_ORB, ExperienceOrb.class, CraftExperienceOrb::new,
+-                spawnData -> new net.minecraft.world.entity.ExperienceOrb(spawnData.minecraftWorld(), spawnData.x(), spawnData.z(), spawnData.z(), 0, org.bukkit.entity.ExperienceOrb.SpawnReason.CUSTOM, null, null) // Paper
++                combine(combine(spawnData -> new net.minecraft.world.entity.ExperienceOrb(spawnData.minecraftWorld(), spawnData.x(), spawnData.z(), spawnData.z(), 0, org.bukkit.entity.ExperienceOrb.SpawnReason.CUSTOM, null, null), CLEAR_MOVE_IF_NOT_RANDOMIZED), (spawnData, experienceOrb) -> { if (!spawnData.randomizeData()) { experienceOrb.setYRot(0); } }) // Paper - respect randomizeData
+         ));
+         register(new EntityTypeData<>(EntityType.AREA_EFFECT_CLOUD, AreaEffectCloud.class, CraftAreaEffectCloud::new, createAndMove(net.minecraft.world.entity.EntityType.AREA_EFFECT_CLOUD))); // Paper - set area effect cloud rotation
+         register(new EntityTypeData<>(EntityType.EGG, Egg.class, CraftEgg::new, spawnData -> new ThrownEgg(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z())));
+@@ -0,0 +0,0 @@ public final class CraftEntityTypes {
+             entity.setItem(CraftItemStack.asNMSCopy(new ItemStack(Material.SPLASH_POTION, 1)));
+             return entity;
+         }));
+-        register(new EntityTypeData<>(EntityType.PRIMED_TNT, TNTPrimed.class, CraftTNTPrimed::new, spawnData -> new PrimedTnt(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), null)));
++        register(new EntityTypeData<>(EntityType.PRIMED_TNT, TNTPrimed.class, CraftTNTPrimed::new, combine(spawnData -> new PrimedTnt(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), null), CLEAR_MOVE_IF_NOT_RANDOMIZED))); // Paper - respect randomizeData
+         register(new EntityTypeData<>(EntityType.FALLING_BLOCK, FallingBlock.class, CraftFallingBlock::new, spawnData -> {
+             BlockPos pos = BlockPos.containing(spawnData.x(), spawnData.y(), spawnData.z());
+             return new FallingBlockEntity(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), spawnData.world().getBlockState(pos)); // Paper - create falling block entities correctly
+         }));
+-        register(new EntityTypeData<>(EntityType.FIREWORK, Firework.class, CraftFirework::new, spawnData -> new FireworkRocketEntity(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), net.minecraft.world.item.ItemStack.EMPTY)));
++        // Paper start - respect randomizeData
++        register(new EntityTypeData<>(EntityType.FIREWORK, Firework.class, CraftFirework::new, spawnData -> {
++            FireworkRocketEntity entity = new FireworkRocketEntity(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), net.minecraft.world.item.ItemStack.EMPTY);
++            if (!spawnData.randomizeData()) {
++                // logic below was taken from FireworkRocketEntity constructor
++                entity.setDeltaMovement(0, 0.05, 0);
++                //noinspection PointlessArithmeticExpression
++                entity.lifetime = 10 * 1 + 6;
 +            }
-+            // Paper end - respect randomizeData
-         } else if (FallingBlock.class.isAssignableFrom(clazz)) {
-             BlockPos pos = BlockPos.containing(x, y, z);
-             entity = new FallingBlockEntity(world, x, y, z, this.getHandle().getBlockState(pos)); // Paper
-@@ -0,0 +0,0 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
-                 entity.moveTo(x, y, z, yaw, pitch);
-             } else if (Firework.class.isAssignableFrom(clazz)) {
-                 entity = new FireworkRocketEntity(world, x, y, z, net.minecraft.world.item.ItemStack.EMPTY);
-+                // Paper start - respect randomizeData
-+                if (!randomizeData) {
-+                    // logic below was taken from FireworkRocketEntity constructor
-+                    entity.setDeltaMovement(0, 0.05, 0);
-+                    //noinspection PointlessArithmeticExpression
-+                    ((FireworkRocketEntity) entity).lifetime = 10 * 1 + 6;
-+                }
-+                // Paper end - respect randomizeData
-             }
-         } else if (Minecart.class.isAssignableFrom(clazz)) {
-             if (PoweredMinecart.class.isAssignableFrom(clazz)) {
-@@ -0,0 +0,0 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
-             }
-         } else if (TNTPrimed.class.isAssignableFrom(clazz)) {
-             entity = new PrimedTnt(world, x, y, z, null);
-+            // Paper start - respect randomizeData
-+            if (!randomizeData) {
-+                entity.setDeltaMovement(net.minecraft.world.phys.Vec3.ZERO);
-+            }
-+            // Paper end - respect randomizeData
-         } else if (ExperienceOrb.class.isAssignableFrom(clazz)) {
-             entity = new net.minecraft.world.entity.ExperienceOrb(world, x, y, z, 0, org.bukkit.entity.ExperienceOrb.SpawnReason.CUSTOM, null, null); // Paper
-+            // Paper start - respect randomizeData
-+            if (!randomizeData) {
-+                entity.setDeltaMovement(net.minecraft.world.phys.Vec3.ZERO);
-+                entity.setYRot(0);
-+            }
-+            // Paper end - respect randomizeData
-         } else if (LightningStrike.class.isAssignableFrom(clazz)) {
-             entity = net.minecraft.world.entity.EntityType.LIGHTNING_BOLT.create(world);
-             entity.moveTo(location.getX(), location.getY(), location.getZ());
++            return entity;
++        }));
++        // Paper end - respect randomizeData
+         register(new EntityTypeData<>(EntityType.EVOKER_FANGS, EvokerFangs.class, CraftEvokerFangs::new, spawnData -> new net.minecraft.world.entity.projectile.EvokerFangs(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), (float) Math.toRadians(spawnData.yaw()), 0, null)));
+         register(new EntityTypeData<>(EntityType.MINECART_COMMAND, CommandMinecart.class, CraftMinecartCommand::new, spawnData -> new MinecartCommandBlock(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z())));
+         register(new EntityTypeData<>(EntityType.MINECART, RideableMinecart.class, CraftMinecartRideable::new, spawnData -> new Minecart(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z())));
diff --git a/patches/server/Set-area-affect-cloud-rotation.patch b/patches/server/Set-area-affect-cloud-rotation.patch
index 4eaba65e59..9afd5c0921 100644
--- a/patches/server/Set-area-affect-cloud-rotation.patch
+++ b/patches/server/Set-area-affect-cloud-rotation.patch
@@ -4,15 +4,16 @@ Date: Mon, 5 Apr 2021 16:58:20 -0400
 Subject: [PATCH] Set area affect cloud rotation
 
 
-diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
-@@ -0,0 +0,0 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
-             entity.moveTo(location.getX(), location.getY(), location.getZ());
-         } else if (AreaEffectCloud.class.isAssignableFrom(clazz)) {
-             entity = new net.minecraft.world.entity.AreaEffectCloud(world, x, y, z);
-+            entity.moveTo(x, y, z, yaw, pitch); // Paper - Set area effect cloud Rotation
-         } else if (EvokerFangs.class.isAssignableFrom(clazz)) {
-             entity = new net.minecraft.world.entity.projectile.EvokerFangs(world, x, y, z, (float) Math.toRadians(yaw), 0, null);
-         } else if (Marker.class.isAssignableFrom(clazz)) {
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
+@@ -0,0 +0,0 @@ public final class CraftEntityTypes {
+         register(new EntityTypeData<>(EntityType.EXPERIENCE_ORB, ExperienceOrb.class, CraftExperienceOrb::new,
+                 spawnData -> new net.minecraft.world.entity.ExperienceOrb(spawnData.minecraftWorld(), spawnData.x(), spawnData.z(), spawnData.z(), 0, org.bukkit.entity.ExperienceOrb.SpawnReason.CUSTOM, null, null) // Paper
+         ));
+-        register(new EntityTypeData<>(EntityType.AREA_EFFECT_CLOUD, AreaEffectCloud.class, CraftAreaEffectCloud::new, spawnData -> new net.minecraft.world.entity.AreaEffectCloud(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z())));
++        register(new EntityTypeData<>(EntityType.AREA_EFFECT_CLOUD, AreaEffectCloud.class, CraftAreaEffectCloud::new, createAndMove(net.minecraft.world.entity.EntityType.AREA_EFFECT_CLOUD))); // Paper - set area effect cloud rotation
+         register(new EntityTypeData<>(EntityType.EGG, Egg.class, CraftEgg::new, spawnData -> new ThrownEgg(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z())));
+         register(new EntityTypeData<>(EntityType.LEASH_HITCH, LeashHitch.class, CraftLeash::new, spawnData -> new LeashFenceKnotEntity(spawnData.minecraftWorld(), BlockPos.containing(spawnData.x(), spawnData.y(), spawnData.z())))); // SPIGOT-5732: LeashHitch has no direction and is always centered at a block
+         register(new EntityTypeData<>(EntityType.SNOWBALL, Snowball.class, CraftSnowball::new, spawnData -> new net.minecraft.world.entity.projectile.Snowball(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z())));
diff --git a/patches/server/Setup-Gradle-project.patch b/patches/server/Setup-Gradle-project.patch
index 674c91c632..a27bc142ef 100644
--- a/patches/server/Setup-Gradle-project.patch
+++ b/patches/server/Setup-Gradle-project.patch
@@ -49,11 +49,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    implementation("org.ow2.asm:asm:9.5")
 +    implementation("commons-lang:commons-lang:2.6")
 +    runtimeOnly("org.xerial:sqlite-jdbc:3.42.0.1")
-+    runtimeOnly("com.mysql:mysql-connector-j:8.1.0")
++    runtimeOnly("com.mysql:mysql-connector-j:8.2.0")
 +
-+    runtimeOnly("org.apache.maven:maven-resolver-provider:3.8.5")
-+    runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3")
-+    runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.3")
++    runtimeOnly("org.apache.maven:maven-resolver-provider:3.9.6")
++    runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18")
++    runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.18")
 +
 +    testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
 +    testImplementation("org.hamcrest:hamcrest:2.2")
@@ -420,26 +420,26 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 -        <dependency>
 -            <groupId>com.mysql</groupId>
 -            <artifactId>mysql-connector-j</artifactId>
--            <version>8.1.0</version>
+-            <version>8.2.0</version>
 -            <scope>runtime</scope>
 -        </dependency>
 -        <!-- add these back in as they are not exposed by the API -->
 -        <dependency>
 -            <groupId>org.apache.maven</groupId>
 -            <artifactId>maven-resolver-provider</artifactId>
--            <version>3.8.5</version>
+-            <version>3.9.6</version>
 -            <scope>runtime</scope>
 -        </dependency>
 -        <dependency>
 -            <groupId>org.apache.maven.resolver</groupId>
 -            <artifactId>maven-resolver-connector-basic</artifactId>
--            <version>1.7.3</version>
+-            <version>1.9.18</version>
 -            <scope>runtime</scope>
 -        </dependency>
 -        <dependency>
 -            <groupId>org.apache.maven.resolver</groupId>
 -            <artifactId>maven-resolver-transport-http</artifactId>
--            <version>1.7.3</version>
+-            <version>1.9.18</version>
 -            <scope>runtime</scope>
 -        </dependency>
 -        <!-- annotations -->
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/Use-AsyncAppender-to-keep-logging-IO-off-main-thread.patch b/patches/server/Use-AsyncAppender-to-keep-logging-IO-off-main-thread.patch
index 7214ff5959..32c3dd9dea 100644
--- a/patches/server/Use-AsyncAppender-to-keep-logging-IO-off-main-thread.patch
+++ b/patches/server/Use-AsyncAppender-to-keep-logging-IO-off-main-thread.patch
@@ -11,11 +11,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@ dependencies {
      implementation("commons-lang:commons-lang:2.6")
      runtimeOnly("org.xerial:sqlite-jdbc:3.42.0.1")
-     runtimeOnly("com.mysql:mysql-connector-j:8.1.0")
+     runtimeOnly("com.mysql:mysql-connector-j:8.2.0")
 +    runtimeOnly("com.lmax:disruptor:3.4.4") // Paper
  
-     runtimeOnly("org.apache.maven:maven-resolver-provider:3.8.5")
-     runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3")
+     runtimeOnly("org.apache.maven:maven-resolver-provider:3.9.6")
+     runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18")
 diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/resources/log4j2.xml
diff --git a/patches/server/Use-Velocity-compression-and-cipher-natives.patch b/patches/server/Use-Velocity-compression-and-cipher-natives.patch
index 113dc004f7..19f0cbfb84 100644
--- a/patches/server/Use-Velocity-compression-and-cipher-natives.patch
+++ b/patches/server/Use-Velocity-compression-and-cipher-natives.patch
@@ -10,7 +10,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +++ b/build.gradle.kts
 @@ -0,0 +0,0 @@ dependencies {
      runtimeOnly("org.xerial:sqlite-jdbc:3.42.0.1")
-     runtimeOnly("com.mysql:mysql-connector-j:8.1.0")
+     runtimeOnly("com.mysql:mysql-connector-j:8.2.0")
      runtimeOnly("com.lmax:disruptor:3.4.4") // Paper
 +    // Paper start - Use Velocity cipher
 +    implementation("com.velocitypowered:velocity-native:3.1.2-SNAPSHOT") {
@@ -18,8 +18,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
 +    // Paper end
  
-     runtimeOnly("org.apache.maven:maven-resolver-provider:3.8.5")
-     runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3")
+     runtimeOnly("org.apache.maven:maven-resolver-provider:3.9.6")
+     runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18")
 diff --git a/src/main/java/net/minecraft/network/CipherDecoder.java b/src/main/java/net/minecraft/network/CipherDecoder.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/network/CipherDecoder.java
diff --git a/scripts/upstreamCommit.sh b/scripts/upstreamCommit.sh
index 3e5e79f1b9..e994d90a5f 100755
--- a/scripts/upstreamCommit.sh
+++ b/scripts/upstreamCommit.sh
@@ -5,7 +5,7 @@ PS1="$"
 
 function changelog() {
     base=$(git ls-tree HEAD $1  | cut -d' ' -f3 | cut -f1)
-    cd $1 && git log --oneline ${base}...HEAD | sed -E 's/(^[0-9a-f]{8,}( SPIGOT-[0-9]{1,4},?)* |Revert ")#([0-9]+)/\1PR-\3/'
+    cd $1 && git log --oneline ${base}...HEAD | sed -E 's/(^[0-9a-f]{8,}( (SPIGOT-[0-9]{1,4}|MC-[0-9]{1,6}),?)* |Revert ")#([0-9]+)/\1PR-\4/'
 }
 bukkit=$(changelog work/Bukkit)
 cb=$(changelog work/CraftBukkit)
diff --git a/work/Bukkit b/work/Bukkit
index 01bb6ba7d0..f29cb80158 160000
--- a/work/Bukkit
+++ b/work/Bukkit
@@ -1 +1 @@
-Subproject commit 01bb6ba7d0add97af46db9ae8c2c991912033aa7
+Subproject commit f29cb8015897da1bca0c93522c5884c4c9f93601
diff --git a/work/CraftBukkit b/work/CraftBukkit
index cb2ea54def..b3b43a6ad2 160000
--- a/work/CraftBukkit
+++ b/work/CraftBukkit
@@ -1 +1 @@
-Subproject commit cb2ea54def89e749d9d1f6a4a7ea029110f03a43
+Subproject commit b3b43a6ad21c9f7fc2dd0a1e7e94abae0057770d
diff --git a/work/Spigot b/work/Spigot
index ce0f71e427..06d602e7c3 160000
--- a/work/Spigot
+++ b/work/Spigot
@@ -1 +1 @@
-Subproject commit ce0f71e4276e911707a258a968371f06f8718aca
+Subproject commit 06d602e7c3165ebf32f7419cb5873ec82d54ff7c