diff --git a/patches/api/API-to-get-a-BlockState-without-a-snapshot.patch b/patches/api/API-to-get-a-BlockState-without-a-snapshot.patch
index 1df53fbe18..158eaae091 100644
--- a/patches/api/API-to-get-a-BlockState-without-a-snapshot.patch
+++ b/patches/api/API-to-get-a-BlockState-without-a-snapshot.patch
@@ -12,7 +12,7 @@ diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukki
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/block/Block.java
 +++ b/src/main/java/org/bukkit/block/Block.java
-@@ -0,0 +0,0 @@ public interface Block extends Metadatable {
+@@ -0,0 +0,0 @@ public interface Block extends Metadatable, Translatable {
      @NotNull
      BlockState getState();
  
diff --git a/patches/api/Add-Block-isValidTool.patch b/patches/api/Add-Block-isValidTool.patch
index d115b7cfde..348e05b224 100644
--- a/patches/api/Add-Block-isValidTool.patch
+++ b/patches/api/Add-Block-isValidTool.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukki
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/block/Block.java
 +++ b/src/main/java/org/bukkit/block/Block.java
-@@ -0,0 +0,0 @@ public interface Block extends Metadatable, net.kyori.adventure.translation.Tran
+@@ -0,0 +0,0 @@ public interface Block extends Metadatable, Translatable, net.kyori.adventure.tr
      public static int getBlockKeyZ(long packed) {
          return (int) ((packed << 10) >> 37);
      }
diff --git a/patches/api/Add-BlockSoundGroup-interface.patch b/patches/api/Add-BlockSoundGroup-interface.patch
index 5005389b7a..b3f68520dc 100644
--- a/patches/api/Add-BlockSoundGroup-interface.patch
+++ b/patches/api/Add-BlockSoundGroup-interface.patch
@@ -79,7 +79,7 @@ diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukki
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/block/Block.java
 +++ b/src/main/java/org/bukkit/block/Block.java
-@@ -0,0 +0,0 @@ public interface Block extends Metadatable {
+@@ -0,0 +0,0 @@ public interface Block extends Metadatable, Translatable {
       * @return <code>true</code> if the block data can be placed here
       */
      boolean canPlace(@NotNull BlockData data);
diff --git a/patches/api/Add-Destroy-Speed-API.patch b/patches/api/Add-Destroy-Speed-API.patch
index 4aaeed43e4..45a4c573b7 100644
--- a/patches/api/Add-Destroy-Speed-API.patch
+++ b/patches/api/Add-Destroy-Speed-API.patch
@@ -9,9 +9,9 @@ diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukki
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/block/Block.java
 +++ b/src/main/java/org/bukkit/block/Block.java
-@@ -0,0 +0,0 @@ public interface Block extends Metadatable, net.kyori.adventure.translation.Tran
+@@ -0,0 +0,0 @@ public interface Block extends Metadatable, Translatable, net.kyori.adventure.tr
      @NotNull
-     @Deprecated
+     @Deprecated(forRemoval = true)
      String getTranslationKey();
 +
 +    /**
diff --git a/patches/api/Add-Raw-Byte-Entity-Serialization.patch b/patches/api/Add-Raw-Byte-Entity-Serialization.patch
index 0e3f99ebdf..15cd50a215 100644
--- a/patches/api/Add-Raw-Byte-Entity-Serialization.patch
+++ b/patches/api/Add-Raw-Byte-Entity-Serialization.patch
@@ -21,8 +21,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    org.bukkit.entity.Entity deserializeEntity(byte[] data, World world, boolean preserveUUID);
 +
      /**
-      * Return the translation key for the Material, so the client can translate it into the active
-      * locale when using a {@link net.kyori.adventure.text.TranslatableComponent}.
+      * Creates and returns the next EntityId available.
+      * <p>
 diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/entity/Entity.java
diff --git a/patches/api/Add-Raw-Byte-ItemStack-Serialization.patch b/patches/api/Add-Raw-Byte-ItemStack-Serialization.patch
index ff1945465e..bb89536915 100644
--- a/patches/api/Add-Raw-Byte-ItemStack-Serialization.patch
+++ b/patches/api/Add-Raw-Byte-ItemStack-Serialization.patch
@@ -23,7 +23,7 @@ diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/o
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/inventory/ItemStack.java
 +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
          return Bukkit.getServer().getItemFactory().ensureServerConversions(this);
      }
  
diff --git a/patches/api/Add-enchantWithLevels-API.patch b/patches/api/Add-enchantWithLevels-API.patch
index 98b6db8588..636b1b8021 100644
--- a/patches/api/Add-enchantWithLevels-API.patch
+++ b/patches/api/Add-enchantWithLevels-API.patch
@@ -35,7 +35,7 @@ diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/o
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/inventory/ItemStack.java
 +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
      }
  
      // Paper start
diff --git a/patches/api/Add-getComputedBiome-API.patch b/patches/api/Add-getComputedBiome-API.patch
index f7389965b5..c7d04fc9e5 100644
--- a/patches/api/Add-getComputedBiome-API.patch
+++ b/patches/api/Add-getComputedBiome-API.patch
@@ -54,7 +54,7 @@ diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukki
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/block/Block.java
 +++ b/src/main/java/org/bukkit/block/Block.java
-@@ -0,0 +0,0 @@ public interface Block extends Metadatable, net.kyori.adventure.translation.Tran
+@@ -0,0 +0,0 @@ public interface Block extends Metadatable, Translatable, net.kyori.adventure.tr
       * Returns the biome that this block resides in
       *
       * @return Biome type containing this block
diff --git a/patches/api/Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch b/patches/api/Add-getDrops-to-BlockState.patch
similarity index 66%
rename from patches/api/Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch
rename to patches/api/Add-getDrops-to-BlockState.patch
index 89d7359bb5..7e08b816a9 100644
--- a/patches/api/Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch
+++ b/patches/api/Add-getDrops-to-BlockState.patch
@@ -1,8 +1,10 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: MelnCat <melncatuwu@gmail.com>
 Date: Fri, 12 Aug 2022 23:24:53 -0700
-Subject: [PATCH] Add getDrops to BlockState and isPreferredTool to BlockData
+Subject: [PATCH] Add getDrops to BlockState
 
+Originally added isPreferredTool to BlockData but
+upstream added that.
 
 diff --git a/src/main/java/org/bukkit/block/BlockState.java b/src/main/java/org/bukkit/block/BlockState.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
@@ -43,24 +45,3 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    java.util.@org.jetbrains.annotations.Unmodifiable Collection<org.bukkit.inventory.ItemStack> getDrops(@NotNull org.bukkit.inventory.ItemStack tool, @Nullable org.bukkit.entity.Entity entity);
      // Paper end
  }
-diff --git a/src/main/java/org/bukkit/block/data/BlockData.java b/src/main/java/org/bukkit/block/data/BlockData.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/block/data/BlockData.java
-+++ b/src/main/java/org/bukkit/block/data/BlockData.java
-@@ -0,0 +0,0 @@ public interface BlockData extends Cloneable {
-      * @return is ticked randomly
-      */
-     boolean isRandomlyTicked();
-+
-+    /**
-+     * Returns if the given item is a preferred choice to break this block.
-+     *
-+     * In some cases this determines if a block will drop anything or extra
-+     * loot.
-+     *
-+     * @param tool The tool or item used for breaking this block
-+     * @return true if the tool is preferred for breaking this block
-+     */
-+    boolean isPreferredTool(@NotNull org.bukkit.inventory.ItemStack tool);
-     // Paper end
- }
diff --git a/patches/api/Add-getI18NDisplayName-API.patch b/patches/api/Add-getI18NDisplayName-API.patch
index 4690b6073d..e63e7aefec 100644
--- a/patches/api/Add-getI18NDisplayName-API.patch
+++ b/patches/api/Add-getI18NDisplayName-API.patch
@@ -35,7 +35,7 @@ diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/o
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/inventory/ItemStack.java
 +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
      public @NotNull net.kyori.adventure.text.Component displayName() {
          return Bukkit.getServer().getItemFactory().displayName(this);
      }
diff --git a/patches/api/Add-isCollidable-methods-to-various-places.patch b/patches/api/Add-isCollidable-methods-to-various-places.patch
index 084ef23bd0..370f7137f6 100644
--- a/patches/api/Add-isCollidable-methods-to-various-places.patch
+++ b/patches/api/Add-isCollidable-methods-to-various-places.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/M
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/Material.java
 +++ b/src/main/java/org/bukkit/Material.java
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      public Multimap<Attribute, AttributeModifier> getItemAttributes(@NotNull EquipmentSlot equipmentSlot) {
          return Bukkit.getUnsafe().getItemAttributes(this, equipmentSlot);
      }
@@ -48,7 +48,7 @@ diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukki
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/block/Block.java
 +++ b/src/main/java/org/bukkit/block/Block.java
-@@ -0,0 +0,0 @@ public interface Block extends Metadatable, net.kyori.adventure.translation.Tran
+@@ -0,0 +0,0 @@ public interface Block extends Metadatable, Translatable, net.kyori.adventure.tr
       * @return true if block is solid
       */
      boolean isSolid();
diff --git a/patches/api/Add-methods-to-get-translation-keys.patch b/patches/api/Add-methods-to-get-translation-keys.patch
index f3833b3b4c..0461e0fb1d 100644
--- a/patches/api/Add-methods-to-get-translation-keys.patch
+++ b/patches/api/Add-methods-to-get-translation-keys.patch
@@ -151,73 +151,61 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
   * An enum of all material IDs accepted by the official server and client
   */
  @SuppressWarnings({"DeprecatedIsStillUsed", "deprecation"}) // Paper
--public enum Material implements Keyed {
-+public enum Material implements Keyed, net.kyori.adventure.translation.Translatable { // Paper
+-public enum Material implements Keyed, Translatable {
++public enum Material implements Keyed, Translatable, net.kyori.adventure.translation.Translatable { // Paper
      //<editor-fold desc="Materials" defaultstate="collapsed">
      AIR(9648, 0),
      STONE(22948),
-@@ -0,0 +0,0 @@ public enum Material implements Keyed {
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable {
          }
          return false;
      }
 +
-+    /**
-+     * Return the translation key for the Material, so the client can translate it into the active
-+     * locale when using a TranslatableComponent.
-+     * @return the translation key
-+     * @deprecated use {@link #translationKey()}
-+     */
-+    @NotNull
-+    @Deprecated
-+    public String getTranslationKey() {
-+        return this.translationKey();
-+    }
-+
 +    @Override
 +    public @NotNull String translationKey() {
-+        return Bukkit.getUnsafe().getTranslationKey(this);
++        if (this.isItem()) {
++            return Bukkit.getUnsafe().getItemTranslationKey(this);
++        } else {
++            return Bukkit.getUnsafe().getBlockTranslationKey(this);
++        }
 +    }
      // Paper end
  
      /**
-diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable {
+      * material
+      * @see #getBlockTranslationKey()
+      * @see #getItemTranslationKey()
++     * @deprecated use {@link #translationKey()}
+      */
+     @Override
+     @NotNull
++    @Deprecated(forRemoval = true) // Paper
+     public String getTranslationKey() {
+         if (this.isItem()) {
+             return Bukkit.getUnsafe().getItemTranslationKey(this);
+diff --git a/src/main/java/org/bukkit/Translatable.java b/src/main/java/org/bukkit/Translatable.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/UnsafeValues.java
-+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -0,0 +0,0 @@ public interface UnsafeValues {
-     byte[] serializeItem(ItemStack item);
+--- a/src/main/java/org/bukkit/Translatable.java
++++ b/src/main/java/org/bukkit/Translatable.java
+@@ -0,0 +0,0 @@ import org.jetbrains.annotations.NotNull;
+ /**
+  * Represents an object with a text representation that can be translated by the
+  * Minecraft client.
++ * @deprecated use {@link net.kyori.adventure.translation.Translatable}
+  */
++@Deprecated(forRemoval = true) // Paper
+ public interface Translatable {
  
-     ItemStack deserializeItem(byte[] data);
-+
-+    /**
-+     * Return the translation key for the Material, so the client can translate it into the active
-+     * locale when using a {@link net.kyori.adventure.text.TranslatableComponent}.
-+     * @return the translation key
-+     */
-+    String getTranslationKey(Material mat);
-+
-+    /**
-+     * Return the translation key for the Block, so the client can translate it into the active
-+     * locale when using a {@link net.kyori.adventure.text.TranslatableComponent}.
-+     * @return the translation key
-+     */
-+    String getTranslationKey(org.bukkit.block.Block block);
-+
-+    /**
-+     * Return the translation key for the EntityType, so the client can translate it into the active
-+     * locale when using a {@link net.kyori.adventure.text.TranslatableComponent}.<br>
-+     * This is <code>null</code>, when the EntityType isn't known to NMS (custom entities)
-+     * @return the translation key
-+     */
-+    String getTranslationKey(org.bukkit.entity.EntityType type);
-+
-+    /**
-+     * Return the translation key for the ItemStack, so the client can translate it into the active
-+     * locale when using a {@link net.kyori.adventure.text.TranslatableComponent}.<br>
-+     * @return the translation key
-+     */
-+    String getTranslationKey(ItemStack itemStack);
-     // Paper end
+     /**
+      * Get the translation key, suitable for use in a translation component.
+      *
+      * @return the translation key
++     * @deprecated look for a {@code translationKey()} method instead
+      */
+     @NotNull
++    @Deprecated(forRemoval = true) // Paper
+     String getTranslationKey();
  }
 diff --git a/src/main/java/org/bukkit/attribute/Attribute.java b/src/main/java/org/bukkit/attribute/Attribute.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
@@ -276,24 +264,21 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
   * (i.e. lighting and power) may not be able to be safely accessed during world
   * generation when used in cases like BlockPhysicsEvent!!!!
   */
--public interface Block extends Metadatable {
-+public interface Block extends Metadatable, net.kyori.adventure.translation.Translatable { // Paper - translatable
+-public interface Block extends Metadatable, Translatable {
++public interface Block extends Metadatable, Translatable, net.kyori.adventure.translation.Translatable { // Paper - translatable
  
      /**
       * Gets the metadata for this block
-@@ -0,0 +0,0 @@ public interface Block extends Metadatable {
+@@ -0,0 +0,0 @@ public interface Block extends Metadatable, Translatable {
       * @return the sound group for this block
       */
      @NotNull org.bukkit.SoundGroup getBlockSoundGroup();
 +
 +    /**
-+     * Return the translation key for the Block, so the client can translate it into the active
-+     * locale when using a TranslatableComponent.
-+     * @return the translation key
 +     * @deprecated use {@link #translationKey()}
 +     */
 +    @NotNull
-+    @Deprecated
++    @Deprecated(forRemoval = true)
 +    String getTranslationKey();
      // Paper end
  }
@@ -333,29 +318,21 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  import org.jetbrains.annotations.NotNull;
  import org.jetbrains.annotations.Nullable;
  
--public enum EntityType implements Keyed {
-+public enum EntityType implements Keyed, net.kyori.adventure.translation.Translatable { // Paper - translatable
+-public enum EntityType implements Keyed, Translatable {
++public enum EntityType implements Keyed, Translatable, net.kyori.adventure.translation.Translatable { // Paper - translatable
  
      // These strings MUST match the strings in nms.EntityTypes and are case sensitive.
      /**
-@@ -0,0 +0,0 @@ public enum EntityType implements Keyed {
-     public boolean isAlive() {
-         return living;
+@@ -0,0 +0,0 @@ public enum EntityType implements Keyed, Translatable {
+ 
+     @Override
+     @NotNull
++    @Deprecated(forRemoval = true) // Paper
+     public String getTranslationKey() {
+         return Bukkit.getUnsafe().getTranslationKey(this);
      }
-+    // Paper start
-+    /**
-+     * Return the translation key for the EntityType, so the client can translate it into the active
-+     * locale when using a TranslatableComponent.<br>
-+     * This is <code>null</code>, when the EntityType isn't known to NMS (custom entities)
-+     * @return the translation key
-+     * @deprecated use {@link #translationKey()}
-+     */
-+    @Deprecated
-+    @Nullable
-+    public String getTranslationKey() {
-+        return org.bukkit.Bukkit.getUnsafe().getTranslationKey(this);
-+    }
 +
++    // Paper start
 +    /**
 +     * @throws IllegalArgumentException if the entity does not have a translation key (is probably a custom entity)
 +     */
@@ -480,31 +457,25 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
   * use this class to encapsulate Materials for which {@link Material#isItem()}
   * returns false.</b>
   */
--public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowItem> { // Paper
-+public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowItem>, net.kyori.adventure.translation.Translatable { // Paper
+-public class ItemStack implements Cloneable, ConfigurationSerializable, Translatable, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowItem> { // Paper
++public class ItemStack implements Cloneable, ConfigurationSerializable, Translatable, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowItem>, net.kyori.adventure.translation.Translatable { // Paper
      private Material type = Material.AIR;
      private int amount = 0;
      private MaterialData data = null;
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
+ 
+     @Override
+     @NotNull
++    @Deprecated(forRemoval = true) // Paper
+     public String getTranslationKey() {
+         return Bukkit.getUnsafe().getTranslationKey(this);
+     }
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
          ItemMeta itemMeta = getItemMeta();
          return itemMeta != null && itemMeta.hasItemFlag(flag);
      }
 +
 +    /**
-+     * Gets the translation key for this itemstack.
-+     * This is not the same as getting the translation key
-+     * for the material of this itemstack.
-+     *
-+     * @return the translation key
-+     * @deprecated use {@link #translationKey()}
-+     */
-+    @NotNull
-+    @Deprecated
-+    public String getTranslationKey() {
-+        return this.translationKey();
-+    }
-+
-+    /**
 +     * {@inheritDoc}
 +     * <p>
 +     * This is not the same as getting the translation key
diff --git a/patches/api/Add-missing-isFuel-Material-entries.patch b/patches/api/Add-missing-isFuel-Material-entries.patch
index 985823f126..360810b640 100644
--- a/patches/api/Add-missing-isFuel-Material-entries.patch
+++ b/patches/api/Add-missing-isFuel-Material-entries.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/M
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/Material.java
 +++ b/src/main/java/org/bukkit/Material.java
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
              case ACACIA_DOOR:
              case ACACIA_FENCE:
              case ACACIA_FENCE_GATE:
@@ -16,7 +16,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              case ACACIA_LOG:
              case ACACIA_PLANKS:
              case ACACIA_PRESSURE_PLATE:
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
              case ACACIA_WOOD:
              case AZALEA:
              case BAMBOO:
@@ -44,7 +44,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              case BARREL:
              case BIRCH_BOAT:
              case BIRCH_BUTTON:
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
              case BIRCH_DOOR:
              case BIRCH_FENCE:
              case BIRCH_FENCE_GATE:
@@ -52,7 +52,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              case BIRCH_LOG:
              case BIRCH_PLANKS:
              case BIRCH_PRESSURE_PLATE:
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
              case DARK_OAK_DOOR:
              case DARK_OAK_FENCE:
              case DARK_OAK_FENCE_GATE:
@@ -60,7 +60,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              case DARK_OAK_LOG:
              case DARK_OAK_PLANKS:
              case DARK_OAK_PRESSURE_PLATE:
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
              case JUNGLE_DOOR:
              case JUNGLE_FENCE:
              case JUNGLE_FENCE_GATE:
@@ -68,7 +68,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              case JUNGLE_LOG:
              case JUNGLE_PLANKS:
              case JUNGLE_PRESSURE_PLATE:
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
              case MANGROVE_DOOR:
              case MANGROVE_FENCE:
              case MANGROVE_FENCE_GATE:
@@ -76,7 +76,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              case MANGROVE_LOG:
              case MANGROVE_PLANKS:
              case MANGROVE_PRESSURE_PLATE:
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
              case OAK_DOOR:
              case OAK_FENCE:
              case OAK_FENCE_GATE:
@@ -84,7 +84,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              case OAK_LOG:
              case OAK_PLANKS:
              case OAK_PRESSURE_PLATE:
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
              case SPRUCE_DOOR:
              case SPRUCE_FENCE:
              case SPRUCE_FENCE_GATE:
@@ -92,7 +92,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              case SPRUCE_LOG:
              case SPRUCE_PLANKS:
              case SPRUCE_PRESSURE_PLATE:
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
              case STICK:
              case STRIPPED_ACACIA_LOG:
              case STRIPPED_ACACIA_WOOD:
diff --git a/patches/api/Additional-Block-Material-API-s.patch b/patches/api/Additional-Block-Material-API-s.patch
index 994c0f52b8..2439118514 100644
--- a/patches/api/Additional-Block-Material-API-s.patch
+++ b/patches/api/Additional-Block-Material-API-s.patch
@@ -12,7 +12,7 @@ diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukki
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/block/Block.java
 +++ b/src/main/java/org/bukkit/block/Block.java
-@@ -0,0 +0,0 @@ public interface Block extends Metadatable, net.kyori.adventure.translation.Tran
+@@ -0,0 +0,0 @@ public interface Block extends Metadatable, Translatable, net.kyori.adventure.tr
       */
      boolean isLiquid();
  
diff --git a/patches/api/Adventure.patch b/patches/api/Adventure.patch
index 9e1fe92d39..175246c58c 100644
--- a/patches/api/Adventure.patch
+++ b/patches/api/Adventure.patch
@@ -3712,14 +3712,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
   * use this class to encapsulate Materials for which {@link Material#isItem()}
   * returns false.</b>
   */
--public class ItemStack implements Cloneable, ConfigurationSerializable {
-+public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowItem> { // Paper
+-public class ItemStack implements Cloneable, ConfigurationSerializable, Translatable {
++public class ItemStack implements Cloneable, ConfigurationSerializable, Translatable, net.kyori.adventure.text.event.HoverEventSource<net.kyori.adventure.text.event.HoverEvent.ShowItem> { // Paper
      private Material type = Material.AIR;
      private int amount = 0;
      private MaterialData data = null;
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable {
- 
-         return true;
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
+     public String getTranslationKey() {
+         return Bukkit.getUnsafe().getTranslationKey(this);
      }
 +
 +    // Paper start
diff --git a/patches/api/Allow-Blocks-to-be-accessed-via-a-long-key.patch b/patches/api/Allow-Blocks-to-be-accessed-via-a-long-key.patch
index 6b3a1ce13a..8f930a52e7 100644
--- a/patches/api/Allow-Blocks-to-be-accessed-via-a-long-key.patch
+++ b/patches/api/Allow-Blocks-to-be-accessed-via-a-long-key.patch
@@ -98,7 +98,7 @@ diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukki
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/block/Block.java
 +++ b/src/main/java/org/bukkit/block/Block.java
-@@ -0,0 +0,0 @@ public interface Block extends Metadatable {
+@@ -0,0 +0,0 @@ public interface Block extends Metadatable, Translatable {
       */
      int getZ();
  
diff --git a/patches/api/Attributes-API-for-item-defaults.patch b/patches/api/Attributes-API-for-item-defaults.patch
index ac9b8f689b..8465c006a3 100644
--- a/patches/api/Attributes-API-for-item-defaults.patch
+++ b/patches/api/Attributes-API-for-item-defaults.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/M
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/Material.java
 +++ b/src/main/java/org/bukkit/Material.java
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      public io.papermc.paper.inventory.ItemRarity getItemRarity() {
          return Bukkit.getUnsafe().getItemRarity(this);
      }
diff --git a/patches/api/Block-Ticking-API.patch b/patches/api/Block-Ticking-API.patch
index 16a3dfd263..160c0230b6 100644
--- a/patches/api/Block-Ticking-API.patch
+++ b/patches/api/Block-Ticking-API.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukki
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/block/Block.java
 +++ b/src/main/java/org/bukkit/block/Block.java
-@@ -0,0 +0,0 @@ public interface Block extends Metadatable, net.kyori.adventure.translation.Tran
+@@ -0,0 +0,0 @@ public interface Block extends Metadatable, Translatable, net.kyori.adventure.tr
       * @return true if the block was destroyed
       */
      boolean breakNaturally(@NotNull ItemStack tool, boolean triggerEffect, boolean dropExperience);
diff --git a/patches/api/Cache-the-result-of-Material-isBlock.patch b/patches/api/Cache-the-result-of-Material-isBlock.patch
index 85161b8783..bf400a5790 100644
--- a/patches/api/Cache-the-result-of-Material-isBlock.patch
+++ b/patches/api/Cache-the-result-of-Material-isBlock.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/M
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/Material.java
 +++ b/src/main/java/org/bukkit/Material.java
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      public final Class<?> data;
      private final boolean legacy;
      private final NamespacedKey key;
@@ -16,7 +16,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
      private Material(final int id) {
          this(id, 64);
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
       * @return true if this material is a block
       */
      public boolean isBlock() {
@@ -28,7 +28,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
          switch (this) {
              //<editor-fold defaultstate="collapsed" desc="isBlock">
              case ACACIA_BUTTON:
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      static {
          for (Material material : values()) {
              BY_NAME.put(material.name(), material);
diff --git a/patches/api/Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch b/patches/api/Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch
index de5800f633..e175ddef6d 100644
--- a/patches/api/Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch
+++ b/patches/api/Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch
@@ -10,9 +10,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/org/bukkit/UnsafeValues.java
 +++ b/src/main/java/org/bukkit/UnsafeValues.java
 @@ -0,0 +0,0 @@ public interface UnsafeValues {
-      * @return the translation key
-      */
-     String getTranslationKey(ItemStack itemStack);
+     byte[] serializeItem(ItemStack item);
+ 
+     ItemStack deserializeItem(byte[] data);
 +
 +    /**
 +     * Creates and returns the next EntityId available.
diff --git a/patches/api/Fix-HandlerList-for-InventoryBlockStartEvent-subclas.patch b/patches/api/Fix-HandlerList-for-InventoryBlockStartEvent-subclas.patch
new file mode 100644
index 0000000000..42480ac263
--- /dev/null
+++ b/patches/api/Fix-HandlerList-for-InventoryBlockStartEvent-subclas.patch
@@ -0,0 +1,93 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <jake.m.potrebic@gmail.com>
+Date: Tue, 7 Feb 2023 08:20:27 -0800
+Subject: [PATCH] Fix HandlerList for InventoryBlockStartEvent subclasses
+
+
+diff --git a/src/main/java/org/bukkit/event/block/BrewingStartEvent.java b/src/main/java/org/bukkit/event/block/BrewingStartEvent.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/event/block/BrewingStartEvent.java
++++ b/src/main/java/org/bukkit/event/block/BrewingStartEvent.java
+@@ -0,0 +0,0 @@ import org.jetbrains.annotations.NotNull;
+  */
+ public class BrewingStartEvent extends InventoryBlockStartEvent {
+ 
+-    private static final HandlerList handlers = new HandlerList();
++    // Paper - remove HandlerList
+     private int brewingTime;
+ 
+     public BrewingStartEvent(@NotNull final Block furnace, @NotNull ItemStack source, int brewingTime) {
+@@ -0,0 +0,0 @@ public class BrewingStartEvent extends InventoryBlockStartEvent {
+         this.brewingTime = brewTime;
+     }
+ 
+-    @NotNull
+-    @Override
+-    public HandlerList getHandlers() {
+-        return handlers;
+-    }
+-
+-    @NotNull
+-    public static HandlerList getHandlerList() {
+-        return handlers;
+-    }
++    // Paper - remove HandlerList
+ }
+diff --git a/src/main/java/org/bukkit/event/block/CampfireStartEvent.java b/src/main/java/org/bukkit/event/block/CampfireStartEvent.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/event/block/CampfireStartEvent.java
++++ b/src/main/java/org/bukkit/event/block/CampfireStartEvent.java
+@@ -0,0 +0,0 @@ import org.jetbrains.annotations.NotNull;
+  */
+ public class CampfireStartEvent extends InventoryBlockStartEvent {
+ 
+-    private static final HandlerList handlers = new HandlerList();
++    // Paper - remove HandlerList
+     private int cookingTime;
+     private CampfireRecipe campfireRecipe;
+ 
+@@ -0,0 +0,0 @@ public class CampfireStartEvent extends InventoryBlockStartEvent {
+         this.cookingTime = cookTime;
+     }
+ 
+-    @NotNull
+-    @Override
+-    public HandlerList getHandlers() {
+-        return handlers;
+-    }
+-
+-    @NotNull
+-    public static HandlerList getHandlerList() {
+-        return handlers;
+-    }
++    // Paper - remove HandlerList
+ }
+diff --git a/src/main/java/org/bukkit/event/inventory/FurnaceStartSmeltEvent.java b/src/main/java/org/bukkit/event/inventory/FurnaceStartSmeltEvent.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/event/inventory/FurnaceStartSmeltEvent.java
++++ b/src/main/java/org/bukkit/event/inventory/FurnaceStartSmeltEvent.java
+@@ -0,0 +0,0 @@ import org.jetbrains.annotations.NotNull;
+  * Called when a Furnace starts smelting.
+  */
+ public class FurnaceStartSmeltEvent extends InventoryBlockStartEvent {
+-    private static final HandlerList handlers = new HandlerList();
++    // Paper - remove HandlerList
+     private final CookingRecipe<?> recipe;
+     private int totalCookTime;
+ 
+@@ -0,0 +0,0 @@ public class FurnaceStartSmeltEvent extends InventoryBlockStartEvent {
+         this.totalCookTime = cookTime;
+     }
+ 
+-    @NotNull
+-    @Override
+-    public HandlerList getHandlers() {
+-        return handlers;
+-    }
+-
+-    @NotNull
+-    public static HandlerList getHandlerList() {
+-        return handlers;
+-    }
++    // Paper - remove HandlerList
+ }
diff --git a/patches/api/Fix-Spigot-annotation-mistakes.patch b/patches/api/Fix-Spigot-annotation-mistakes.patch
index 0c4ad19f14..bd4fedd28d 100644
--- a/patches/api/Fix-Spigot-annotation-mistakes.patch
+++ b/patches/api/Fix-Spigot-annotation-mistakes.patch
@@ -82,7 +82,7 @@ diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/M
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/Material.java
 +++ b/src/main/java/org/bukkit/Material.java
-@@ -0,0 +0,0 @@ public enum Material implements Keyed {
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable {
      }
  
      /**
@@ -96,7 +96,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public boolean isLegacy() {
          return legacy;
      }
-@@ -0,0 +0,0 @@ public enum Material implements Keyed {
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable {
       * Gets the MaterialData class associated with this Material
       *
       * @return MaterialData associated with this Material
@@ -144,6 +144,22 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  public enum NetherWartsState {
  
      /**
+diff --git a/src/main/java/org/bukkit/Registry.java b/src/main/java/org/bukkit/Registry.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/Registry.java
++++ b/src/main/java/org/bukkit/Registry.java
+@@ -0,0 +0,0 @@ public interface Registry<T extends Keyed> extends Iterable<T> {
+      *
+      * @param input non-null input
+      * @return registered object or null if does not exist
++     * @deprecated this method's behavior is broken and not useful. If you want to get an object
++     * based on its vanilla name, or a key, wrap it in a {@link NamespacedKey} object and use {@link #get(NamespacedKey)}
+      */
+     @Nullable
++    @Deprecated(forRemoval = true) // Paper
+     default T match(@NotNull String input) {
+         Preconditions.checkArgument(input != null, "input must not be null");
+ 
 diff --git a/src/main/java/org/bukkit/SandstoneType.java b/src/main/java/org/bukkit/SandstoneType.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/SandstoneType.java
@@ -674,15 +690,15 @@ diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/o
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/inventory/ItemStack.java
 +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
-@@ -0,0 +0,0 @@ import java.util.List; // Paper
- import java.util.Map;
+@@ -0,0 +0,0 @@ import java.util.Map;
  import org.bukkit.Bukkit;
  import org.bukkit.Material;
+ import org.bukkit.Translatable;
 +import org.bukkit.UndefinedNullability;
  import org.bukkit.Utility;
  import org.bukkit.configuration.serialization.ConfigurationSerializable;
  import org.bukkit.enchantments.Enchantment;
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
       * @param damage durability / damage
       * @deprecated see {@link #setDurability(short)}
       */
@@ -690,7 +706,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public ItemStack(@NotNull final Material type, final int amount, final short damage) {
          this(type, amount, damage, null);
      }
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
       * Gets the MaterialData for this stack of items
       *
       * @return MaterialData for this item
@@ -701,7 +717,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public MaterialData getData() {
          Material mat = Bukkit.getUnsafe().toLegacy(getType());
          if (data == null && mat != null && mat.getData() != null) {
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
       * Sets the MaterialData for this stack of items
       *
       * @param data New MaterialData for this item
@@ -711,7 +727,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public void setData(@Nullable MaterialData data) {
          if (data == null) {
              this.data = data;
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
       *
       * @return a copy of the current ItemStack's ItemData
       */
diff --git a/patches/api/Get-entity-default-attributes.patch b/patches/api/Get-entity-default-attributes.patch
index a3875ab580..c963c456b3 100644
--- a/patches/api/Get-entity-default-attributes.patch
+++ b/patches/api/Get-entity-default-attributes.patch
@@ -35,7 +35,7 @@ diff --git a/src/main/java/org/bukkit/entity/EntityType.java b/src/main/java/org
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/entity/EntityType.java
 +++ b/src/main/java/org/bukkit/entity/EntityType.java
-@@ -0,0 +0,0 @@ public enum EntityType implements Keyed, net.kyori.adventure.translation.Transla
+@@ -0,0 +0,0 @@ public enum EntityType implements Keyed, Translatable, net.kyori.adventure.trans
          Preconditions.checkArgument(this != UNKNOWN, "UNKNOWN entities do not have translation keys");
          return org.bukkit.Bukkit.getUnsafe().getTranslationKey(this);
      }
diff --git a/patches/api/Implement-furnace-cook-speed-multiplier-API.patch b/patches/api/Implement-furnace-cook-speed-multiplier-API.patch
index 7504ded4b0..2fdab13daa 100644
--- a/patches/api/Implement-furnace-cook-speed-multiplier-API.patch
+++ b/patches/api/Implement-furnace-cook-speed-multiplier-API.patch
@@ -40,20 +40,19 @@ diff --git a/src/main/java/org/bukkit/event/inventory/FurnaceStartSmeltEvent.jav
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/event/inventory/FurnaceStartSmeltEvent.java
 +++ b/src/main/java/org/bukkit/event/inventory/FurnaceStartSmeltEvent.java
-@@ -0,0 +0,0 @@ public class FurnaceStartSmeltEvent extends BlockEvent {
+@@ -0,0 +0,0 @@ public class FurnaceStartSmeltEvent extends InventoryBlockStartEvent {
      private final CookingRecipe<?> recipe;
      private int totalCookTime;
  
 +    @Deprecated // Paper - furnace cook speed multiplier
      public FurnaceStartSmeltEvent(@NotNull final Block furnace, @NotNull ItemStack source, @NotNull final CookingRecipe<?> recipe) {
-+        // Paper start - furnace cook speed multiplier
++        // Paper start
 +        this(furnace, source, recipe, recipe.getCookingTime());
 +    }
 +
-+    public FurnaceStartSmeltEvent(@NotNull final Block furnace, @NotNull ItemStack source, @NotNull CookingRecipe<?> recipe, int cookingTime) {
++    public FurnaceStartSmeltEvent(final @NotNull Block furnace, final @NotNull ItemStack source, final @NotNull CookingRecipe<?> recipe, final int cookingTime) {
 +        // Paper end
-         super(furnace);
-         this.source = source;
+         super(furnace, source);
          this.recipe = recipe;
 -        this.totalCookTime = recipe.getCookingTime();
 +        this.totalCookTime = cookingTime; // Paper - furnace cook speed multiplier
diff --git a/patches/api/Improve-Block-breakNaturally-API.patch b/patches/api/Improve-Block-breakNaturally-API.patch
index 0890fbef19..02e283945e 100644
--- a/patches/api/Improve-Block-breakNaturally-API.patch
+++ b/patches/api/Improve-Block-breakNaturally-API.patch
@@ -13,7 +13,7 @@ diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukki
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/block/Block.java
 +++ b/src/main/java/org/bukkit/block/Block.java
-@@ -0,0 +0,0 @@ public interface Block extends Metadatable {
+@@ -0,0 +0,0 @@ public interface Block extends Metadatable, Translatable {
       */
      boolean breakNaturally(@Nullable ItemStack tool);
  
diff --git a/patches/api/Item-Rarity-API.patch b/patches/api/Item-Rarity-API.patch
index 808d3aa2c0..98d37aa6b4 100644
--- a/patches/api/Item-Rarity-API.patch
+++ b/patches/api/Item-Rarity-API.patch
@@ -42,9 +42,9 @@ diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/M
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/Material.java
 +++ b/src/main/java/org/bukkit/Material.java
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
-     public @NotNull String translationKey() {
-         return Bukkit.getUnsafe().getTranslationKey(this);
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
+             return Bukkit.getUnsafe().getBlockTranslationKey(this);
+         }
      }
 +
 +    /**
@@ -91,7 +91,7 @@ diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/o
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/inventory/ItemStack.java
 +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
      public @NotNull String translationKey() {
          return Bukkit.getUnsafe().getTranslationKey(this);
      }
diff --git a/patches/api/ItemStack-API-additions-for-quantity-flags-lore.patch b/patches/api/ItemStack-API-additions-for-quantity-flags-lore.patch
index be753a01bf..0d3bfd4277 100644
--- a/patches/api/ItemStack-API-additions-for-quantity-flags-lore.patch
+++ b/patches/api/ItemStack-API-additions-for-quantity-flags-lore.patch
@@ -16,7 +16,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  import java.util.Map;
  import org.bukkit.Bukkit;
  import org.bukkit.Material;
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
          // Requires access to NMS
          return ensureServerConversions().getMaxItemUseDuration();
      }
diff --git a/patches/api/ItemStack-damage-API.patch b/patches/api/ItemStack-damage-API.patch
index 5c5643c265..c69417f0ca 100644
--- a/patches/api/ItemStack-damage-API.patch
+++ b/patches/api/ItemStack-damage-API.patch
@@ -64,7 +64,7 @@ diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/o
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/inventory/ItemStack.java
 +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
      public boolean canRepair(@NotNull ItemStack toBeRepaired) {
          return Bukkit.getUnsafe().isValidRepairItemStack(toBeRepaired, this);
      }
diff --git a/patches/api/ItemStack-editMeta.patch b/patches/api/ItemStack-editMeta.patch
index 392bcab303..03534bc53e 100644
--- a/patches/api/ItemStack-editMeta.patch
+++ b/patches/api/ItemStack-editMeta.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/o
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/inventory/ItemStack.java
 +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
          return result.ensureServerConversions(); // Paper
      }
  
diff --git a/patches/api/ItemStack-getMaxItemUseDuration.patch b/patches/api/ItemStack-getMaxItemUseDuration.patch
index 361192d6cd..49d8c076a3 100644
--- a/patches/api/ItemStack-getMaxItemUseDuration.patch
+++ b/patches/api/ItemStack-getMaxItemUseDuration.patch
@@ -9,7 +9,7 @@ diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/o
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/inventory/ItemStack.java
 +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
      public String getI18NDisplayName() {
          return Bukkit.getServer().getItemFactory().getI18NDisplayName(this);
      }
diff --git a/patches/api/ItemStack-repair-check-API.patch b/patches/api/ItemStack-repair-check-API.patch
index 3251a10bcb..476c675975 100644
--- a/patches/api/ItemStack-repair-check-API.patch
+++ b/patches/api/ItemStack-repair-check-API.patch
@@ -29,7 +29,7 @@ diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/o
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/inventory/ItemStack.java
 +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
      public io.papermc.paper.inventory.ItemRarity getRarity() {
          return Bukkit.getUnsafe().getItemStackRarity(this);
      }
diff --git a/patches/api/Mark-experimental-api-as-such.patch b/patches/api/Mark-experimental-api-as-such.patch
index 95ef207798..f9f5871cac 100644
--- a/patches/api/Mark-experimental-api-as-such.patch
+++ b/patches/api/Mark-experimental-api-as-such.patch
@@ -8,7 +8,7 @@ diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/M
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/Material.java
 +++ b/src/main/java/org/bukkit/Material.java
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      ACACIA_PLANKS(31312),
      DARK_OAK_PLANKS(20869),
      MANGROVE_PLANKS(7078),
@@ -20,7 +20,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_MOSAIC(10715),
      /**
       * BlockData: {@link Sapling}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Orientable}
       */
@@ -28,7 +28,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_BLOCK(20770, Orientable.class),
      /**
       * BlockData: {@link Orientable}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Orientable}
       */
@@ -36,7 +36,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      STRIPPED_BAMBOO_BLOCK(14799, Orientable.class),
      /**
       * BlockData: {@link Orientable}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Slab}
       */
@@ -49,7 +49,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_MOSAIC_SLAB(22118, Slab.class),
      /**
       * BlockData: {@link Slab}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link ChiseledBookshelf}
       */
@@ -57,7 +57,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      CHISELED_BOOKSHELF(8099, ChiseledBookshelf.class),
      MOSSY_COBBLESTONE(21900),
      OBSIDIAN(32723),
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Fence}
       */
@@ -65,7 +65,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_FENCE(17207, Fence.class),
      /**
       * BlockData: {@link Fence}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Stairs}
       */
@@ -78,7 +78,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_MOSAIC_STAIRS(20977, Stairs.class),
      /**
       * BlockData: {@link Stairs}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Switch}
       */
@@ -86,7 +86,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_BUTTON(21810, Switch.class),
      /**
       * BlockData: {@link Switch}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Powerable}
       */
@@ -94,7 +94,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_PRESSURE_PLATE(26740, Powerable.class),
      /**
       * BlockData: {@link Powerable}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Door}
       */
@@ -102,7 +102,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_DOOR(19971, Door.class),
      /**
       * BlockData: {@link Door}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link TrapDoor}
       */
@@ -110,7 +110,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_TRAPDOOR(9174, TrapDoor.class),
      /**
       * BlockData: {@link TrapDoor}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Gate}
       */
@@ -118,7 +118,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_FENCE_GATE(14290, Gate.class),
      /**
       * BlockData: {@link Gate}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      DARK_OAK_CHEST_BOAT(8733, 1),
      MANGROVE_BOAT(20792, 1),
      MANGROVE_CHEST_BOAT(18572, 1),
@@ -128,7 +128,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_CHEST_RAFT(20056, 1),
      /**
       * BlockData: {@link StructureBlock}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Sign}
       */
@@ -136,7 +136,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_SIGN(26139, 16, Sign.class),
      /**
       * BlockData: {@link Sign}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link HangingSign}
       */
@@ -189,7 +189,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      WARPED_HANGING_SIGN(8195, 16, HangingSign.class),
      BUCKET(15215, 16),
      WATER_BUCKET(8802, 1),
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      EGG(21603, 16),
      COMPASS(24139),
      RECOVERY_COMPASS(12710),
@@ -197,7 +197,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BUNDLE(16835, 1),
      FISHING_ROD(4167, 1, 64),
      CLOCK(14980),
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      BEE_SPAWN_EGG(22924),
      BLAZE_SPAWN_EGG(4759),
      CAT_SPAWN_EGG(29583),
@@ -205,7 +205,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      CAMEL_SPAWN_EGG(14760),
      CAVE_SPIDER_SPAWN_EGG(23341),
      CHICKEN_SPAWN_EGG(5462),
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Rotatable}
       */
@@ -213,7 +213,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      PIGLIN_HEAD(5512, Rotatable.class),
      NETHER_STAR(12469),
      PUMPKIN_PIE(28725),
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link WallSign}
       */
@@ -271,7 +271,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      BAMBOO_WALL_HANGING_SIGN(6669, WallHangingSign.class),
      /**
       * BlockData: {@link RedstoneWallTorch}
-@@ -0,0 +0,0 @@ public enum Material implements Keyed, net.kyori.adventure.translation.Translata
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
      /**
       * BlockData: {@link Directional}
       */
@@ -430,7 +430,7 @@ diff --git a/src/main/java/org/bukkit/entity/EntityType.java b/src/main/java/org
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/entity/EntityType.java
 +++ b/src/main/java/org/bukkit/entity/EntityType.java
-@@ -0,0 +0,0 @@ public enum EntityType implements Keyed, net.kyori.adventure.translation.Transla
+@@ -0,0 +0,0 @@ public enum EntityType implements Keyed, Translatable, net.kyori.adventure.trans
      FROG("frog", Frog.class, -1),
      TADPOLE("tadpole", Tadpole.class, -1),
      WARDEN("warden", Warden.class, -1),
diff --git a/patches/api/Material-API-additions.patch b/patches/api/Material-API-additions.patch
index 30f9e1562e..6e56683c2f 100644
--- a/patches/api/Material-API-additions.patch
+++ b/patches/api/Material-API-additions.patch
@@ -13,10 +13,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
   * An enum of all material IDs accepted by the official server and client
   */
 +@SuppressWarnings({"DeprecatedIsStillUsed", "deprecation"}) // Paper
- public enum Material implements Keyed {
+ public enum Material implements Keyed, Translatable {
      //<editor-fold desc="Materials" defaultstate="collapsed">
      AIR(9648, 0),
-@@ -0,0 +0,0 @@ public enum Material implements Keyed {
+@@ -0,0 +0,0 @@ public enum Material implements Keyed, Translatable {
          }
      }
  
diff --git a/patches/api/Timings-v2.patch b/patches/api/Timings-v2.patch
index 957431f78d..ae392c11ef 100644
--- a/patches/api/Timings-v2.patch
+++ b/patches/api/Timings-v2.patch
@@ -2846,9 +2846,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
  
      Material fromLegacy(Material material);
 @@ -0,0 +0,0 @@ public interface UnsafeValues {
-     Multimap<Attribute, AttributeModifier> getDefaultAttributeModifiers(Material material, EquipmentSlot slot);
+     String getTranslationKey(EntityType entityType);
  
-     CreativeCategory getCreativeCategory(Material material);
+     String getTranslationKey(ItemStack itemStack);
 +
 +    // Paper start
 +    /**
diff --git a/patches/api/ensureServerConversions-API.patch b/patches/api/ensureServerConversions-API.patch
index 6a9cb2dae9..43440407a7 100644
--- a/patches/api/ensureServerConversions-API.patch
+++ b/patches/api/ensureServerConversions-API.patch
@@ -32,7 +32,7 @@ diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/o
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/org/bukkit/inventory/ItemStack.java
 +++ b/src/main/java/org/bukkit/inventory/ItemStack.java
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
              }
          }
  
@@ -41,7 +41,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      }
  
      /**
-@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+@@ -0,0 +0,0 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat
          return Bukkit.getServer().getItemFactory().displayName(this);
      }
  
diff --git a/patches/server/Add-Destroy-Speed-API.patch b/patches/server/Add-Destroy-Speed-API.patch
index 4c604c09f5..5fbd0c3048 100644
--- a/patches/server/Add-Destroy-Speed-API.patch
+++ b/patches/server/Add-Destroy-Speed-API.patch
@@ -11,7 +11,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
 @@ -0,0 +0,0 @@ public class CraftBlock implements Block {
      public String translationKey() {
-         return org.bukkit.Bukkit.getUnsafe().getTranslationKey(this);
+         return this.getNMS().getBlock().getDescriptionId();
      }
 +
 +    @Override
diff --git a/patches/server/Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch b/patches/server/Add-getDrops-to-BlockState.patch
similarity index 66%
rename from patches/server/Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch
rename to patches/server/Add-getDrops-to-BlockState.patch
index ff0603f575..a7d8c4fba6 100644
--- a/patches/server/Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch
+++ b/patches/server/Add-getDrops-to-BlockState.patch
@@ -1,8 +1,10 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: MelnCat <melncatuwu@gmail.com>
 Date: Fri, 12 Aug 2022 23:24:37 -0700
-Subject: [PATCH] Add getDrops to BlockState and isPreferredTool to BlockData
+Subject: [PATCH] Add getDrops to BlockState
 
+Originally added isPreferredTool to BlockData but
+upstream added that.
 
 diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
@@ -42,20 +44,3 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
      // Paper end
  }
-diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
-+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
-@@ -0,0 +0,0 @@ public class CraftBlockData implements BlockData {
-         return this.state.isRandomlyTicking();
-     }
-     // Paper end
-+
-+    // Paper start - Preferred tool API
-+    @Override
-+    public boolean isPreferredTool(org.bukkit.inventory.ItemStack item) {
-+        net.minecraft.world.item.ItemStack nms = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(item);
-+        return !state.requiresCorrectToolForDrops() || nms.isCorrectToolForDrops(state);
-+    }
-+    // Paper end
- }
diff --git a/patches/server/Add-methods-to-get-translation-keys.patch b/patches/server/Add-methods-to-get-translation-keys.patch
index 0f08d052bf..af5ce07fe4 100644
--- a/patches/server/Add-methods-to-get-translation-keys.patch
+++ b/patches/server/Add-methods-to-get-translation-keys.patch
@@ -19,13 +19,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      }
 +
 +    @Override
-+    public String getTranslationKey() {
-+        return this.translationKey();
-+    }
-+
-+    @Override
 +    public String translationKey() {
-+        return org.bukkit.Bukkit.getUnsafe().getTranslationKey(this);
++        return this.getNMS().getBlock().getDescriptionId();
 +    }
      // Paper end
  }
@@ -45,41 +40,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      // Paper end
  
      public net.minecraft.world.item.enchantment.Enchantment getHandle() {
-diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-@@ -0,0 +0,0 @@ public final class CraftMagicNumbers implements UnsafeValues {
-         Preconditions.checkArgument(dataVersion <= getDataVersion(), "Newer version! Server downgrades are not supported!");
-         return compound;
-     }
-+
-+    @Override
-+    public String getTranslationKey(Material mat) {
-+        if (mat.isBlock()) {
-+            return getBlock(mat).getDescriptionId();
-+        }
-+        return getItem(mat).getDescriptionId();
-+    }
-+
-+    @Override
-+    public String getTranslationKey(org.bukkit.block.Block block) {
-+        return ((org.bukkit.craftbukkit.block.CraftBlock)block).getNMS().getBlock().getDescriptionId();
-+    }
-+
-+    @Override
-+    public String getTranslationKey(org.bukkit.entity.EntityType type) {
-+        return net.minecraft.world.entity.EntityType.byString(type.getName()).map(net.minecraft.world.entity.EntityType::getDescriptionId).orElse(null);
-+    }
-+
-+    @Override
-+    public String getTranslationKey(org.bukkit.inventory.ItemStack itemStack) {
-+        net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack);
-+        return nmsItemStack.getItem().getDescriptionId(nmsItemStack);
-+    }
-     // Paper end
- 
-     /**
 diff --git a/src/test/java/io/papermc/paper/world/TranslationKeyTest.java b/src/test/java/io/papermc/paper/world/TranslationKeyTest.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/test/java/io/papermc/paper/world/TranslationKeyTest.java
diff --git a/patches/server/Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch b/patches/server/Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch
index d88dd58a85..6af5bde1f6 100644
--- a/patches/server/Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch
+++ b/patches/server/Expose-the-Entity-Counter-to-allow-plugins-to-use-va.patch
@@ -25,10 +25,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
 +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
 @@ -0,0 +0,0 @@ public final class CraftMagicNumbers implements UnsafeValues {
-         net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack);
-         return nmsItemStack.getItem().getDescriptionId(nmsItemStack);
+         Preconditions.checkArgument(dataVersion <= getDataVersion(), "Newer version! Server downgrades are not supported!");
+         return compound;
      }
 +
++    @Override
 +    public int nextEntityId() {
 +        return net.minecraft.world.entity.Entity.nextEntityId();
 +    }
diff --git a/patches/server/Fix-Fluid-tags-isTagged-method.patch b/patches/server/Fix-Fluid-tags-isTagged-method.patch
deleted file mode 100644
index 00ef77f8b6..0000000000
--- a/patches/server/Fix-Fluid-tags-isTagged-method.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic <jake.m.potrebic@gmail.com>
-Date: Tue, 1 Mar 2022 12:45:50 -0800
-Subject: [PATCH] Fix Fluid tags isTagged method
-
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java b/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java
-+++ b/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java
-@@ -0,0 +0,0 @@ public class CraftFluidTag extends CraftTag<net.minecraft.world.level.material.F
- 
-     @Override
-     public boolean isTagged(Fluid fluid) {
--        return CraftMagicNumbers.getFluid(fluid).is(tag);
-+        return registry.getHolderOrThrow(net.minecraft.resources.ResourceKey.create(net.minecraft.core.Registry.FLUID_REGISTRY, org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(fluid.getKey()))).is(tag); // Paper
-     }
- 
-     @Override
-diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-@@ -0,0 +0,0 @@ public final class CraftMagicNumbers implements UnsafeValues {
-         return CraftMagicNumbers.MATERIAL_BLOCK.get(material);
-     }
- 
--    public static net.minecraft.world.level.material.Fluid getFluid(Fluid fluid) {
-+    public static net.minecraft.world.level.material.Fluid getFluid(Material fluid) { // Paper - wrong type
-         return CraftMagicNumbers.MATERIAL_FLUID.get(fluid);
-     }
- 
diff --git a/patches/server/Implement-CraftBlockSoundGroup.patch b/patches/server/Implement-CraftBlockSoundGroup.patch
index b85eb56ebf..4a48e1c37a 100644
--- a/patches/server/Implement-CraftBlockSoundGroup.patch
+++ b/patches/server/Implement-CraftBlockSoundGroup.patch
@@ -54,8 +54,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
 +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
 @@ -0,0 +0,0 @@ public class CraftBlock implements Block {
- 
-         return iblockdata.canSurvive(world, this.position);
+     public String getTranslationKey() {
+         return this.getNMS().getBlock().getDescriptionId();
      }
 +
 +    // Paper start
diff --git a/patches/server/MC-Utils.patch b/patches/server/MC-Utils.patch
index e79b1d370b..960ab1be08 100644
--- a/patches/server/MC-Utils.patch
+++ b/patches/server/MC-Utils.patch
@@ -7622,9 +7622,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
 +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
 @@ -0,0 +0,0 @@ public final class CraftMagicNumbers implements UnsafeValues {
+     private static final BiMap<net.minecraft.world.level.material.Fluid, Fluid> FLUIDTYPE_FLUID = HashBiMap.create();
      private static final Map<Material, Item> MATERIAL_ITEM = new HashMap<>();
      private static final Map<Material, Block> MATERIAL_BLOCK = new HashMap<>();
-     private static final Map<Material, net.minecraft.world.level.material.Fluid> MATERIAL_FLUID = new HashMap<>();
 +    // Paper start
 +    private static final Map<org.bukkit.entity.EntityType, net.minecraft.world.entity.EntityType<?>> ENTITY_TYPE_ENTITY_TYPES = new HashMap<>();
 +    private static final Map<net.minecraft.world.entity.EntityType<?>, org.bukkit.entity.EntityType> ENTITY_TYPES_ENTITY_TYPE = new HashMap<>();
diff --git a/patches/server/Timings-v2.patch b/patches/server/Timings-v2.patch
index be1ca002de..f1aa454792 100644
--- a/patches/server/Timings-v2.patch
+++ b/patches/server/Timings-v2.patch
@@ -2038,7 +2038,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
      public static byte toLegacyData(BlockState data) {
          return CraftLegacy.toLegacyData(data);
 @@ -0,0 +0,0 @@ public final class CraftMagicNumbers implements UnsafeValues {
-         return CreativeCategory.BUILDING_BLOCKS; // TODO: Figure out what to do with this
+         return nmsItemStack.getItem().getDescriptionId(nmsItemStack);
      }
  
 +    // Paper start
diff --git a/patches/server/cache-resource-keys.patch b/patches/server/cache-resource-keys.patch
index 21d3326d95..fa1667d845 100644
--- a/patches/server/cache-resource-keys.patch
+++ b/patches/server/cache-resource-keys.patch
@@ -38,20 +38,4 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        return registry.getHolderOrThrow(KEY_CACHE.computeIfAbsent(entity, type -> ResourceKey.create(Registries.ENTITY_TYPE, CraftNamespacedKey.toMinecraft(type.getKey())))).is(tag); // Paper - cache key
      }
  
-     @Override
-diff --git a/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java b/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java
-+++ b/src/main/java/org/bukkit/craftbukkit/tag/CraftFluidTag.java
-@@ -0,0 +0,0 @@ public class CraftFluidTag extends CraftTag<net.minecraft.world.level.material.F
-         super(registry, tag);
-     }
- 
-+    private static final java.util.Map<Fluid, net.minecraft.resources.ResourceKey<net.minecraft.world.level.material.Fluid>> KEY_CACHE = Collections.synchronizedMap(new java.util.EnumMap<>(Fluid.class)); // Paper
-     @Override
-     public boolean isTagged(Fluid fluid) {
--        return registry.getHolderOrThrow(net.minecraft.resources.ResourceKey.create(net.minecraft.core.Registry.FLUID_REGISTRY, org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(fluid.getKey()))).is(tag); // Paper
-+        return registry.getHolderOrThrow(KEY_CACHE.computeIfAbsent(fluid, f -> net.minecraft.resources.ResourceKey.create(net.minecraft.core.registries.Registries.FLUID, org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(f.getKey())))).is(tag); // Paper - cache key
-     }
- 
      @Override
diff --git a/work/Bukkit b/work/Bukkit
index 22f8c20898..37262de84b 160000
--- a/work/Bukkit
+++ b/work/Bukkit
@@ -1 +1 @@
-Subproject commit 22f8c20898698bdd5fe348404a49d0cad36fef0b
+Subproject commit 37262de84b9613e61809f31691e6f9db48dce0a8
diff --git a/work/CraftBukkit b/work/CraftBukkit
index 39462a8985..a50301aa51 160000
--- a/work/CraftBukkit
+++ b/work/CraftBukkit
@@ -1 +1 @@
-Subproject commit 39462a898595280d1a1c6197c2ad66082434ba80
+Subproject commit a50301aa51aab7aa25869d921fa0c6a65eeda547