diff --git a/api/.flattened-pom.xml b/api/.flattened-pom.xml
index 248948b60390775798196e415de01941c07a8bc2..611020c9007d795e105d27e57c8916b0baeb6f29 100644
--- a/api/.flattened-pom.xml
+++ b/api/.flattened-pom.xml
@@ -3,25 +3,31 @@
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <modelVersion>4.0.0</modelVersion>
   <groupId>io.lumine</groupId>
-  <artifactId>MCCosmetics-API</artifactId>
-  <version>0.11.0</version>
+  <artifactId>MythicCosmetics-API</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
   <dependencies>
+    <dependency>
+      <groupId>io.lumine</groupId>
+      <artifactId>Mythic-Dist</artifactId>
+      <version>5.8.0-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
     <dependency>
       <groupId>io.lumine</groupId>
       <artifactId>LumineUtils</artifactId>
-      <version>1.19-SNAPSHOT</version>
+      <version>1.20-SNAPSHOT</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
-      <version>1.18.22</version>
+      <version>1.18.32</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>io.papermc.paper</groupId>
       <artifactId>paper-api</artifactId>
-      <version>1.20.1-R0.1-SNAPSHOT</version>
+      <version>1.21.3-R0.1-SNAPSHOT</version>
       <scope>provided</scope>
     </dependency>
   </dependencies>
diff --git a/api/pom.xml b/api/pom.xml
index 3bef2a4e162fe8996e048ae296477d0b6c5f3ae0..f7b2d4e4e89677e154f74062b2ab63872a4c10b3 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -1,11 +1,11 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     
-    <name>MCCosmetics-API</name>
-    <artifactId>MCCosmetics-API</artifactId>
+    <name>MythicCosmetics-API</name>
+    <artifactId>MythicCosmetics-API</artifactId>
     <parent>
         <groupId>io.lumine</groupId>
-        <artifactId>MCCosmetics-Plugin</artifactId>
+        <artifactId>MythicCosmetics-Plugin</artifactId>
         <version>${mccosmetics.version}</version>
     </parent>  
     
@@ -69,11 +69,17 @@
 
     <dependencies>
         <!-- Main dependencies -->
+        <dependency>
+            <groupId>io.lumine</groupId>
+            <artifactId>Mythic-Dist</artifactId>
+            <version>${mythic.version}</version>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>io.lumine</groupId>
             <artifactId>LumineUtils</artifactId>
             <version>${lumineutils.version}</version>
-            <scope>provided</scope> 
+            <scope>provided</scope>
         </dependency>
         <dependency> 
             <groupId>org.projectlombok</groupId>
diff --git a/api/src/main/java/io/lumine/cosmetics/api/cosmetics/Cosmetic.java b/api/src/main/java/io/lumine/cosmetics/api/cosmetics/Cosmetic.java
index 951c72c0ff4904376dce761aa5bb65af8a59f2ac..ec4f17f127b628a1812e956ebcc7f7f2761e14f3 100644
--- a/api/src/main/java/io/lumine/cosmetics/api/cosmetics/Cosmetic.java
+++ b/api/src/main/java/io/lumine/cosmetics/api/cosmetics/Cosmetic.java
@@ -4,8 +4,8 @@ import java.util.Optional;
 
 import io.lumine.cosmetics.api.cosmetics.manager.CosmeticManager;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
-import io.lumine.utils.config.properties.PropertyHolder;
-import io.lumine.utils.menu.MenuData;
+import io.lumine.mythic.bukkit.utils.config.properties.PropertyHolder;
+import io.lumine.mythic.bukkit.utils.menu.MenuData;
 import lombok.Getter;
 
 public abstract class Cosmetic implements PropertyHolder,MenuData<CosmeticProfile> {
diff --git a/api/src/main/java/io/lumine/cosmetics/api/cosmetics/CosmeticVariant.java b/api/src/main/java/io/lumine/cosmetics/api/cosmetics/CosmeticVariant.java
index e060d4da828ea31e5d3ef4950e1d638005d50d32..ca619394261ad5f3debfd589908898c6f9fda072 100644
--- a/api/src/main/java/io/lumine/cosmetics/api/cosmetics/CosmeticVariant.java
+++ b/api/src/main/java/io/lumine/cosmetics/api/cosmetics/CosmeticVariant.java
@@ -2,8 +2,8 @@ package io.lumine.cosmetics.api.cosmetics;
 
 import io.lumine.cosmetics.api.cosmetics.manager.CosmeticManager;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
-import io.lumine.utils.config.properties.PropertyHolder;
-import io.lumine.utils.menu.MenuData;
+import io.lumine.mythic.bukkit.utils.config.properties.PropertyHolder;
+import io.lumine.mythic.bukkit.utils.menu.MenuData;
 import lombok.Getter;
 
 public abstract class CosmeticVariant implements PropertyHolder,MenuData<CosmeticProfile> {
diff --git a/api/src/main/java/io/lumine/cosmetics/api/cosmetics/EquippedCosmetic.java b/api/src/main/java/io/lumine/cosmetics/api/cosmetics/EquippedCosmetic.java
index 5575e5c5721aa04fbb15d3cba5adf3a6020f60fb..29960b12817000551d3d0bb6badac908e52e2165 100644
--- a/api/src/main/java/io/lumine/cosmetics/api/cosmetics/EquippedCosmetic.java
+++ b/api/src/main/java/io/lumine/cosmetics/api/cosmetics/EquippedCosmetic.java
@@ -1,6 +1,6 @@
 package io.lumine.cosmetics.api.cosmetics;
 
-import io.lumine.utils.serialize.Chroma;
+import io.lumine.mythic.bukkit.utils.serialize.Chroma;
 import lombok.Data;
 
 @Data
diff --git a/api/src/main/java/io/lumine/cosmetics/api/players/CosmeticProfile.java b/api/src/main/java/io/lumine/cosmetics/api/players/CosmeticProfile.java
index 1013a0e102f10616a37794b3e8a6f044db6999b4..9468c33c76382bd220e0eac8c0f41753f60bcccc 100644
--- a/api/src/main/java/io/lumine/cosmetics/api/players/CosmeticProfile.java
+++ b/api/src/main/java/io/lumine/cosmetics/api/players/CosmeticProfile.java
@@ -3,8 +3,7 @@ package io.lumine.cosmetics.api.players;
 import io.lumine.cosmetics.api.cosmetics.Cosmetic;
 import io.lumine.cosmetics.api.cosmetics.CosmeticVariant;
 import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
-import io.lumine.utils.serialize.Chroma;
-
+import io.lumine.mythic.bukkit.utils.serialize.Chroma;
 import org.bukkit.entity.Player;
 
 import java.util.Optional;
diff --git a/dist-premium/pom.xml b/dist-premium/pom.xml
index d0142fc8418f7a166ed44a4ef2b3a6023d9d4763..558b65a5dcbbdb2970ccb24e815210cc9d3cabad 100644
--- a/dist-premium/pom.xml
+++ b/dist-premium/pom.xml
@@ -1,10 +1,10 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>MCCosmetics-Premium</artifactId>
+    <artifactId>MythicCosmetics-Premium</artifactId>
     <parent>
         <groupId>io.lumine</groupId>
-        <artifactId>MCCosmetics-Plugin</artifactId>
+        <artifactId>MythicCosmetics-Plugin</artifactId>
         <version>${mccosmetics.version}</version>
     </parent>  
  
@@ -17,7 +17,7 @@
     <dependencies>
         <dependency>
             <groupId>io.lumine</groupId>
-            <artifactId>MCCosmetics-Dist</artifactId>
+            <artifactId>MythicCosmetics-Dist</artifactId>
             <version>${mccosmetics.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
@@ -30,7 +30,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.5.3</version>
                 <executions>
                     <execution>
                         <phase>package</phase>
@@ -43,10 +43,6 @@
                                     <pattern>org.bstats</pattern>
                                     <shadedPattern>io.lumine.cosmetics.metrics</shadedPattern>
                                 </relocation>
-                                <relocation>
-                                    <pattern>io.lumine.utils</pattern>
-                                    <shadedPattern>io.lumine.cosmetics.utils</shadedPattern>
-                                </relocation>
                             </relocations>
                             <minimizeJar>false</minimizeJar>
                         </configuration>
@@ -59,7 +55,7 @@
                 <artifactId>maven-jar-plugin</artifactId>
                 <version>3.1.0</version>
                 <configuration>
-                    <finalName>MCCosmeticsPremium-${project.parent.version}</finalName>
+                    <finalName>MythicCosmeticsPremium-${project.parent.version}</finalName>
                     <outputDirectory>${ticxo.build.premium}</outputDirectory>
                 </configuration>
             </plugin>
@@ -67,10 +63,10 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.8.0</version>
+                <version>3.13.0</version>
                 <configuration>
-                    <source>16</source>
-                    <target>16</target>
+                    <source>21</source>
+                    <target>21</target>
                 </configuration>
             </plugin>
             
diff --git a/dist/pom.xml b/dist/pom.xml
index 7c2da175721238664d6a1b3d57478ab49253b4dc..bf5e2822a12879ee49923d8cc0d63f872e56054a 100644
--- a/dist/pom.xml
+++ b/dist/pom.xml
@@ -1,10 +1,10 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>MCCosmetics-Dist</artifactId>
+    <artifactId>MythicCosmetics-Dist</artifactId>
     <parent>
         <groupId>io.lumine</groupId>
-        <artifactId>MCCosmetics-Plugin</artifactId>
+        <artifactId>MythicCosmetics-Plugin</artifactId>
         <version>${mccosmetics.version}</version>
     </parent>  
  
@@ -17,44 +17,20 @@
     <dependencies>
         <dependency>
             <groupId>io.lumine</groupId>
-            <artifactId>LumineUtils</artifactId>
-            <version>${lumineutils.version}</version>
-            <scope>compile</scope> 
-            <exclusions>
-                <exclusion>
-                    <artifactId>*</artifactId>
-                    <groupId>*</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>io.lumine</groupId>
-            <artifactId>MCCosmetics</artifactId>
+            <artifactId>MythicCosmetics</artifactId>
             <version>${project.parent.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>io.lumine</groupId>
-            <artifactId>MCCosmetics-v1_18_R2</artifactId>
-            <version>${project.parent.version}</version>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>io.lumine</groupId>
-            <artifactId>MCCosmetics-v1_19_R2</artifactId>
+            <artifactId>MythicCosmetics-v1_21_R2</artifactId>
             <version>${project.parent.version}</version>
             <scope>compile</scope>
         </dependency>
         <dependency>
             <groupId>io.lumine</groupId>
-            <artifactId>MCCosmetics-v1_19_R3</artifactId>
-            <version>${project.parent.version}</version>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>io.lumine</groupId>
-            <artifactId>MCCosmetics-v1_20_R1</artifactId>
+            <artifactId>MythicCosmetics-v1_21_R3</artifactId>
             <version>${project.parent.version}</version>
             <scope>compile</scope>
         </dependency>
@@ -66,7 +42,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
-                <version>3.3.1-SNAPSHOT</version>
+                <version>3.5.3</version>
                 <executions>
                     <execution>
                         <phase>package</phase>
@@ -79,10 +55,6 @@
                                     <pattern>org.bstats</pattern>
                                     <shadedPattern>io.lumine.cosmetics.metrics</shadedPattern>
                                 </relocation>
-                                <relocation>
-                                    <pattern>io.lumine.utils</pattern>
-                                    <shadedPattern>io.lumine.cosmetics.utils</shadedPattern>
-                                </relocation>
                                 <relocation>
                                     <pattern>com.ticxo.playeranimator</pattern>
                                     <shadedPattern>io.lumine.cosmetics.playeranimator</shadedPattern>
@@ -99,7 +71,7 @@
                 <artifactId>maven-jar-plugin</artifactId>
                 <version>3.1.0</version>
                 <configuration>
-                    <finalName>MCCosmetics-${project.parent.version}</finalName>
+                    <finalName>MythicCosmetics-${project.parent.version}</finalName>
                     <outputDirectory>${ticxo.build.location}</outputDirectory>
                 </configuration>
             </plugin>
@@ -107,10 +79,10 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.8.0</version>
+                <version>3.13.0</version>
                 <configuration>
-                    <source>16</source>
-                    <target>16</target>
+                    <source>21</source>
+                    <target>21</target>
                 </configuration>
             </plugin>
             
diff --git a/plugin/pom.xml b/plugin/pom.xml
index 1c53476ccbc2ebb5f4ee242112b6b6e7bfc71d0f..789dd8e60144ea21e7b3235ab0f56d016bc2b371 100644
--- a/plugin/pom.xml
+++ b/plugin/pom.xml
@@ -1,13 +1,13 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>MCCosmetics</artifactId>
+    <artifactId>MythicCosmetics</artifactId>
 
-    <name>MCCosmetics</name> 
+    <name>MythicCosmetics</name>
     <description>A plugin for creating insane cosmetics.</description>
     <parent>
         <groupId>io.lumine</groupId>
-        <artifactId>MCCosmetics-Plugin</artifactId>
+        <artifactId>MythicCosmetics-Plugin</artifactId>
         <version>${mccosmetics.version}</version>
     </parent> 
 
@@ -131,6 +131,10 @@
             <id>jitpack.io</id>
             <url>https://jitpack.io</url>
         </repository>
+        <repository>
+            <id>worldedit</id>
+            <url>https://maven.enginehub.org/repo/</url>
+        </repository>
     </repositories> 
     <pluginRepositories>
         <pluginRepository>
@@ -144,22 +148,22 @@
     </pluginRepositories>
     <dependencies>
         <dependency>
-            <groupId>com.sk89q.worldguard</groupId>
-            <artifactId>worldguard-bukkit</artifactId>
-            <version>7.0.2-SNAPSHOT</version>
-            <scope>provided</scope>
+            <groupId>io.lumine</groupId>
+            <artifactId>MythicCosmetics-API</artifactId>
+            <version>${project.parent.version}</version>
+            <scope>compile</scope> 
         </dependency>
         <dependency>
             <groupId>io.lumine</groupId>
-            <artifactId>MCCosmetics-API</artifactId>
-            <version>0.8.0-SNAPSHOT</version>
-            <scope>compile</scope> 
+            <artifactId>Mythic-Dist</artifactId>
+            <version>${mythic.version}</version>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>io.lumine</groupId>
             <artifactId>LumineUtils</artifactId>
             <version>${lumineutils.version}</version>
-            <scope>provided</scope> 
+            <scope>provided</scope>
         </dependency>
         <dependency> 
             <groupId>org.projectlombok</groupId>
@@ -169,14 +173,14 @@
         </dependency>
         <dependency>
             <groupId>com.ticxo.modelengine</groupId>
-            <artifactId>api</artifactId>
-            <version>R3.1.7</version>
+            <artifactId>ModelEngine</artifactId>
+            <version>R4.0.8</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>com.ticxo.playeranimator</groupId>
             <artifactId>PlayerAnimator</artifactId>
-            <version>R1.2.7</version>
+            <version>R1.2.8</version>
         </dependency>
 
         <!-- Spigot API -->
@@ -196,31 +200,55 @@
         </dependency>
         
         <!-- Other Requirements -->
+        <dependency>
+            <groupId>com.sk89q.worldedit</groupId>
+            <artifactId>worldedit-core</artifactId>
+            <version>7.3.6</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.sk89q.worldedit</groupId>
+            <artifactId>worldedit-bukkit</artifactId>
+            <version>7.3.6</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.sk89q.worldguard</groupId>
+            <artifactId>worldguard-core</artifactId>
+            <version>7.0.12</version>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>com.comphenix.protocol</groupId>
             <artifactId>ProtocolLib-API</artifactId>
             <version>4.4.0</version>
             <scope>provided</scope>
         </dependency>
+
         <dependency>
             <groupId>net.kyori</groupId>
             <artifactId>adventure-api</artifactId>
-            <version>4.8.1</version>
-            <scope>provided</scope> 
-            <optional>true</optional>
+            <version>4.16.0</version>
+            <scope>provided</scope>
         </dependency>
-
-        <!-- Compatibility -->
         <dependency>
-            <groupId>io.lumine</groupId>
-            <artifactId>Mythic-Dist</artifactId>
-            <version>5.0.3-SNAPSHOT</version>
+            <groupId>net.kyori</groupId>
+            <artifactId>adventure-platform-bukkit</artifactId>
+            <version>4.3.2</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>net.kyori</groupId>
+            <artifactId>adventure-text-minimessage</artifactId>
+            <version>4.16.0</version>
             <scope>provided</scope>
         </dependency>
+
+        <!-- Compatibility -->
         <dependency>
             <groupId>io.lumine</groupId>
             <artifactId>LumineCore</artifactId>
-            <version>1.18-SNAPSHOT</version>
+            <version>1.20-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/plugin/src/main/java/io/lumine/cosmetics/MCCosmeticsPlugin.java b/plugin/src/main/java/io/lumine/cosmetics/MCCosmeticsPlugin.java
index 7826614f3978eb01267dd577912bcfee70b0f25a..961a784e654825ce839c7b349b002d53bd68914b 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/MCCosmeticsPlugin.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/MCCosmeticsPlugin.java
@@ -14,6 +14,7 @@ import io.lumine.cosmetics.listeners.PlayerListeners;
 import io.lumine.cosmetics.logging.MCLogger;
 import io.lumine.cosmetics.managers.CosmeticsExecutor;
 import io.lumine.cosmetics.managers.back.BackManager;
+import io.lumine.cosmetics.managers.chat.ChatTagManager;
 import io.lumine.cosmetics.managers.gestures.GestureManager;
 import io.lumine.cosmetics.managers.hats.HatManager;
 import io.lumine.cosmetics.managers.modelengine.MEGManager;
@@ -25,11 +26,14 @@ import io.lumine.cosmetics.nms.VolatileCodeDisabled;
 import io.lumine.cosmetics.nms.VolatileCodeHandler;
 import io.lumine.cosmetics.players.ProfileManager;
 import io.lumine.cosmetics.players.wardrobe.WardrobeExecutor;
-import io.lumine.utils.chat.ColorString;
-import io.lumine.utils.logging.ConsoleColor;
-import io.lumine.utils.logging.Log;
-import io.lumine.utils.plugin.LuminePlugin;
-import io.lumine.utils.version.ServerVersion;
+import io.lumine.mythic.bukkit.MythicBukkit;
+import io.lumine.mythic.bukkit.events.MythicReloadedEvent;
+import io.lumine.mythic.bukkit.utils.Events;
+import io.lumine.mythic.bukkit.utils.chat.ColorString;
+import io.lumine.mythic.bukkit.utils.logging.ConsoleColor;
+import io.lumine.mythic.bukkit.utils.logging.Log;
+import io.lumine.mythic.bukkit.utils.plugin.LuminePlugin;
+import io.lumine.mythic.bukkit.utils.version.ServerVersion;
 import lombok.Getter;
 import org.bukkit.Bukkit;
 
@@ -48,13 +52,14 @@ public class MCCosmeticsPlugin extends LuminePlugin {
     @Getter private AdminCommand adminCommand;
     
     @Getter private CosmeticsExecutor cosmetics;
-    
-    @Getter private HatManager hatManager;
+
     @Getter private BackManager backManager;
-    @Getter private SprayManager sprayManager;
+    @Getter private ChatTagManager chatTagManager;
+    @Getter private GestureManager gestureManager;
+    @Getter private HatManager hatManager;
     @Getter private OffhandManager offhandManager;
     @Getter private MEGManager megManager;
-    @Getter private GestureManager gestureManager;
+    @Getter private SprayManager sprayManager;
     @Getter private WardrobeExecutor wardrobeManager;
 
     private VolatileCodeHandler volatileCodeHandler;
@@ -101,8 +106,6 @@ public class MCCosmeticsPlugin extends LuminePlugin {
         getConfiguration().load(this);
         MCLogger.log("MCCosmetics configuration file loaded successfully.");
 
-        PlayerAnimatorImpl.initialize(this);
-
         /*
          * Plugin Components
          */
@@ -116,6 +119,7 @@ public class MCCosmeticsPlugin extends LuminePlugin {
         backManager = new BackManager(this);
         sprayManager = new SprayManager(this);
         offhandManager = new OffhandManager(this);
+        chatTagManager = new ChatTagManager(this);
         if(Bukkit.getPluginManager().getPlugin("ModelEngine") != null) {
             try {
                 megManager = new MEGManager(this);
@@ -126,7 +130,12 @@ public class MCCosmeticsPlugin extends LuminePlugin {
         } else {
             Log.info("ModelEngine not found; disabling ModelEngine and MEG Accesstory Cosmetic features.");
         }
-        gestureManager = new GestureManager(this);
+        try {
+            PlayerAnimatorImpl.initialize(this);
+            gestureManager = new GestureManager(this);
+        } catch (Throwable ex) {
+            MCLogger.error("PlayerAnimator not supported on this version. Emotes not available.");
+        }
        
         profiles = new ProfileManager(this);
         
@@ -155,6 +164,8 @@ public class MCCosmeticsPlugin extends LuminePlugin {
             new bStats(this);
         }
 
+        Events.subscribe(MythicReloadedEvent.class).handler(event -> reload()).bindWith(this);
+
         MCLogger.log("" + ConsoleColor.GREEN + ConsoleColor.CHECK_MARK + " MCCosmetics" + (isPremium() ? " Premium" : "") + " v" + getVersion() +  " (build "+ getBuildNumber() +") has been successfully loaded!" + ConsoleColor.RESET);
     }
 
@@ -173,7 +184,14 @@ public class MCCosmeticsPlugin extends LuminePlugin {
         
         MCLogger.log("All active settings have been saved.");
     }
-    
+
+    public void reload() {
+        reloadConfiguration();
+        getMenuManager().reload();
+        getCosmetics().reloadAllManagers();
+        getProfiles().reloadAllCosmetics();
+    }
+
     /**
      * @return MCCosmetics Returns the active MCCosmetics instance.
      */
@@ -214,17 +232,7 @@ public class MCCosmeticsPlugin extends LuminePlugin {
         if(this.volatileCodeHandler != null) return this.volatileCodeHandler;
         
         VolatileCodeHandler VCH = new VolatileCodeDisabled();
-                
-        String packageName = Bukkit.getServer().getClass().getPackage().getName();
-        String version = packageName.substring(packageName.lastIndexOf('.') + 1);
-
-        if (version.startsWith("v1_19")){
-            if("1.19.2-R0.1-SNAPSHOT".equals(Bukkit.getBukkitVersion())) {
-                version = "v1_19_R1_2";
-            } else if ("1.19.3-R0.1-SNAPSHOT".equals(Bukkit.getBukkitVersion())){
-                version = "v1_19_R2";
-            }
-        }
+        final var version = ServerVersion.getNMS().toString();
         
         try {
             final Class<?> clazz = Class.forName("io.lumine.cosmetics.nms.VolatileCodeEnabled_" + version);
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/BaseCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/BaseCommand.java
index ebfac9c2109e0d3cc70d2be4f12b08edb365279c..7791c554ac88721509fa3f984444bd72e8a65900 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/BaseCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/BaseCommand.java
@@ -2,7 +2,7 @@ package io.lumine.cosmetics.commands;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.constants.Permissions;
-import io.lumine.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.commands.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/CommandHelper.java b/plugin/src/main/java/io/lumine/cosmetics/commands/CommandHelper.java
index 0011c7e9bc6d1d4c5279c758231a4215ed4a742f..fe50cbf0012b57af127c26973b03e2102641cdc0 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/CommandHelper.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/CommandHelper.java
@@ -1,10 +1,10 @@
 package io.lumine.cosmetics.commands;
 
 import io.lumine.cosmetics.config.Scope;
-import io.lumine.utils.adventure.text.Component;
-import io.lumine.utils.config.properties.Property;
-import io.lumine.utils.config.properties.types.StringProp;
-import io.lumine.utils.text.Text;
+import net.kyori.adventure.text.Component;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.config.properties.types.StringProp;
+import io.lumine.mythic.bukkit.utils.text.Text;
 import org.bukkit.command.CommandSender;
 
 public class CommandHelper {
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/CustomizeCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/CustomizeCommand.java
index b0d7f8b896bfcdd859c361a03c9986b4bdb04299..9282f2b447217256435b19c4090e4123e99535b5 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/CustomizeCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/CustomizeCommand.java
@@ -2,7 +2,7 @@ package io.lumine.cosmetics.commands;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.constants.Permissions;
-import io.lumine.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.commands.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/DyeCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/DyeCommand.java
index 97b731d5b5f3a6e06930537f33eaade2d3fe1747..6c3a51f0b9a6c7072ee3ab060f76ee0bc0dc8564 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/DyeCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/DyeCommand.java
@@ -4,8 +4,8 @@ import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.api.cosmetics.ColorableCosmetic;
 import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
 import io.lumine.cosmetics.constants.Permissions;
-import io.lumine.utils.commands.Command;
-import io.lumine.utils.serialize.Chroma;
+import io.lumine.mythic.bukkit.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.serialize.Chroma;
 
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/EmotesCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/EmotesCommand.java
index e836a163c3fa64b5f0fc58d661e38fd59e8c7124..b7e632baa2bd4ac00a60bee93f46c911e062d8b9 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/EmotesCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/EmotesCommand.java
@@ -6,7 +6,7 @@ import io.lumine.cosmetics.constants.Permissions;
 import io.lumine.cosmetics.managers.gestures.Gesture;
 import io.lumine.cosmetics.managers.gestures.GestureManager;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.commands.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.bukkit.util.StringUtil;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/EquipCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/EquipCommand.java
index f3355a7b8216590377ce0d8ad49842888331822d..1cf495f712bc58d37ace2d9b751a1f5eb0294301 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/EquipCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/EquipCommand.java
@@ -6,8 +6,8 @@ import io.lumine.cosmetics.api.cosmetics.Cosmetic;
 import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.constants.Permissions;
-import io.lumine.utils.commands.Command;
-import io.lumine.utils.serialize.Chroma;
+import io.lumine.mythic.bukkit.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.serialize.Chroma;
 
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/SprayCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/SprayCommand.java
index 1b9a1b5c483f174be2df85c2927dea359184f8a9..6891b2521b9ee4faeb5a376d315b68fd24d8f218 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/SprayCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/SprayCommand.java
@@ -11,7 +11,7 @@ import io.lumine.cosmetics.api.MCCosmetics;
 import io.lumine.cosmetics.commands.CommandHelper;
 import io.lumine.cosmetics.constants.Permissions;
 import io.lumine.cosmetics.managers.sprays.Spray;
-import io.lumine.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.commands.Command;
 
 public class SprayCommand extends Command<MCCosmeticsPlugin> {
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/SprayRemoveCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/SprayRemoveCommand.java
index c166fc5f6bbe3644e2349539cdc9387031847dbc..0196bc11a764675175c3cb0fa88e9c7ab4c21946 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/SprayRemoveCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/SprayRemoveCommand.java
@@ -11,7 +11,7 @@ import io.lumine.cosmetics.api.MCCosmetics;
 import io.lumine.cosmetics.commands.CommandHelper;
 import io.lumine.cosmetics.constants.Permissions;
 import io.lumine.cosmetics.managers.sprays.Spray;
-import io.lumine.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.commands.Command;
 
 public class SprayRemoveCommand extends Command<MCCosmeticsPlugin> {
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/SpraysCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/SpraysCommand.java
index 3874cfc51a01f04e9231fdfef09a1d90483564cf..c00664d0c15848e0cb6d94235ccabf5cd89be3a8 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/SpraysCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/SpraysCommand.java
@@ -2,7 +2,7 @@ package io.lumine.cosmetics.commands;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.constants.Permissions;
-import io.lumine.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.commands.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/UnequipCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/UnequipCommand.java
index 25af65e5a5e17307e0ca5658b31c8f16aea30e91..fa53f21038dcfb79427e4a2bac4dcbc9515220b5 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/UnequipCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/UnequipCommand.java
@@ -5,8 +5,8 @@ import io.lumine.cosmetics.api.cosmetics.ColorableCosmetic;
 import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.constants.Permissions;
-import io.lumine.utils.commands.Command;
-import io.lumine.utils.serialize.Chroma;
+import io.lumine.mythic.bukkit.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.serialize.Chroma;
 
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/WardrobeCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/WardrobeCommand.java
index 7eed52564f17f4059d21f39237b850a98de83d7f..43416e9e66a7dc8ce3a0b5ef2110ec2c4c7d8132 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/WardrobeCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/WardrobeCommand.java
@@ -6,8 +6,8 @@ import io.lumine.cosmetics.api.cosmetics.Cosmetic;
 import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.constants.Permissions;
-import io.lumine.utils.commands.Command;
-import io.lumine.utils.serialize.Chroma;
+import io.lumine.mythic.bukkit.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.serialize.Chroma;
 
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/admin/AdminCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/admin/AdminCommand.java
index 2a33f894430173ee97d1404bff12c1414a104936..a22df68938ae23666e86b3f9c84bdb108c669099 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/admin/AdminCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/admin/AdminCommand.java
@@ -3,9 +3,9 @@ package io.lumine.cosmetics.commands.admin;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.commands.CommandHelper;
 import io.lumine.cosmetics.constants.Permissions;
-import io.lumine.utils.adventure.text.Component;
-import io.lumine.utils.commands.Command;
-import io.lumine.utils.text.Text;
+import net.kyori.adventure.text.Component;
+import io.lumine.mythic.bukkit.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.text.Text;
 
 import org.bukkit.command.CommandSender;
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/admin/ReloadCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/admin/ReloadCommand.java
index e757b2eabd9e17941b8539660fd6f22639dc68b6..b2e3e12d1002747a54e7002c1686ec26e20f9a3d 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/admin/ReloadCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/admin/ReloadCommand.java
@@ -4,8 +4,8 @@ import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.commands.CommandHelper;
 import io.lumine.cosmetics.config.Scope;
 import io.lumine.cosmetics.constants.Permissions;
-import io.lumine.utils.commands.Command;
-import io.lumine.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
 import org.bukkit.command.CommandSender;
 
 import java.util.Collections;
@@ -19,13 +19,8 @@ public class ReloadCommand extends Command<MCCosmeticsPlugin> {
 
     @Override
     public boolean onCommand(CommandSender sender, String[] args) {
-        getPlugin().reloadConfiguration();
 
-        getPlugin().getMenuManager().reload();
-            
-        getPlugin().getCosmetics().reloadAllManagers();
-        
-        getPlugin().getProfiles().reloadAllCosmetics();
+        getPlugin().reload();
 
         CommandHelper.sendSuccess(sender, Property.String(Scope.CONFIG,
                 "Configuration.Language.Reloaded","MCCosmetics has been reloaded.").get());
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/admin/SprayCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/admin/SprayCommand.java
index dd2db0b4dc34c4d410caaaf42396603302f9547d..17a5cae8bf55b561cf096b2ea06a1ff3080722e4 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/admin/SprayCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/admin/SprayCommand.java
@@ -4,8 +4,8 @@ import java.util.Collections;
 import java.util.List;
 
 import io.lumine.cosmetics.config.Scope;
-import io.lumine.utils.config.properties.Property;
-import io.lumine.utils.text.Text;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.text.Text;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 
@@ -13,7 +13,7 @@ import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.api.MCCosmetics;
 import io.lumine.cosmetics.commands.CommandHelper;
 import io.lumine.cosmetics.constants.Permissions;
-import io.lumine.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.commands.Command;
 
 public class SprayCommand extends Command<MCCosmeticsPlugin> {
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/commands/admin/VersionCommand.java b/plugin/src/main/java/io/lumine/cosmetics/commands/admin/VersionCommand.java
index db20bbf4adf5a5b9914739b5b090c9986561cf40..0e33de6a08c74962a3ef11476ade6191b8f72928 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/commands/admin/VersionCommand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/commands/admin/VersionCommand.java
@@ -4,9 +4,9 @@ import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.commands.CommandHelper;
 import io.lumine.cosmetics.constants.Permissions;
 import io.lumine.cosmetics.nms.VolatileCodeDisabled;
-import io.lumine.utils.chat.ColorString;
-import io.lumine.utils.commands.Command;
-import io.lumine.utils.version.ServerVersion;
+import io.lumine.mythic.bukkit.utils.chat.ColorString;
+import io.lumine.mythic.bukkit.utils.commands.Command;
+import io.lumine.mythic.bukkit.utils.version.ServerVersion;
 
 import org.bukkit.Bukkit;
 import org.bukkit.command.CommandSender;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/compat/CompatibilityManager.java b/plugin/src/main/java/io/lumine/cosmetics/compat/CompatibilityManager.java
index f0440c1e7687b848dcd348c21de82b5ddf2dc2f4..5d855bd6b3f5ef003d55a83a49cabff3fce1cb16 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/compat/CompatibilityManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/compat/CompatibilityManager.java
@@ -1,8 +1,8 @@
 package io.lumine.cosmetics.compat;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.utils.logging.Log;
-import io.lumine.utils.plugin.ReloadableModule;
+import io.lumine.mythic.bukkit.utils.logging.Log;
+import io.lumine.mythic.bukkit.utils.plugin.ReloadableModule;
 import lombok.Getter;
 import org.bukkit.Bukkit;
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/compat/LumineCoreCompat.java b/plugin/src/main/java/io/lumine/cosmetics/compat/LumineCoreCompat.java
index 1bf4ca4ca95a003c978be583c928bfaa30b07614..61aae2d9ffeedbbcfed664fc02c695c00eb00dac 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/compat/LumineCoreCompat.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/compat/LumineCoreCompat.java
@@ -6,9 +6,9 @@ import io.lumine.core.utils.gson.GsonProvider;
 import io.lumine.core.utils.logging.Log;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.plugin.PluginModule;
-import io.lumine.utils.promise.Promise;
-import io.lumine.utils.storage.players.PlayerStorageAdapter;
+import io.lumine.mythic.bukkit.utils.plugin.PluginModule;
+import io.lumine.mythic.bukkit.utils.promise.Promise;
+import io.lumine.mythic.bukkit.utils.storage.players.PlayerStorageAdapter;
 
 import java.io.File;
 import java.io.FileWriter;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/compat/MythicMobsCompat.java b/plugin/src/main/java/io/lumine/cosmetics/compat/MythicMobsCompat.java
index 2e90d7373fa229bb3b6ff4155c76a82b913ff11f..4b7a60a14ba6ed43bdc115763e75ccaca6bb9215 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/compat/MythicMobsCompat.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/compat/MythicMobsCompat.java
@@ -4,7 +4,7 @@ import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.compat.mythicmobs.CosmeticEmoteMechanic;
 import io.lumine.mythic.bukkit.MythicBukkit;
 import io.lumine.mythic.bukkit.events.MythicMechanicLoadEvent;
-import io.lumine.utils.Events;
+import io.lumine.mythic.bukkit.utils.Events;
 
 
 import java.util.Locale;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/compat/PlaceholderAPICompat.java b/plugin/src/main/java/io/lumine/cosmetics/compat/PlaceholderAPICompat.java
index a70cd83b2e78c44919725f8501570349c11a7ca9..12eb2fb1f9cbf94f635d15affef72bdf511cb299 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/compat/PlaceholderAPICompat.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/compat/PlaceholderAPICompat.java
@@ -1,6 +1,7 @@
 package io.lumine.cosmetics.compat;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
+import io.lumine.cosmetics.managers.chat.ChatTag;
 import io.lumine.cosmetics.players.Profile;
 import me.clip.placeholderapi.expansion.PlaceholderExpansion;
 import org.bukkit.entity.Player;
@@ -18,7 +19,7 @@ public class PlaceholderAPICompat extends PlaceholderExpansion {
     public String onPlaceholderRequest(Player player, String identifier) {
         Profile profile = plugin.getProfiles().getProfile(player);
 
-        if(identifier.startsWith("is_equipped_")){
+        if(identifier.startsWith("is_equipped_")) {
             String cosmeticType = identifier.split("_")[2].toUpperCase();
             return profile.getEquippedCosmetics().containsKey(cosmeticType) ? "true" : "false";
         }
@@ -35,6 +36,14 @@ public class PlaceholderAPICompat extends PlaceholderExpansion {
         }
 
         switch (identifier) {
+            case "chattag": {
+                final var maybeTag = profile.getEquipped(ChatTag.class);
+                if(maybeTag.isPresent()) {
+                    return ((ChatTag) maybeTag.get().getCosmetic()).getChatTag().get();
+                } else {
+                    return "";
+                }
+            }
             case "is_gesturing":
                 return profile.getEquippedCosmetics().containsKey("GESTURE") ? "true" : "false";
             case "active_gesture":
diff --git a/plugin/src/main/java/io/lumine/cosmetics/compat/WorldGuardSupport.java b/plugin/src/main/java/io/lumine/cosmetics/compat/WorldGuardSupport.java
index 115e9f37a6b8fad8b9aa328f67b252bf193fe1e4..8615d61be507aa89b83556e1ef78dfd9bc6235ff 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/compat/WorldGuardSupport.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/compat/WorldGuardSupport.java
@@ -3,7 +3,6 @@ package io.lumine.cosmetics.compat;
 import com.sk89q.worldedit.bukkit.BukkitAdapter;
 import com.sk89q.worldguard.LocalPlayer;
 import com.sk89q.worldguard.WorldGuard;
-import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
 import com.sk89q.worldguard.protection.ApplicableRegionSet;
 import com.sk89q.worldguard.protection.flags.Flag;
 import com.sk89q.worldguard.protection.flags.StateFlag;
@@ -26,7 +25,7 @@ public class WorldGuardSupport {
             StateFlag flag = new StateFlag("mcc-spray-flag", true);
             registry.register(flag);
             SPRAY_FLAG = flag;
-        } catch(FlagConflictException e){
+        } catch(FlagConflictException e) {
             Flag<?> existing = registry.get("mcc-spray-flag");
             if(existing instanceof StateFlag){
                 SPRAY_FLAG = (StateFlag) existing;
@@ -36,12 +35,17 @@ public class WorldGuardSupport {
     }
 
     public boolean canSprayWG(Player player, Location location) {
-        RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
-        RegionQuery query = container.createQuery();
-        ApplicableRegionSet set = query.getApplicableRegions(BukkitAdapter.adapt(location));
+        try {
+            RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
+            RegionQuery query = container.createQuery();
+            ApplicableRegionSet set = query.getApplicableRegions(BukkitAdapter.adapt(location));
 
-        LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
+            LocalPlayer localPlayer = WorldGuard.getInstance().checkPlayer(BukkitAdapter.adapt(player));
 
-        return set.testState(localPlayer, SPRAY_FLAG);
+            return set.testState(localPlayer, SPRAY_FLAG);
+        } catch(Throwable ex) {
+            ex.printStackTrace();
+            return true;
+        }
     }
 }
diff --git a/plugin/src/main/java/io/lumine/cosmetics/config/Configuration.java b/plugin/src/main/java/io/lumine/cosmetics/config/Configuration.java
index 4796c58d5935e274e46cd0a4ee07f001898c08a3..2ac5bdc974e24c248f0d6bc78cbdcc7773397f07 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/config/Configuration.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/config/Configuration.java
@@ -4,14 +4,14 @@ import com.google.common.collect.Lists;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.storage.StorageDriver;
-import io.lumine.utils.storage.sql.SqlCredentials;
-import io.lumine.utils.config.properties.types.SqlCredentialsProp;
-import io.lumine.utils.config.properties.Property;
-import io.lumine.utils.config.properties.PropertyHolder;
-import io.lumine.utils.config.properties.types.EnumProp;
-import io.lumine.utils.config.properties.types.IntProp;
-import io.lumine.utils.logging.Log;
-import io.lumine.utils.plugin.ReloadableModule;
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.bukkit.utils.config.properties.types.*;
+import io.lumine.mythic.bukkit.utils.storage.sql.SqlCredentials;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.config.properties.PropertyHolder;
+import io.lumine.mythic.bukkit.utils.logging.Log;
+import io.lumine.mythic.bukkit.utils.plugin.ReloadableModule;
+import io.lumine.mythic.core.packs.PackImpl;
 import lombok.Getter;
 
 import java.io.File;
@@ -24,16 +24,22 @@ import java.util.jar.JarFile;
 
 public class Configuration extends ReloadableModule<MCCosmeticsPlugin> implements PropertyHolder {
     
-    private static final IntProp CLOCK_INTERVAL = Property.Int(Scope.CONFIG, "Clock.Interval", 1);
-    private static final EnumProp<StorageDriver> STORAGE_DRIVER = Property.Enum(Scope.CONFIG, StorageDriver.class, "Storage.Driver", StorageDriver.JSON); 
+    private static final EnumProp<StorageDriver> STORAGE_DRIVER = Property.Enum(Scope.CONFIG, StorageDriver.class, "Storage.Driver", StorageDriver.JSON);
     private static final SqlCredentialsProp SQL_CREDENTIALS = Property.SqlCredentials(Scope.CONFIG, "Storage");
-    
+
     private static final IntProp EQUIP_DELAY = Property.Int(Scope.CONFIG, "General.EquipDelay", 5);
-    
+
+    private static final BooleanProp CRUCIBLE_GENERATION = Property.Boolean(Scope.CONFIG, "Assets.CrucibleGeneration", false);
+    //private static final StringProp ASSET_PACK = Property.String(Scope.CONFIG, "Assets.PackToGenerateFrom", "MythicCosmetics");
+
     @Getter private boolean allowingMetrics = true;
+
+    @Getter private final Pack mythicPack;
     
     public Configuration(MCCosmeticsPlugin plugin)  {
         super(plugin);
+
+        this.mythicPack = new PackImpl(plugin, "MythicCosmetics");
     }
     
     @Override
@@ -66,11 +72,7 @@ public class Configuration extends ReloadableModule<MCCosmeticsPlugin> implement
         }
         return packs;
     }
-    
-    public int getClockInterval() {
-        return CLOCK_INTERVAL.get(this);
-    }
-    
+
     public StorageDriver getStorageType() {
         return STORAGE_DRIVER.get(this);
     }
diff --git a/plugin/src/main/java/io/lumine/cosmetics/config/Scope.java b/plugin/src/main/java/io/lumine/cosmetics/config/Scope.java
index 738de913bda73d3652c72e8776c2f82426268202..294d781e671267989f4402b5ca4f736591714b5c 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/config/Scope.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/config/Scope.java
@@ -1,6 +1,6 @@
 package io.lumine.cosmetics.config;
 
-import io.lumine.utils.config.properties.PropertyScope;
+import io.lumine.mythic.bukkit.utils.config.properties.PropertyScope;
 
 public enum Scope implements PropertyScope {
     
diff --git a/plugin/src/main/java/io/lumine/cosmetics/constants/CosmeticType.java b/plugin/src/main/java/io/lumine/cosmetics/constants/CosmeticType.java
index 2f571e310403f5d63b787a7b0ace55b098db3f23..f00a70dffa5da98e04ab6891281b43671e424739 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/constants/CosmeticType.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/constants/CosmeticType.java
@@ -2,6 +2,7 @@ package io.lumine.cosmetics.constants;
 
 import io.lumine.cosmetics.api.cosmetics.Cosmetic;
 import io.lumine.cosmetics.managers.back.BackAccessory;
+import io.lumine.cosmetics.managers.chat.ChatTag;
 import io.lumine.cosmetics.managers.gestures.Gesture;
 import io.lumine.cosmetics.managers.hats.Hat;
 import io.lumine.cosmetics.managers.modelengine.MEGAccessory;
@@ -9,7 +10,7 @@ import io.lumine.cosmetics.managers.offhand.Offhand;
 import io.lumine.cosmetics.managers.particle.ParticleAccessory;
 import io.lumine.cosmetics.managers.pets.Pet;
 import io.lumine.cosmetics.managers.sprays.Spray;
-import io.lumine.utils.logging.Log;
+import io.lumine.mythic.bukkit.utils.logging.Log;
 import org.bukkit.Material;
 
 import java.util.HashMap;
@@ -28,6 +29,7 @@ public class CosmeticType {
         register(Spray.class, new CosmeticConstant("SPRAY", "sprays"));
         register(Offhand.class, new CosmeticConstant("OFFHAND", "offhands"));
         register(Gesture.class, new CosmeticConstant("GESTURE", "gestures"));
+        register(ChatTag.class, new CosmeticConstant("CHATTAG", "chattags"));
     }
 
     public static void register(Class<? extends Cosmetic> clazz, CosmeticConstant cosmeticConstant) {
diff --git a/plugin/src/main/java/io/lumine/cosmetics/logging/MCLogger.java b/plugin/src/main/java/io/lumine/cosmetics/logging/MCLogger.java
index 8468793c6f0e24cf71e7372fc35cef9c0697537e..9cab9e7c984a18f197c85041311d01220dc8393c 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/logging/MCLogger.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/logging/MCLogger.java
@@ -1,7 +1,7 @@
 package io.lumine.cosmetics.logging;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.utils.logging.ConsoleColor;
+import io.lumine.mythic.bukkit.utils.logging.ConsoleColor;
 
 import java.util.logging.Level;
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/AbstractCosmetic.java b/plugin/src/main/java/io/lumine/cosmetics/managers/AbstractCosmetic.java
index b4f82e23bd71951b0d2ba09832e920c389624dcc..b618bde1ac59a5c13c29a8f91198a5f8b88304ed 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/AbstractCosmetic.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/AbstractCosmetic.java
@@ -12,15 +12,19 @@ import io.lumine.cosmetics.commands.CommandHelper;
 import io.lumine.cosmetics.config.Scope;
 import io.lumine.cosmetics.constants.Permissions;
 import io.lumine.cosmetics.menus.CosmeticMenu;
-import io.lumine.utils.Schedulers;
-import io.lumine.utils.config.properties.Property;
-import io.lumine.utils.config.properties.types.*;
-import io.lumine.utils.items.ItemFactory;
-import io.lumine.utils.menu.Icon;
-import io.lumine.utils.menu.IconBuilder;
-import io.lumine.utils.text.Text;
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.bukkit.MythicBukkit;
+import io.lumine.mythic.bukkit.utils.Schedulers;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.config.properties.types.*;
+import io.lumine.mythic.bukkit.utils.items.ItemFactory;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
+import io.lumine.mythic.bukkit.utils.menu.IconBuilder;
+import io.lumine.mythic.bukkit.utils.text.Text;
+import io.papermc.paper.datacomponent.DataComponentTypes;
 import lombok.Getter;
 import org.bukkit.Material;
+import org.bukkit.NamespacedKey;
 import org.bukkit.inventory.ItemStack;
 
 import java.io.File;
@@ -33,7 +37,7 @@ public abstract class AbstractCosmetic extends Cosmetic {
     protected static final StringProp NAMESPACE = Property.String(Scope.NONE, "Namespace", null);
     protected static final StringProp PERMISSION = Property.String(Scope.NONE, "Permission", null);
 	protected static final EnumProp<Material> MATERIAL = Property.Enum(Scope.NONE, Material.class, "Material", Material.EMERALD);
-	protected static final IntProp MODEL = Property.Int(Scope.NONE, "Model");
+	protected static final StringProp MODEL = Property.String(Scope.NONE, "Model", null);
 	protected static final LangProp DISPLAY = Property.Lang(Scope.NONE, "Display");
 	protected static final LangListProp DESCRIPTION = Property.LangList(Scope.NONE, "Description");
 	protected static final StringProp TEXTURE = Property.String(Scope.NONE, "SkullTexture");
@@ -45,6 +49,7 @@ public abstract class AbstractCosmetic extends Cosmetic {
 
     private final MCCosmeticsManager manager;
     
+	protected final Pack mythicPack;
 	protected final File file;
     @Getter protected final String id;
 	@Getter protected final String key;
@@ -54,7 +59,6 @@ public abstract class AbstractCosmetic extends Cosmetic {
 
 	// Menu Item
 	protected Material material;
-	protected int model;
 	@Getter protected String display;
 	protected List<String> description;
     protected String color;
@@ -65,8 +69,13 @@ public abstract class AbstractCosmetic extends Cosmetic {
 	protected Map<String,CosmeticVariant> variants = Maps.newConcurrentMap();
 
 	public AbstractCosmetic(MCCosmeticsManager manager, File file, String type, String key) {
+		this(manager, null, file, type, key);
+	}
+
+	public AbstractCosmetic(MCCosmeticsManager manager, Pack pack, File file, String type, String key) {
 		super(manager, type, key);
 		this.manager = manager;
+		this.mythicPack = pack;
 		this.file = file;
 		this.key = key;
 		this.namespace = NAMESPACE.fget(file,this);
@@ -90,7 +99,6 @@ public abstract class AbstractCosmetic extends Cosmetic {
 		}
 		
 		this.material = MATERIAL.fget(file,this);
-		this.model = MODEL.fget(file,this);
 		this.display = DISPLAY.fget(file,this);
 		this.description = DESCRIPTION.fget(file,this);
         this.color = COLOR.fget(file,this);
@@ -104,19 +112,38 @@ public abstract class AbstractCosmetic extends Cosmetic {
 		if(material == Material.PLAYER_HEAD) {
 			this.menuItem = ItemFactory.of(this.material)
 					.name(Text.colorize(this.getDisplay()))
-					.model(model)
 					.hideAttributes()
 					.lore(description)
-					.skullTexture(TEXTURE.get(this))
+					//.skullTexture(TEXTURE.get(this))
 					.build();
 		} else {
 			this.menuItem = ItemFactory.of(this.material)
 					.name(Text.colorize(this.getDisplay()))
-					.model(model)
 					.hideAttributes()
 					.lore(description)
 					.build();
 		}
+
+		var model = MODEL.fget(file,this);
+
+		if(model != null) {
+			NamespacedKey itemModelKey = null;
+
+			if(MythicBukkit.inst().getCompatibility().getCrucible().isPresent()) {
+				final var generationFeedback = MythicBukkit.inst().getCompatibility().getCrucible().get().addItemToGeneration(mythicPack, model);
+
+				if(generationFeedback.getItemModel().isPresent()) {
+					itemModelKey = generationFeedback.getItemModel().get();
+				}
+			}
+			if(itemModelKey == null) {
+				if (!model.contains(":")) {
+					model = "minecraft:" + model;
+				}
+				itemModelKey = NamespacedKey.minecraft(model);
+			}
+			this.menuItem.setData(DataComponentTypes.ITEM_MODEL, itemModelKey);
+		}
 	}
 
 	protected Icon<CosmeticProfile> buildIcon(String type) {
@@ -174,4 +201,9 @@ public abstract class AbstractCosmetic extends Cosmetic {
 	    return Optional.ofNullable(variants.getOrDefault(id, null));
 	}
 
+	@Override
+	public String getPropertyNode() {
+		return this.key;
+	}
+
 }
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/AbstractCosmeticVariant.java b/plugin/src/main/java/io/lumine/cosmetics/managers/AbstractCosmeticVariant.java
index d9ef4cb48fe2b7bc99cfa3a1e78cfb8fc3badd55..b177dd971f7be221800ab2c9548d2881002fb2f6 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/AbstractCosmeticVariant.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/AbstractCosmeticVariant.java
@@ -6,11 +6,11 @@ import io.lumine.cosmetics.api.cosmetics.Cosmetic;
 import io.lumine.cosmetics.api.cosmetics.CosmeticVariant;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.config.Scope;
-import io.lumine.utils.config.properties.Property;
-import io.lumine.utils.config.properties.types.LangListProp;
-import io.lumine.utils.config.properties.types.LangProp;
-import io.lumine.utils.config.properties.types.StringProp;
-import io.lumine.utils.menu.Icon;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.config.properties.types.LangListProp;
+import io.lumine.mythic.bukkit.utils.config.properties.types.LangProp;
+import io.lumine.mythic.bukkit.utils.config.properties.types.StringProp;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
 import lombok.Getter;
 
 public class AbstractCosmeticVariant extends CosmeticVariant {
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/CosmeticsExecutor.java b/plugin/src/main/java/io/lumine/cosmetics/managers/CosmeticsExecutor.java
index 4d04419e62efced9c0c0127c712b62beeb90bff7..1b8721b4e6ddcab56555ae393e2bc117a06ca0e3 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/CosmeticsExecutor.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/CosmeticsExecutor.java
@@ -3,8 +3,8 @@ package io.lumine.cosmetics.managers;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.utils.events.extra.ArmorEquipEventListener;
-import io.lumine.utils.plugin.ReloadableModule;
+import io.lumine.mythic.bukkit.utils.events.extra.ArmorEquipEventListener;
+import io.lumine.mythic.bukkit.utils.plugin.ReloadableModule;
 import lombok.Getter;
 
 import java.util.Collection;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/MCCosmeticsManager.java b/plugin/src/main/java/io/lumine/cosmetics/managers/MCCosmeticsManager.java
index b2e5233f6d085b246df3d8a3936f03660c9829f7..52f5fb615701d775128ed9cf9506ee3fd647159d 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/MCCosmeticsManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/MCCosmeticsManager.java
@@ -15,11 +15,13 @@ import io.lumine.cosmetics.nms.VolatileCodeHandler;
 import io.lumine.cosmetics.nms.cosmetic.VolatileCosmeticHelper;
 import io.lumine.cosmetics.players.ProfileManager;
 import io.lumine.cosmetics.players.wardrobe.WardrobeExecutor;
-import io.lumine.utils.config.properties.Property;
-import io.lumine.utils.config.properties.types.NodeListProp;
-import io.lumine.utils.files.Files;
-import io.lumine.utils.logging.Log;
-import io.lumine.utils.plugin.ReloadableModule;
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.bukkit.MythicBukkit;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.config.properties.types.NodeListProp;
+import io.lumine.mythic.bukkit.utils.files.Files;
+import io.lumine.mythic.bukkit.utils.logging.Log;
+import io.lumine.mythic.bukkit.utils.plugin.ReloadableModule;
 import lombok.Getter;
 
 import org.bukkit.entity.Player;
@@ -46,25 +48,22 @@ public abstract class MCCosmeticsManager<T extends Cosmetic> extends ReloadableM
 
     @Override
     public void load(MCCosmeticsPlugin plugin) {
-        final Collection<File> files = Lists.newArrayList();
+
         final String type = CosmeticType.folder(cosmeticClass);
         for(var packFolder : plugin.getConfiguration().getPackFolders()) {
             final File confFolder = new File(packFolder.getAbsolutePath() + System.getProperty("file.separator") + type);
             if(confFolder.exists() && confFolder.isDirectory()) {
-                files.addAll(Files.getAllYaml(confFolder.getAbsolutePath()));
+                for (File file : Files.getAllYaml(confFolder.getAbsolutePath())) {
+                    loadCosmetics(null, file);
+                }
             }
         }
-
-        for(var file : files) {
-            for(var node : KEYS.fget(file)) {
-                var cosmetic = build(file, node);
-                if(!cosmetics.containsKey(cosmetic.getId())){
-                    cosmetics.put(cosmetic.getId(), cosmetic);
-                } else {
-                    Log.warn("Cosmetic with id " + cosmetic.getId() + " already exists!");
-                    Log.warn("Cosmetic will be ignored! Please rename this cosmetic.");
+        for(var pack : MythicBukkit.inst().getPackManager().getPacks()) {
+            final File confFolder = pack.getPackFolder("cosmetics" + System.getProperty("file.separator") + type);
+            if(confFolder.exists() && confFolder.isDirectory()) {
+                for (File file : Files.getAllYaml(confFolder.getAbsolutePath())) {
+                    loadCosmetics(pack, file);
                 }
-
             }
         }
 
@@ -82,12 +81,25 @@ public abstract class MCCosmeticsManager<T extends Cosmetic> extends ReloadableM
         Log.info("Loaded " + cosmetics.size() + " " + type + ".");
     }
 
+    private void loadCosmetics(Pack pack, File file) {
+        for(var node : KEYS.fget(file)) {
+            var cosmetic = build(pack, file, node);
+            if(!cosmetics.containsKey(cosmetic.getId())) {
+                cosmetics.put(cosmetic.getId(), cosmetic);
+            } else {
+                Log.warn("Cosmetic with id " + cosmetic.getId() + " already exists!");
+                Log.warn("Cosmetic will be ignored! Please rename this cosmetic.");
+            }
+
+        }
+    }
+
     @Override
     public void unload() {
         cosmetics.clear();
     }
 
-    public abstract T build(File file, String node);
+    public abstract T build(Pack pack, File file, String node);
 
     public Collection<T> getAllCosmetics() {
         return cosmetics.values();
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/back/BackAccessory.java b/plugin/src/main/java/io/lumine/cosmetics/managers/back/BackAccessory.java
index cd44222a3607f3dd74c8e047415c2e3477dca6ce..1b664afeda906705dfb1a064792d8db415275c8d 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/back/BackAccessory.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/back/BackAccessory.java
@@ -7,8 +7,10 @@ import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.managers.AbstractCosmetic;
-import io.lumine.utils.items.ItemFactory;
-import io.lumine.utils.menu.Icon;
+import io.lumine.cosmetics.managers.hats.HatManager;
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.bukkit.utils.items.ItemFactory;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
 
 import org.bukkit.inventory.ItemStack;
 
@@ -16,8 +18,12 @@ import java.io.File;
 
 public class BackAccessory extends AbstractCosmetic implements ColorableCosmetic,ItemCosmetic {
 
-	public BackAccessory(BackManager manager, File file, String key) {
-		super(manager, file, CosmeticType.type(BackAccessory.class), key);
+    public BackAccessory(BackManager manager, File file, String key) {
+        this(manager, null, file, key);
+    }
+
+	public BackAccessory(BackManager manager, Pack pack, File file, String key) {
+		super(manager, pack, file, CosmeticType.type(BackAccessory.class), key);
 	}
 
 	@Override
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/back/BackManager.java b/plugin/src/main/java/io/lumine/cosmetics/managers/back/BackManager.java
index c35b5c21ae867cdb288be7116707365a7898f160..87d2a3c7dbf4be60a57dfcc1522c6ab53d738e12 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/back/BackManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/back/BackManager.java
@@ -10,8 +10,9 @@ import io.lumine.cosmetics.managers.MCCosmeticsManager;
 import io.lumine.cosmetics.managers.gestures.Gesture;
 import io.lumine.cosmetics.managers.modelengine.MEGAccessory;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
-import io.lumine.utils.Events;
-import io.lumine.utils.Schedulers;
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.bukkit.utils.Events;
+import io.lumine.mythic.bukkit.utils.Schedulers;
 
 import java.io.File;
 
@@ -83,8 +84,8 @@ public class BackManager extends MCCosmeticsManager<BackAccessory> implements Hi
     }
 
     @Override
-    public BackAccessory build(File file, String node) {
-        return new BackAccessory(this, file, node);
+    public BackAccessory build(Pack pack, File file, String node) {
+        return new BackAccessory(this, pack, file, node);
     }
 
     @Override
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/chat/ChatTag.java b/plugin/src/main/java/io/lumine/cosmetics/managers/chat/ChatTag.java
index f1e80f746eb817364964259d4efb409938317732..258afc14dead6b352a511f4f2b849fe2acc35700 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/chat/ChatTag.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/chat/ChatTag.java
@@ -1,24 +1,28 @@
 package io.lumine.cosmetics.managers.chat;
 
 import io.lumine.cosmetics.api.players.CosmeticProfile;
+import io.lumine.cosmetics.config.Scope;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.managers.AbstractCosmetic;
-import io.lumine.utils.menu.Icon;
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.api.skills.placeholders.PlaceholderString;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.config.properties.types.StringProp;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
+import lombok.Getter;
+
 import java.io.File;
 
-import org.bukkit.entity.Player;
+public class ChatTag extends AbstractCosmetic {
 
-import lombok.Getter;
+	private static final StringProp TAG = Property.String(Scope.NONE, "Tag");
 
-public class ChatTag extends AbstractCosmetic {
+	@Getter private final PlaceholderString chatTag;
 
-	public ChatTag(ChatTagManager manager, File file, String key) {
-	    super(manager, file, CosmeticType.type(ChatTag.class), key);
-	}
+	public ChatTag(ChatTagManager manager, Pack pack, File file, String key) {
+	    super(manager, pack, file, CosmeticType.type(ChatTag.class), key);
 
-	@Override
-	public String getPropertyNode() {
-		return this.key;
+		this.chatTag = PlaceholderString.of(TAG.fget(file, this));
 	}
 
     @Override
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/chat/ChatTagManager.java b/plugin/src/main/java/io/lumine/cosmetics/managers/chat/ChatTagManager.java
index 9175e0685b6fcfc328980421d0adcabbd2205585..f92451fa8160d69bbc449fe4774a8f2bd004160d 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/chat/ChatTagManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/chat/ChatTagManager.java
@@ -3,7 +3,10 @@ package io.lumine.cosmetics.managers.chat;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.managers.MCCosmeticsManager;
+import io.lumine.cosmetics.managers.hats.Hat;
 import io.lumine.cosmetics.managers.sprays.Spray;
+import io.lumine.mythic.api.packs.Pack;
+
 import java.io.File;
 
 public class ChatTagManager extends MCCosmeticsManager<ChatTag> {
@@ -16,23 +19,18 @@ public class ChatTagManager extends MCCosmeticsManager<ChatTag> {
 
     @Override
     public void load(MCCosmeticsPlugin plugin) {
-
         super.load(plugin);
-
     }
 
     @Override
-    public ChatTag build(File file, String node) {
-        return null;
+    public ChatTag build(Pack pack, File file, String node) {
+        return new ChatTag(this, pack, file, node);
     }
 
     @Override
     public void equip(CosmeticProfile profile) {}
 
     @Override
-    public void unequip(CosmeticProfile profile) {
-
-    }
-
-
+    public void unequip(CosmeticProfile profile) {}
+    
 }
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/gestures/Gesture.java b/plugin/src/main/java/io/lumine/cosmetics/managers/gestures/Gesture.java
index 41c2e815f4ef736141f82451957e15421e07caa7..21d77b5317aa1a64f2db98ffe27493d3f71e4619 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/gestures/Gesture.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/gestures/Gesture.java
@@ -6,13 +6,13 @@ import io.lumine.cosmetics.commands.CommandHelper;
 import io.lumine.cosmetics.config.Scope;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.managers.AbstractCosmetic;
-import io.lumine.utils.config.properties.Property;
-import io.lumine.utils.config.properties.types.BooleanProp;
-import io.lumine.utils.config.properties.types.EnumProp;
-import io.lumine.utils.config.properties.types.StringProp;
-import io.lumine.utils.menu.Icon;
-import io.lumine.utils.menu.IconBuilder;
-import io.lumine.utils.text.Text;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.config.properties.types.BooleanProp;
+import io.lumine.mythic.bukkit.utils.config.properties.types.EnumProp;
+import io.lumine.mythic.bukkit.utils.config.properties.types.StringProp;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
+import io.lumine.mythic.bukkit.utils.menu.IconBuilder;
+import io.lumine.mythic.bukkit.utils.text.Text;
 import lombok.Getter;
 
 import java.io.File;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/gestures/GestureManager.java b/plugin/src/main/java/io/lumine/cosmetics/managers/gestures/GestureManager.java
index a3dbb33a86c40d4102525de82c8d725d60d2ded0..2a9121798ffd6c4fa9fc6bff8bad36bb0f88606d 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/gestures/GestureManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/gestures/GestureManager.java
@@ -9,8 +9,9 @@ import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.managers.MCCosmeticsManager;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
-import io.lumine.utils.Events;
-import io.lumine.utils.files.Files;
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.bukkit.utils.Events;
+import io.lumine.mythic.bukkit.utils.files.Files;
 import lombok.Getter;
 
 import org.bukkit.entity.Player;
@@ -54,7 +55,7 @@ public class GestureManager extends MCCosmeticsManager<Gesture> {
 	}
 
 	@Override
-	public Gesture build(File file, String node) {
+	public Gesture build(Pack pack, File file, String node) {
 		return new Gesture(this, file, node);
 	}
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/hats/Hat.java b/plugin/src/main/java/io/lumine/cosmetics/managers/hats/Hat.java
index 2cd7f78f79cb2b32e31c46ae51a96c24a5d5a4a6..399fc1586e092457195cb534d9f51b5ebf714194 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/hats/Hat.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/hats/Hat.java
@@ -7,8 +7,9 @@ import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.managers.AbstractCosmetic;
-import io.lumine.utils.items.ItemFactory;
-import io.lumine.utils.menu.Icon;
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.bukkit.utils.items.ItemFactory;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
 
 import org.bukkit.inventory.ItemStack;
 
@@ -17,15 +18,13 @@ import java.io.File;
 public class Hat extends AbstractCosmetic implements ColorableCosmetic,ItemCosmetic {
 
 	public Hat(HatManager manager, File file, String key) {
-	    super(manager, file, CosmeticType.type(Hat.class), key);
+		this(manager, null, file, key);
 	}
 
-	@Override
-	public String getPropertyNode() {
-		return this.key;
+	public Hat(HatManager manager, Pack pack, File file, String key) {
+	    super(manager, pack, file, CosmeticType.type(Hat.class), key);
 	}
 
-
     @Override
     public Icon<CosmeticProfile> getIcon() {
         return buildIcon("hat");
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/hats/HatManager.java b/plugin/src/main/java/io/lumine/cosmetics/managers/hats/HatManager.java
index 1754a85151698129d5dd660f9007bc8135409ffd..afe99eaeb38ae1f1f0270ba0345e97922dee2cc7 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/hats/HatManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/hats/HatManager.java
@@ -9,8 +9,9 @@ import io.lumine.cosmetics.managers.MCCosmeticsManager;
 import io.lumine.cosmetics.managers.gestures.Gesture;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.Events;
-import io.lumine.utils.events.extra.ArmorEquipEvent; 
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.bukkit.utils.Events;
+import io.lumine.mythic.bukkit.utils.events.extra.ArmorEquipEvent; 
 import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.InventoryCloseEvent;
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
@@ -52,8 +53,8 @@ public class HatManager extends MCCosmeticsManager<Hat> implements HideableCosme
     }
 
     @Override
-    public Hat build(File file, String node) {
-        return new Hat(this, file, node);
+    public Hat build(Pack pack, File file, String node) {
+        return new Hat(this, pack, file, node);
     }
 
     @Override
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/FakeEntity.java b/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/FakeEntity.java
index f406fc36e2eb1e2133be3f4745ac24b9f7a063e8..b067995150b03d8a26b1ca839364f8f15530f159 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/FakeEntity.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/FakeEntity.java
@@ -1,9 +1,8 @@
 package io.lumine.cosmetics.managers.modelengine;
 
 import com.ticxo.modelengine.api.entity.BukkitPlayer;
-import com.ticxo.modelengine.api.nms.entity.wrapper.BodyRotationController;
-import com.ticxo.modelengine.api.utils.math.Offset;
-import io.lumine.utils.serialize.Orient;
+import com.ticxo.playeranimator.api.utils.math.Offset;
+import io.lumine.mythic.bukkit.utils.serialize.Orient;
 import org.bukkit.Location;
 import org.bukkit.entity.Player;
 import org.bukkit.util.Vector;
@@ -15,7 +14,6 @@ public class FakeEntity extends BukkitPlayer {
 	private final double yaw;
 	private final double pitch;
 	private final ModelAnchor anchor;
-	private BodyRotationController controller;
 
 	public FakeEntity(@NotNull Player entity, Orient orient, ModelAnchor anchor) {
 		super(entity);
@@ -23,26 +21,23 @@ public class FakeEntity extends BukkitPlayer {
 		yaw = Math.toRadians(orient.getDirection().getYaw());
 		pitch = Math.toRadians(orient.getDirection().getPitch());
 		this.anchor = anchor;
-	}
 
-	@Override
-	public BodyRotationController wrapBodyRotationControl() {
-		controller = super.wrapBodyRotationControl();
-		controller.setMaxHeadAngle(45);
-		controller.setMaxBodyAngle(45);
-		controller.setStableAngle(5);
-		return controller;
+		this.getBodyRotationController().setMaxHeadAngle(45);
+		this.getBodyRotationController().setMaxBodyAngle(45);
+		this.getBodyRotationController().setStableAngle(5);
 	}
 
 	@Override
 	public Location getLocation() {
+		final var controller = getBodyRotationController();
+
 		Location location = getOriginal().getLocation();
 		Vector offset;
 		if (anchor == ModelAnchor.HEAD) {
 			double pYaw = Math.toRadians(location.getYaw());
 			double pPitch = Math.toRadians(location.getPitch());
 			offset = Offset.rotateYaw(Offset.rotatePitch(this.offset.clone(), pitch + pPitch), yaw + pYaw);
-		}else {
+		} else {
 			double pYaw = Math.toRadians(controller == null ? getYBodyRot() : controller.getYBodyRot());
 			offset = Offset.rotateYaw(this.offset.clone(), yaw + pYaw);
 		}
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/MEGAccessory.java b/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/MEGAccessory.java
index 9b88db6f4c299424212f4457645c81840129bf2f..5366dd6282a48de45c19063c6558eea768997fcf 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/MEGAccessory.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/MEGAccessory.java
@@ -1,17 +1,16 @@
 package io.lumine.cosmetics.managers.modelengine;
 
-import com.ticxo.modelengine.api.model.AnimationMode;
 import io.lumine.cosmetics.api.cosmetics.ColorableCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.config.Scope;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.managers.AbstractCosmetic;
-import io.lumine.utils.config.properties.Property;
-import io.lumine.utils.config.properties.types.EnumProp;
-import io.lumine.utils.config.properties.types.OrientProp;
-import io.lumine.utils.config.properties.types.StringProp;
-import io.lumine.utils.menu.Icon;
-import io.lumine.utils.serialize.Orient;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.config.properties.types.EnumProp;
+import io.lumine.mythic.bukkit.utils.config.properties.types.OrientProp;
+import io.lumine.mythic.bukkit.utils.config.properties.types.StringProp;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
+import io.lumine.mythic.bukkit.utils.serialize.Orient;
 import lombok.Getter;
 
 import java.io.File;
@@ -21,13 +20,11 @@ public class MEGAccessory extends AbstractCosmetic implements ColorableCosmetic
 	private static final StringProp MODEL = Property.String(Scope.NONE, "ModelId");
 	private static final StringProp STATE = Property.String(Scope.NONE, "State");
 	private static final OrientProp OFFSET = Property.Orient(Scope.NONE, "Offset");
-	private static final EnumProp<AnimationMode> MODELMODE = Property.Enum(Scope.NONE, AnimationMode.class, "Mode", AnimationMode.B);
 	private static final EnumProp<ModelAnchor> MODELANCHOR = Property.Enum(Scope.NONE, ModelAnchor.class, "Anchor", ModelAnchor.BODY);
 
 	@Getter private final String modelId;
 	@Getter private final String state;
 	@Getter private final Orient offset;
-	@Getter private final AnimationMode mode;
 	@Getter private final ModelAnchor anchor;
 
 	public MEGAccessory(MEGManager manager, File file, String key) {
@@ -36,9 +33,7 @@ public class MEGAccessory extends AbstractCosmetic implements ColorableCosmetic
 		modelId = MODEL.fget(file, this);
 		state = STATE.fget(file, this);
 		offset = OFFSET.fget(file, this);
-		mode = MODELMODE.fget(file, this);
 		anchor = MODELANCHOR.fget(file, this);
-
 	}
 
 	@Override
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/MEGManager.java b/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/MEGManager.java
index 4db07309afab6672e568b78974ac71c8b2cd2c07..32bdce85631e8f7185c38e017fa5a3274cb4fe9d 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/MEGManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/modelengine/MEGManager.java
@@ -1,20 +1,22 @@
 package io.lumine.cosmetics.managers.modelengine;
 
 import com.ticxo.modelengine.api.ModelEngineAPI;
-import com.ticxo.modelengine.api.animation.AnimationProperty;
-import com.ticxo.modelengine.api.animation.blueprint.LoopMode;
+import com.ticxo.modelengine.api.animation.BlueprintAnimation;
 import com.ticxo.modelengine.api.animation.property.SimpleProperty;
+import com.ticxo.modelengine.api.entity.data.BukkitEntityData;
+import com.ticxo.modelengine.api.model.ActiveModel;
 import com.ticxo.modelengine.api.model.ModeledEntity;
-import com.ticxo.modelengine.api.nms.entity.wrapper.RangeManager;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
 import io.lumine.cosmetics.managers.MCCosmeticsManager;
 import io.lumine.cosmetics.players.wardrobe.WardrobeMegDummy;
-import io.lumine.utils.Events;
-import io.lumine.utils.Schedulers;
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.bukkit.utils.Events;
+import io.lumine.mythic.bukkit.utils.Schedulers;
 
+import io.lumine.mythic.bukkit.utils.logging.Log;
 import org.bukkit.GameMode;
 import org.bukkit.entity.Player;
 import org.bukkit.event.entity.PlayerDeathEvent;
@@ -131,7 +133,7 @@ public class MEGManager extends MCCosmeticsManager<MEGAccessory> {
 	}
 
 	@Override
-	public MEGAccessory build(File file, String node) {
+	public MEGAccessory build(Pack pack, File file, String node) {
 		return new MEGAccessory(this, file, node);
 	}
 
@@ -139,41 +141,52 @@ public class MEGManager extends MCCosmeticsManager<MEGAccessory> {
 	public void equip(CosmeticProfile profile) {
 		final var maybeEquipped = profile.getEquipped(MEGAccessory.class);
 		if(maybeEquipped.isEmpty()) {
+            Log.info("No Accessory Found");
 		    return;
 		}
 		var opt = maybeEquipped.get().getCosmetic();
 		
 		if(!(opt instanceof MEGAccessory meg)) {
+            Log.info("Accessory Invalid");
 			return;
 		}
 
 		final var blueprint = ModelEngineAPI.getBlueprint(meg.getModelId());
-		if(blueprint == null)
-			return;
+		if(blueprint == null) {
+            Log.info("No Blueprint Found");
+            return;
+        }
 
 		final var animation = blueprint.getAnimations().get(meg.getState());
-		if(animation == null)
-			return;
+		if(animation == null) {
+            Log.info("No Animation Found");
+            return;
+        }
 
 		final var player = profile.getPlayer();
+
 		final var activeModel = ModelEngineAPI.createActiveModel(blueprint);
 		final var property = new SimpleProperty(activeModel, animation, 1, 0, 1);
-		property.setForceLoopMode(LoopMode.LOOP);
+		property.setForceLoopMode(BlueprintAnimation.LoopMode.LOOP);
 		property.setForceOverride(true);
 		activeModel.getAnimationHandler().playAnimation(property, true);
 		activeModel.setCanHurt(false);
 
-		ModeledEntity modeledEntity = ModelEngineAPI.getModeledEntity(player.getUniqueId());
-		if(modeledEntity == null) {
-			modeledEntity = ModelEngineAPI.createModeledEntity(new FakeEntity(player, meg.getOffset(), meg.getAnchor()));
-			modeledEntity.setBaseEntityVisible(true);
-			ModelEngineAPI.getEntityHandler().setSelfFakeInvisible(player, false);
-			if(modeledEntity.getRangeManager() instanceof RangeManager.Disguise disguise)
-				disguise.setIncludeSelf(true);
-		}
+		ModeledEntity modeledEntity = ModelEngineAPI.getModeledEntity(player);
+		if(modeledEntity != null) {
+            modeledEntity.destroy();
+        }
+
+        modeledEntity = ModelEngineAPI.createModeledEntity(new FakeEntity(player, meg.getOffset(), meg.getAnchor()));
+        modeledEntity.getBase().getBodyRotationController().setPlayerMode(true);
+        modeledEntity.setBaseEntityVisible(true);
+        ModelEngineAPI.getEntityHandler().setForcedInvisible(player, false);
+
+        if(modeledEntity.getBase().getData() instanceof BukkitEntityData data) {
+            data.getTracked().addForcedPairing(player.getUniqueId());
+        }
 
-		modeledEntity.destroy();
-		modeledEntity.addModel(activeModel, false);
+        modeledEntity.addModel(activeModel, false).ifPresent(ActiveModel::destroy);
 	}
 
 	public void unequip(CosmeticProfile profile) {
@@ -212,7 +225,7 @@ public class MEGManager extends MCCosmeticsManager<MEGAccessory> {
 
         final var activeModel = ModelEngineAPI.createActiveModel(blueprint);
         final var property = new SimpleProperty(activeModel, animation, 1, 0, 1);
-        property.setForceLoopMode(LoopMode.LOOP);
+        property.setForceLoopMode(BlueprintAnimation.LoopMode.LOOP);
         property.setForceOverride(true);
         activeModel.getAnimationHandler().playAnimation(property, true);
         activeModel.setCanHurt(false);
@@ -223,11 +236,11 @@ public class MEGManager extends MCCosmeticsManager<MEGAccessory> {
         if(modeledEntity == null) {
             modeledEntity = ModelEngineAPI.createModeledEntity(dummy);
             modeledEntity.setBaseEntityVisible(true);
-            if(modeledEntity.getRangeManager() instanceof RangeManager.Disguise disguise) {
-                disguise.setIncludeSelf(true);
-            }
+            //if(modeledEntity.getRangeManager() instanceof RangeManager.Disguise disguise) {
+            //    disguise.setIncludeSelf(true);
+            //}
 
-            modeledEntity.getRangeManager().forceSpawn(mannequin.getPlayer());
+            //modeledEntity.getRangeManager().forceSpawn(mannequin.getPlayer());
         }
 
         modeledEntity.destroy();
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/offhand/Offhand.java b/plugin/src/main/java/io/lumine/cosmetics/managers/offhand/Offhand.java
index ea1243cddf18bf7f91beb9ea36144feb463475d7..57a939ae3ad9d42412b6ac58d3afe2218977469e 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/offhand/Offhand.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/offhand/Offhand.java
@@ -6,8 +6,8 @@ import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.managers.AbstractCosmetic;
-import io.lumine.utils.items.ItemFactory;
-import io.lumine.utils.menu.Icon;
+import io.lumine.mythic.bukkit.utils.items.ItemFactory;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
 
 import org.bukkit.inventory.ItemStack;
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/offhand/OffhandManager.java b/plugin/src/main/java/io/lumine/cosmetics/managers/offhand/OffhandManager.java
index 6b259ae3478f1031463cba2ca25dd2996400665b..3cc51bf8cd6ec47fb5b57712f71c8c1875423f7b 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/offhand/OffhandManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/offhand/OffhandManager.java
@@ -10,7 +10,8 @@ import io.lumine.cosmetics.managers.MCCosmeticsManager;
 import io.lumine.cosmetics.managers.gestures.Gesture;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.Events;
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.bukkit.utils.Events;
 import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.InventoryCloseEvent;
 import org.bukkit.event.player.PlayerRespawnEvent;
@@ -59,7 +60,7 @@ public class OffhandManager extends MCCosmeticsManager<Offhand> implements Hidea
     }
 
     @Override
-    public Offhand build(File file, String node) {
+    public Offhand build(Pack pack, File file, String node) {
         return new Offhand(this, file, node);
     }
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/particle/ParticleAccessory.java b/plugin/src/main/java/io/lumine/cosmetics/managers/particle/ParticleAccessory.java
index 0efbe3e9fcf61d0f76bd2bd01965d8c6cec393f9..5f138241d0a2554360f4b5ea4554f5678b16cb4f 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/particle/ParticleAccessory.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/particle/ParticleAccessory.java
@@ -4,7 +4,7 @@ import io.lumine.cosmetics.api.cosmetics.ColorableCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.managers.AbstractCosmetic;
-import io.lumine.utils.menu.Icon;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
 
 import java.io.File;
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/particle/ParticleManager.java b/plugin/src/main/java/io/lumine/cosmetics/managers/particle/ParticleManager.java
index 71ca7b19a12a3e41a1bc8e524a5d406525d4d11a..469453c6141b63702840958c5dd7e2837de280c7 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/particle/ParticleManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/particle/ParticleManager.java
@@ -3,6 +3,7 @@ package io.lumine.cosmetics.managers.particle;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.managers.MCCosmeticsManager;
+import io.lumine.mythic.api.packs.Pack;
 
 import java.io.File;
 
@@ -13,7 +14,7 @@ public class ParticleManager extends MCCosmeticsManager<ParticleAccessory> {
 	}
 
 	@Override
-	public ParticleAccessory build(File file, String node) {
+	public ParticleAccessory build(Pack pack, File file, String node) {
 		return new ParticleAccessory(this, file, node);
 	}
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/pets/Pet.java b/plugin/src/main/java/io/lumine/cosmetics/managers/pets/Pet.java
index 1afe90e87cf4d006ca9158afb42015a98a6ee64d..cc9495803336516d769ef2936e69d2c8c9fdfec3 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/pets/Pet.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/pets/Pet.java
@@ -5,9 +5,9 @@ import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.config.Scope;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.managers.AbstractCosmetic;
-import io.lumine.utils.config.properties.Property;
-import io.lumine.utils.config.properties.types.StringProp;
-import io.lumine.utils.menu.Icon;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.config.properties.types.StringProp;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
 import lombok.Getter;
 
 import java.io.File;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/pets/PetManager.java b/plugin/src/main/java/io/lumine/cosmetics/managers/pets/PetManager.java
index d1b897b60661f3934df2e40a578bffca7ec63fd8..a07e24f549d8c2c0ef9d54030e803b3cab09ad17 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/pets/PetManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/pets/PetManager.java
@@ -3,6 +3,7 @@ package io.lumine.cosmetics.managers.pets;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.managers.MCCosmeticsManager;
+import io.lumine.mythic.api.packs.Pack;
 
 import java.io.File;
 
@@ -13,7 +14,7 @@ public class PetManager extends MCCosmeticsManager<Pet> {
 	}
 
 	@Override
-	public Pet build(File file, String node) {
+	public Pet build(Pack pack, File file, String node) {
 		return new Pet(this, file, node);
 	}
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/Spray.java b/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/Spray.java
index 242f42c014d60ade54d8ba34131677e0d38418eb..57cf6ea2f950dd6cbc08d70b27a92a0cae856b44 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/Spray.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/Spray.java
@@ -3,7 +3,7 @@ package io.lumine.cosmetics.managers.sprays;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.managers.AbstractCosmetic;
-import io.lumine.utils.menu.Icon;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
 import java.io.File;
 
 import org.bukkit.entity.Player;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/SprayImage.java b/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/SprayImage.java
index c1a636671df6221a7a60e34a14e0e70b6dcc0b96..a85af2d226af115a8648d842b3cf9ba174741f91 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/SprayImage.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/SprayImage.java
@@ -2,8 +2,8 @@ package io.lumine.cosmetics.managers.sprays;
 
 import java.io.File;
 
-import io.lumine.utils.logging.Log;
-import io.lumine.utils.maps.MapImage;
+import io.lumine.mythic.bukkit.utils.logging.Log;
+import io.lumine.mythic.bukkit.utils.maps.MapImage;
 import lombok.Data;
 
 @Data
diff --git a/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/SprayManager.java b/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/SprayManager.java
index e3849db65cdce09f7c424c215fb6c358fae0cc58..882366b5668d23459fefc8fe57577efc0af708aa 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/SprayManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/managers/sprays/SprayManager.java
@@ -1,10 +1,11 @@
 package io.lumine.cosmetics.managers.sprays;
 
-import io.lumine.utils.Events;
-import io.lumine.utils.Schedulers;
-import io.lumine.utils.config.properties.types.IntProp;
-import io.lumine.utils.cooldown.Cooldown;
-import io.lumine.utils.cooldown.CooldownMap;
+import io.lumine.mythic.api.packs.Pack;
+import io.lumine.mythic.bukkit.utils.Events;
+import io.lumine.mythic.bukkit.utils.Schedulers;
+import io.lumine.mythic.bukkit.utils.config.properties.types.IntProp;
+import io.lumine.mythic.bukkit.utils.cooldown.Cooldown;
+import io.lumine.mythic.bukkit.utils.cooldown.CooldownMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
@@ -14,13 +15,13 @@ import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.managers.MCCosmeticsManager;
 import io.lumine.cosmetics.managers.back.BackAccessory;
 import io.lumine.cosmetics.nms.cosmetic.VolatileSprayHelper;
-import io.lumine.utils.config.properties.Property;
-import io.lumine.utils.config.properties.types.BooleanProp;
-import io.lumine.utils.config.properties.types.DoubleProp;
-import io.lumine.utils.config.properties.types.StringProp;
-import io.lumine.utils.files.Files;
-import io.lumine.utils.logging.Log;
-import io.lumine.utils.numbers.Numbers;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.config.properties.types.BooleanProp;
+import io.lumine.mythic.bukkit.utils.config.properties.types.DoubleProp;
+import io.lumine.mythic.bukkit.utils.config.properties.types.StringProp;
+import io.lumine.mythic.bukkit.utils.files.Files;
+import io.lumine.mythic.bukkit.utils.logging.Log;
+import io.lumine.mythic.bukkit.utils.numbers.Numbers;
 import org.bukkit.Bukkit;
 import org.bukkit.FluidCollisionMode;
 import org.bukkit.Location;
@@ -92,7 +93,7 @@ public class SprayManager extends MCCosmeticsManager<Spray> {
     }
 
     @Override
-    public Spray build(File file, String node) {
+    public Spray build(Pack pack, File file, String node) {
         return new Spray(this, file, node);
     }
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/menus/CosmeticMenu.java b/plugin/src/main/java/io/lumine/cosmetics/menus/CosmeticMenu.java
index 30907439b9a98dc8234713ab127e6672e26b7fc8..28a6a4b37cda6110c2fcb86147c04e28899164dc 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/menus/CosmeticMenu.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/menus/CosmeticMenu.java
@@ -1,11 +1,15 @@
 package io.lumine.cosmetics.menus;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
+import io.lumine.cosmetics.constants.CosmeticType;
+import io.lumine.cosmetics.logging.MCLogger;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.config.properties.types.MenuProp;
-import io.lumine.utils.menu.EditableMenuBuilder;
-import io.lumine.utils.menu.ReloadableMenu;
+import io.lumine.mythic.bukkit.MythicBukkit;
+import io.lumine.mythic.bukkit.utils.config.properties.types.MenuProp;
+import io.lumine.mythic.bukkit.utils.menu.EditableMenuBuilder;
+import io.lumine.mythic.bukkit.utils.menu.ReloadableMenu;
 import lombok.Getter;
+import org.bukkit.NamespacedKey;
 import org.bukkit.entity.Player;
 
 public abstract class CosmeticMenu<T> extends ReloadableMenu<T> {
@@ -35,8 +39,29 @@ public abstract class CosmeticMenu<T> extends ReloadableMenu<T> {
         //menu.open(player, state);
         //profile.setHatIsActive(b);
     }
-    
-    public EditableMenuBuilder<Profile> addPageButtons(EditableMenuBuilder<Profile> builder) {
+
+    @Override
+    public EditableMenuBuilder<T> build(EditableMenuBuilder<T> builder) {
+
+        builder.getIcons().values().forEach(icon -> {
+            final var config = icon.getConfigurationSection();
+
+            if(config.isSet("Model") && !config.isInt("Model")) {
+                final var model = config.getString("Model");
+                MCLogger.log("Found Model {0}", model);
+
+                if(MythicBukkit.inst().getCompatibility().getCrucible().isPresent()) {
+                    final var generationFeedback = MythicBukkit.inst().getCompatibility().getCrucible().get().addItemToGeneration(plugin.getConfiguration().getMythicPack(), model);
+
+                    if(generationFeedback.getItemModel().isPresent()) {
+                        var itemModelKey = generationFeedback.getItemModel().get();
+                        icon.getBuilder().itemModel(itemModelKey);
+                        MCLogger.log("Set Menu ItemModel {0}", model);
+                    }
+                }
+            }
+        });
+
         builder.getIcon("NEXT_PAGE").ifPresent(icon -> {
             icon.getBuilder().click((profile,player) -> {
                 playMenuClick(player);
@@ -49,9 +74,10 @@ public abstract class CosmeticMenu<T> extends ReloadableMenu<T> {
                 previousPage(player);
             });
         });
+
         return builder;
     }
-    
+
     public static void playMenuClick(Player player) {
         player.playSound(player.getLocation(), "entity.chicken.egg", 1F, 1F);
     }
diff --git a/plugin/src/main/java/io/lumine/cosmetics/menus/CustomizeMenu.java b/plugin/src/main/java/io/lumine/cosmetics/menus/CustomizeMenu.java
index 57365269a7d54e3fec0b5ad1f26a9a56c4893b66..8f84a144ba567748330c8193ce09c50098b59783 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/menus/CustomizeMenu.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/menus/CustomizeMenu.java
@@ -3,8 +3,9 @@ package io.lumine.cosmetics.menus;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.config.properties.types.MenuProp;
-import io.lumine.utils.menu.EditableMenuBuilder;
+import io.lumine.mythic.bukkit.utils.config.properties.types.MenuProp;
+import io.lumine.mythic.bukkit.utils.logging.Log;
+import io.lumine.mythic.bukkit.utils.menu.EditableMenuBuilder;
 
 public class CustomizeMenu extends CosmeticMenu<Profile> {
 
@@ -26,7 +27,7 @@ public class CustomizeMenu extends CosmeticMenu<Profile> {
             });
         }
         
-        return builder;
+        return super.build(builder);
     }
 
 }
diff --git a/plugin/src/main/java/io/lumine/cosmetics/menus/GenericSelectionMenu.java b/plugin/src/main/java/io/lumine/cosmetics/menus/GenericSelectionMenu.java
index 13a52c9b8177c3d6589b505679722edd588bdd04..318f12d4aeba54262c8df47166b2a8b7ef65be38 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/menus/GenericSelectionMenu.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/menus/GenericSelectionMenu.java
@@ -2,9 +2,9 @@ package io.lumine.cosmetics.menus;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.Schedulers;
-import io.lumine.utils.config.properties.types.MenuProp;
-import io.lumine.utils.menu.EditableMenuBuilder;
+import io.lumine.mythic.bukkit.utils.Schedulers;
+import io.lumine.mythic.bukkit.utils.config.properties.types.MenuProp;
+import io.lumine.mythic.bukkit.utils.menu.EditableMenuBuilder;
 
 public class GenericSelectionMenu extends CosmeticMenu<SelectionMenuContext> {
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/menus/GenericVariantSelectionMenu.java b/plugin/src/main/java/io/lumine/cosmetics/menus/GenericVariantSelectionMenu.java
index 5bf0c69070abeb03724dc33e60433a6699258656..2045a9a10fe6ebc24612acd9e4d1398fcd922401 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/menus/GenericVariantSelectionMenu.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/menus/GenericVariantSelectionMenu.java
@@ -2,8 +2,8 @@ package io.lumine.cosmetics.menus;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.config.properties.types.MenuProp;
-import io.lumine.utils.menu.EditableMenuBuilder;
+import io.lumine.mythic.bukkit.utils.config.properties.types.MenuProp;
+import io.lumine.mythic.bukkit.utils.menu.EditableMenuBuilder;
 
 public class GenericVariantSelectionMenu extends CosmeticMenu<Profile> {
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/menus/MenuManager.java b/plugin/src/main/java/io/lumine/cosmetics/menus/MenuManager.java
index 50db49784188aa48d993e25026854876cd7cbf2e..3a561326a7d9bbd6189bb352c401aad5454195ef 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/menus/MenuManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/menus/MenuManager.java
@@ -7,7 +7,7 @@ import com.google.common.collect.Lists;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.managers.MCCosmeticsManager;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.plugin.ReloadableModule;
+import io.lumine.mythic.bukkit.utils.plugin.ReloadableModule;
 import lombok.Getter;
 
 public class MenuManager extends ReloadableModule<MCCosmeticsPlugin> {
diff --git a/plugin/src/main/java/io/lumine/cosmetics/menus/SelectColorContext.java b/plugin/src/main/java/io/lumine/cosmetics/menus/SelectColorContext.java
index 27067c6e70806012f78fef8b24c762abc8a75827..34a387d16ad86bf6af8bf909b8842865c8477fba 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/menus/SelectColorContext.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/menus/SelectColorContext.java
@@ -3,7 +3,7 @@ package io.lumine.cosmetics.menus;
 import io.lumine.cosmetics.api.cosmetics.Cosmetic;
 import io.lumine.cosmetics.managers.MCCosmeticsManager;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.serialize.Chroma;
+import io.lumine.mythic.bukkit.utils.serialize.Chroma;
 import lombok.Data;
 
 @Data
diff --git a/plugin/src/main/java/io/lumine/cosmetics/menus/SelectColorMenu.java b/plugin/src/main/java/io/lumine/cosmetics/menus/SelectColorMenu.java
index 5bdc13e0284b7f5fb06086f8e22144558a4d1392..5f6ea67417a1e0db0ea6343e6164bf97140520a9 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/menus/SelectColorMenu.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/menus/SelectColorMenu.java
@@ -2,10 +2,10 @@ package io.lumine.cosmetics.menus;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.config.properties.types.MenuProp;
-import io.lumine.utils.menu.EditableMenuBuilder;
-import io.lumine.utils.menu.Icon;
-import io.lumine.utils.menu.MenuData;
+import io.lumine.mythic.bukkit.utils.config.properties.types.MenuProp;
+import io.lumine.mythic.bukkit.utils.menu.EditableMenuBuilder;
+import io.lumine.mythic.bukkit.utils.menu.Icon;
+import io.lumine.mythic.bukkit.utils.menu.MenuData;
 
 public class SelectColorMenu extends CosmeticMenu<SelectColorContext> {
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/menus/SelectionMenu.java b/plugin/src/main/java/io/lumine/cosmetics/menus/SelectionMenu.java
index 43ff6562fc4be3a6ed6eed3bfe86ca809900d9e4..4de6622788da7c93d887d0ce59d0f406388c862a 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/menus/SelectionMenu.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/menus/SelectionMenu.java
@@ -4,10 +4,10 @@ import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.config.Scope;
 import io.lumine.cosmetics.managers.MCCosmeticsManager;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.Schedulers;
-import io.lumine.utils.config.properties.Property;
-import io.lumine.utils.config.properties.types.MenuProp;
-import io.lumine.utils.menu.EditableMenuBuilder;
+import io.lumine.mythic.bukkit.utils.Schedulers;
+import io.lumine.mythic.bukkit.utils.config.properties.Property;
+import io.lumine.mythic.bukkit.utils.config.properties.types.MenuProp;
+import io.lumine.mythic.bukkit.utils.menu.EditableMenuBuilder;
 
 public class SelectionMenu extends CosmeticMenu<Profile> {
 
@@ -21,8 +21,6 @@ public class SelectionMenu extends CosmeticMenu<Profile> {
 
     @Override
     public EditableMenuBuilder<Profile> build(EditableMenuBuilder<Profile> builder) {
-        builder = addPageButtons(builder);
-        
         builder.getIcon("BUTTON_BACK").ifPresent(icon -> {
             icon.getBuilder().click((profile,player) -> {
                 playMenuClick(player);
@@ -45,7 +43,7 @@ public class SelectionMenu extends CosmeticMenu<Profile> {
             });
         });
         
-        return builder;
+        return super.build(builder);
     }
 
 }
diff --git a/plugin/src/main/java/io/lumine/cosmetics/menus/VariantMenu.java b/plugin/src/main/java/io/lumine/cosmetics/menus/VariantMenu.java
index f8aef1b36f4f49925f52d86fe5c5262e406fd03c..da47a6ce77d4622feb48fb98d6eec663150916c3 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/menus/VariantMenu.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/menus/VariantMenu.java
@@ -2,8 +2,8 @@ package io.lumine.cosmetics.menus;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.config.properties.types.MenuProp;
-import io.lumine.utils.menu.EditableMenuBuilder;
+import io.lumine.mythic.bukkit.utils.config.properties.types.MenuProp;
+import io.lumine.mythic.bukkit.utils.menu.EditableMenuBuilder;
 
 public class VariantMenu extends CosmeticMenu<Profile> {
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/players/Profile.java b/plugin/src/main/java/io/lumine/cosmetics/players/Profile.java
index 6df4c09051d754d7ecf264126f90f1ebcd8a15b7..877d8b24ea2b6329b4e11658bc9da5963a634265 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/players/Profile.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/players/Profile.java
@@ -9,8 +9,8 @@ import io.lumine.cosmetics.constants.CosmeticType;
 import io.lumine.cosmetics.storage.sql.SqlStorage;
 import io.lumine.cosmetics.storage.sql.mappings.Keys;
 import io.lumine.cosmetics.storage.sql.mappings.tables.records.ProfileRecord;
-import io.lumine.utils.Schedulers;
-import io.lumine.utils.serialize.Chroma;
+import io.lumine.mythic.bukkit.utils.Schedulers;
+import io.lumine.mythic.bukkit.utils.serialize.Chroma;
 import lombok.Getter;
 import org.bukkit.entity.Player;
 
@@ -23,7 +23,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
 
-public class Profile implements CosmeticProfile,io.lumine.utils.storage.players.Profile {
+public class Profile implements CosmeticProfile,io.lumine.mythic.bukkit.utils.storage.players.Profile {
 
     @Getter private UUID uniqueId;
     @Getter private String name;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/players/ProfileCosmeticData.java b/plugin/src/main/java/io/lumine/cosmetics/players/ProfileCosmeticData.java
index 036273f64c2230a8af2ffada27949084b72c87f8..46c607d2ecc0bfad78672d13888016a0ce9a024a 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/players/ProfileCosmeticData.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/players/ProfileCosmeticData.java
@@ -7,7 +7,7 @@ import io.lumine.cosmetics.api.cosmetics.Cosmetic;
 import io.lumine.cosmetics.api.cosmetics.CosmeticVariant;
 import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
 import io.lumine.cosmetics.storage.sql.mappings.tables.records.ProfileEquippedRecord;
-import io.lumine.utils.serialize.Chroma;
+import io.lumine.mythic.bukkit.utils.serialize.Chroma;
 import lombok.Data;
 
 @Data
diff --git a/plugin/src/main/java/io/lumine/cosmetics/players/ProfileManager.java b/plugin/src/main/java/io/lumine/cosmetics/players/ProfileManager.java
index dc5c1ecf1f9568ffc37324ccda89de77b296e548..8c4e9de9829f9492aba0a0fb110219175343cb69 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/players/ProfileManager.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/players/ProfileManager.java
@@ -4,11 +4,11 @@ import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.api.events.CosmeticPlayerLoadedEvent;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.storage.sql.SqlStorage;
-import io.lumine.utils.storage.sql.SqlConnector;
-import io.lumine.utils.Events;
-import io.lumine.utils.logging.Log;
-import io.lumine.utils.storage.players.PlayerRepository;
-import io.lumine.utils.storage.players.adapters.file.JsonPlayerStorageAdapter;
+import io.lumine.mythic.bukkit.utils.storage.sql.SqlConnector;
+import io.lumine.mythic.bukkit.utils.Events;
+import io.lumine.mythic.bukkit.utils.logging.Log;
+import io.lumine.mythic.bukkit.utils.storage.players.PlayerRepository;
+import io.lumine.mythic.bukkit.utils.storage.players.adapters.file.JsonPlayerStorageAdapter;
 import org.bukkit.GameMode;
 import org.bukkit.entity.Player;
 import org.bukkit.event.player.PlayerGameModeChangeEvent;
diff --git a/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeExecutor.java b/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeExecutor.java
index 6d7a2963316deea4e6632b0599304a2f85fe6521..0bc5ca3fb30a222f5eb311e6fb08d1f548238b4b 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeExecutor.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeExecutor.java
@@ -11,8 +11,8 @@ import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
 import io.lumine.cosmetics.api.players.wardrobe.WardrobeManager;
 import io.lumine.cosmetics.commands.CommandHelper;
-import io.lumine.utils.Events;
-import io.lumine.utils.plugin.ReloadableModule;
+import io.lumine.mythic.bukkit.utils.Events;
+import io.lumine.mythic.bukkit.utils.plugin.ReloadableModule;
 
 public class WardrobeExecutor extends ReloadableModule<MCCosmeticsPlugin> implements WardrobeManager  {
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeMegDummy.java b/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeMegDummy.java
index 0b733c4b35982cdadb2b09963a8ca7cd550a4b5c..5d7cfd7988818c2f87b868c7a0f1b9a0a65471c7 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeMegDummy.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeMegDummy.java
@@ -1,19 +1,15 @@
 package io.lumine.cosmetics.players.wardrobe;
 
-import java.util.UUID;
-
+import com.ticxo.playeranimator.api.utils.math.Offset;
 import org.bukkit.Location;
-import org.bukkit.entity.Player;
 import org.bukkit.util.Vector;
-import org.jetbrains.annotations.NotNull;
 
 import com.ticxo.modelengine.api.entity.Dummy;
 import com.ticxo.modelengine.api.nms.entity.wrapper.BodyRotationController;
-import com.ticxo.modelengine.api.utils.math.Offset;
 
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
 import io.lumine.cosmetics.managers.modelengine.ModelAnchor;
-import io.lumine.utils.serialize.Orient;
+import io.lumine.mythic.bukkit.utils.serialize.Orient;
 
 public class WardrobeMegDummy extends Dummy {
 
@@ -25,7 +21,7 @@ public class WardrobeMegDummy extends Dummy {
     private BodyRotationController controller;
 
     public WardrobeMegDummy(Mannequin mannequin, Orient orient, ModelAnchor anchor) {
-        super(mannequin.getEntityId(), mannequin.getUniqueId());
+        super(mannequin.getUniqueId(), mannequin.getUniqueId());
         this.mannequin = mannequin;
         
         offset = orient.getLocus().toVector();
@@ -35,15 +31,10 @@ public class WardrobeMegDummy extends Dummy {
         
         this.setYBodyRot(mannequin.getRotation());
         this.setYHeadRot(mannequin.getRotation());
-    }
 
-    @Override
-    public BodyRotationController wrapBodyRotationControl() {
-        controller = super.wrapBodyRotationControl();
-        controller.setMaxHeadAngle(45);
-        controller.setMaxBodyAngle(45);
-        controller.setStableAngle(5);
-        return controller;
+        this.getBodyRotationController().setMaxHeadAngle(45);
+        this.getBodyRotationController().setMaxBodyAngle(45);
+        this.getBodyRotationController().setStableAngle(5);
     }
 
     @Override
diff --git a/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeTrackerImpl.java b/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeTrackerImpl.java
index 40dea924651d5f2bd4b553f1cab154bc07404d06..077778b6fbb3ed2cdb514dad89490955deceb216 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeTrackerImpl.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/players/wardrobe/WardrobeTrackerImpl.java
@@ -15,11 +15,11 @@ import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
 import io.lumine.cosmetics.api.players.wardrobe.WardrobeManager;
 import io.lumine.cosmetics.api.players.wardrobe.WardrobeTracker;
 import io.lumine.cosmetics.constants.CosmeticType;
-import io.lumine.utils.Events;
-import io.lumine.utils.Players;
-import io.lumine.utils.Schedulers;
-import io.lumine.utils.particles.Particle;
-import io.lumine.utils.plugin.PluginComponent;
+import io.lumine.mythic.bukkit.utils.Events;
+import io.lumine.mythic.bukkit.utils.Players;
+import io.lumine.mythic.bukkit.utils.Schedulers;
+import io.lumine.mythic.bukkit.utils.particles.Particle;
+import io.lumine.mythic.bukkit.utils.plugin.PluginComponent;
 import lombok.Getter;
 
 public class WardrobeTrackerImpl extends PluginComponent<MCCosmeticsPlugin> implements WardrobeTracker,Runnable {
diff --git a/plugin/src/main/java/io/lumine/cosmetics/storage/StorageDriver.java b/plugin/src/main/java/io/lumine/cosmetics/storage/StorageDriver.java
index 870c3288e23868c4158950ac02ca93b7dd3f7a36..95abd6b16b9680eeeae75fc6e3254518c54a4951 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/storage/StorageDriver.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/storage/StorageDriver.java
@@ -1,6 +1,6 @@
 package io.lumine.cosmetics.storage;
 
-import io.lumine.utils.storage.sql.SqlProvider;
+import io.lumine.mythic.bukkit.utils.storage.sql.SqlProvider;
 import lombok.Getter;
 
 public enum StorageDriver {
diff --git a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/SqlStorage.java b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/SqlStorage.java
index ac5c0f27776034b8976a09bf1faddf7b46aed1b6..f5db589fc86bde5f8bdfef43f6638d12b9884c3e 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/SqlStorage.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/SqlStorage.java
@@ -7,13 +7,13 @@ import io.lumine.cosmetics.players.ProfileCosmeticData;
 import io.lumine.cosmetics.players.ProfileManager;
 import io.lumine.cosmetics.storage.sql.mappings.DefaultSchema;
 import io.lumine.cosmetics.storage.sql.mappings.Tables;
-import io.lumine.utils.lib.jooq.exception.DataAccessException;
-import io.lumine.utils.logging.Log;
-import io.lumine.utils.plugin.LuminePlugin;
-import io.lumine.utils.promise.Promise;
-import io.lumine.utils.storage.players.Profile;
-import io.lumine.utils.storage.players.adapters.SqlPlayerStorageAdapter;
-import io.lumine.utils.storage.sql.SqlConnector;
+import io.lumine.mythic.bukkit.utils.lib.jooq.exception.DataAccessException;
+import io.lumine.mythic.bukkit.utils.logging.Log;
+import io.lumine.mythic.bukkit.utils.plugin.LuminePlugin;
+import io.lumine.mythic.bukkit.utils.promise.Promise;
+import io.lumine.mythic.bukkit.utils.storage.players.Profile;
+import io.lumine.mythic.bukkit.utils.storage.players.adapters.SqlPlayerStorageAdapter;
+import io.lumine.mythic.bukkit.utils.storage.sql.SqlConnector;
 
 public class SqlStorage<MCCosmeticsPlugin,CosmeticsProfile> extends SqlPlayerStorageAdapter {
 
diff --git a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/DefaultCatalog.java b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/DefaultCatalog.java
index 09dd92764dfce0247fd0a91fea812a9f916359cf..7a73be0cef2bfa7cd09f4cedef4424bb5eb07bc7 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/DefaultCatalog.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/DefaultCatalog.java
@@ -7,9 +7,9 @@ package io.lumine.cosmetics.storage.sql.mappings;
 import java.util.Arrays;
 import java.util.List;
 
-import io.lumine.utils.lib.jooq.Constants;
-import io.lumine.utils.lib.jooq.Schema;
-import io.lumine.utils.lib.jooq.impl.CatalogImpl;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Constants;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Schema;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.CatalogImpl;
 
 
 /**
diff --git a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/DefaultSchema.java b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/DefaultSchema.java
index d71e3c9c2ec73b79f322f0108ae31300ea44e2ef..761f1a90a14a14124fce6ec3f922be1d5be65918 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/DefaultSchema.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/DefaultSchema.java
@@ -10,9 +10,9 @@ import io.lumine.cosmetics.storage.sql.mappings.tables.MccosmeticsProfileEquippe
 import java.util.Arrays;
 import java.util.List;
 
-import io.lumine.utils.lib.jooq.Catalog;
-import io.lumine.utils.lib.jooq.Table;
-import io.lumine.utils.lib.jooq.impl.SchemaImpl;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Catalog;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Table;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.SchemaImpl;
 
 
 /**
diff --git a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/Indexes.java b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/Indexes.java
index 2ac4ff42b91241b6ef4ca7b50e5fea764e7c7d9f..d48c6aaa74d402cfd6a6b55c4238684b829b3b0f 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/Indexes.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/Indexes.java
@@ -6,10 +6,10 @@ package io.lumine.cosmetics.storage.sql.mappings;
 
 import io.lumine.cosmetics.storage.sql.mappings.tables.MccosmeticsProfileEquipped;
 
-import io.lumine.utils.lib.jooq.Index;
-import io.lumine.utils.lib.jooq.OrderField;
-import io.lumine.utils.lib.jooq.impl.DSL;
-import io.lumine.utils.lib.jooq.impl.Internal;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Index;
+import io.lumine.mythic.bukkit.utils.lib.jooq.OrderField;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.DSL;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.Internal;
 
 
 /**
diff --git a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/Keys.java b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/Keys.java
index daa8d6895d805ba1288ef3badbc38902249cc42b..1778cb9321715f14079901ff2af776c575b02405 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/Keys.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/Keys.java
@@ -9,11 +9,11 @@ import io.lumine.cosmetics.storage.sql.mappings.tables.MccosmeticsProfileEquippe
 import io.lumine.cosmetics.storage.sql.mappings.tables.records.ProfileEquippedRecord;
 import io.lumine.cosmetics.storage.sql.mappings.tables.records.ProfileRecord;
 
-import io.lumine.utils.lib.jooq.ForeignKey;
-import io.lumine.utils.lib.jooq.TableField;
-import io.lumine.utils.lib.jooq.UniqueKey;
-import io.lumine.utils.lib.jooq.impl.DSL;
-import io.lumine.utils.lib.jooq.impl.Internal;
+import io.lumine.mythic.bukkit.utils.lib.jooq.ForeignKey;
+import io.lumine.mythic.bukkit.utils.lib.jooq.TableField;
+import io.lumine.mythic.bukkit.utils.lib.jooq.UniqueKey;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.DSL;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.Internal;
 
 
 /**
diff --git a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/MccosmeticsProfile.java b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/MccosmeticsProfile.java
index cb3711c30710a85aaf70047d8bb939a65b6ae63a..ed836720b304b9f2407d2eb1b9f942ef9bc92921 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/MccosmeticsProfile.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/MccosmeticsProfile.java
@@ -8,19 +8,19 @@ import io.lumine.cosmetics.storage.sql.mappings.DefaultSchema;
 import io.lumine.cosmetics.storage.sql.mappings.Keys;
 import io.lumine.cosmetics.storage.sql.mappings.tables.records.ProfileRecord;
 
-import io.lumine.utils.lib.jooq.Field;
-import io.lumine.utils.lib.jooq.ForeignKey;
-import io.lumine.utils.lib.jooq.Name;
-import io.lumine.utils.lib.jooq.Record;
-import io.lumine.utils.lib.jooq.Row2;
-import io.lumine.utils.lib.jooq.Schema;
-import io.lumine.utils.lib.jooq.Table;
-import io.lumine.utils.lib.jooq.TableField;
-import io.lumine.utils.lib.jooq.TableOptions;
-import io.lumine.utils.lib.jooq.UniqueKey;
-import io.lumine.utils.lib.jooq.impl.DSL;
-import io.lumine.utils.lib.jooq.impl.SQLDataType;
-import io.lumine.utils.lib.jooq.impl.TableImpl;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Field;
+import io.lumine.mythic.bukkit.utils.lib.jooq.ForeignKey;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Name;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Record;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Row2;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Schema;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Table;
+import io.lumine.mythic.bukkit.utils.lib.jooq.TableField;
+import io.lumine.mythic.bukkit.utils.lib.jooq.TableOptions;
+import io.lumine.mythic.bukkit.utils.lib.jooq.UniqueKey;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.DSL;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.SQLDataType;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.TableImpl;
 
 
 /**
diff --git a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/MccosmeticsProfileEquipped.java b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/MccosmeticsProfileEquipped.java
index bafb667271ac8534b7dfe1150f4d6e00237879ef..5f1c81d494014e907159a66aa747c9aaba26b4d7 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/MccosmeticsProfileEquipped.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/MccosmeticsProfileEquipped.java
@@ -12,20 +12,20 @@ import io.lumine.cosmetics.storage.sql.mappings.tables.records.ProfileEquippedRe
 import java.util.Arrays;
 import java.util.List;
 
-import io.lumine.utils.lib.jooq.Field;
-import io.lumine.utils.lib.jooq.ForeignKey;
-import io.lumine.utils.lib.jooq.Index;
-import io.lumine.utils.lib.jooq.Name;
-import io.lumine.utils.lib.jooq.Record;
-import io.lumine.utils.lib.jooq.Row4;
-import io.lumine.utils.lib.jooq.Schema;
-import io.lumine.utils.lib.jooq.Table;
-import io.lumine.utils.lib.jooq.TableField;
-import io.lumine.utils.lib.jooq.TableOptions;
-import io.lumine.utils.lib.jooq.UniqueKey;
-import io.lumine.utils.lib.jooq.impl.DSL;
-import io.lumine.utils.lib.jooq.impl.SQLDataType;
-import io.lumine.utils.lib.jooq.impl.TableImpl;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Field;
+import io.lumine.mythic.bukkit.utils.lib.jooq.ForeignKey;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Index;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Name;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Record;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Row4;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Schema;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Table;
+import io.lumine.mythic.bukkit.utils.lib.jooq.TableField;
+import io.lumine.mythic.bukkit.utils.lib.jooq.TableOptions;
+import io.lumine.mythic.bukkit.utils.lib.jooq.UniqueKey;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.DSL;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.SQLDataType;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.TableImpl;
 
 
 /**
diff --git a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/records/ProfileEquippedRecord.java b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/records/ProfileEquippedRecord.java
index a8be479e38e81c414e65928653fb13ece0f284db..2078b99331134bf75f9c8a2d68cc52286a9a91f9 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/records/ProfileEquippedRecord.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/records/ProfileEquippedRecord.java
@@ -6,11 +6,11 @@ package io.lumine.cosmetics.storage.sql.mappings.tables.records;
 
 import io.lumine.cosmetics.storage.sql.mappings.tables.MccosmeticsProfileEquipped;
 
-import io.lumine.utils.lib.jooq.Field;
-import io.lumine.utils.lib.jooq.Record2;
-import io.lumine.utils.lib.jooq.Record4;
-import io.lumine.utils.lib.jooq.Row4;
-import io.lumine.utils.lib.jooq.impl.UpdatableRecordImpl;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Field;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Record2;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Record4;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Row4;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.UpdatableRecordImpl;
 
 
 /**
diff --git a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/records/ProfileRecord.java b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/records/ProfileRecord.java
index 97980afd0bb92524bb17b270d125b642f3d6cbf0..3822da9ba1604d22d13947d41f31e998a8ca2bea 100644
--- a/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/records/ProfileRecord.java
+++ b/plugin/src/main/java/io/lumine/cosmetics/storage/sql/mappings/tables/records/ProfileRecord.java
@@ -6,11 +6,11 @@ package io.lumine.cosmetics.storage.sql.mappings.tables.records;
 
 import io.lumine.cosmetics.storage.sql.mappings.tables.MccosmeticsProfile;
 
-import io.lumine.utils.lib.jooq.Field;
-import io.lumine.utils.lib.jooq.Record1;
-import io.lumine.utils.lib.jooq.Record2;
-import io.lumine.utils.lib.jooq.Row2;
-import io.lumine.utils.lib.jooq.impl.UpdatableRecordImpl;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Field;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Record1;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Record2;
+import io.lumine.mythic.bukkit.utils.lib.jooq.Row2;
+import io.lumine.mythic.bukkit.utils.lib.jooq.impl.UpdatableRecordImpl;
 
 
 /**
diff --git a/plugin/src/main/resources-filtered/plugin.yml b/plugin/src/main/resources-filtered/plugin.yml
index d5b999a1717ca44f4d4a07db42046624a52a7109..7ce827136e5ff21572c1cab53012204b1706909f 100644
--- a/plugin/src/main/resources-filtered/plugin.yml
+++ b/plugin/src/main/resources-filtered/plugin.yml
@@ -1,12 +1,13 @@
-name: MCCosmetics
+name: MythicCosmetics
 author: Lumine & MCModels
 main: io.lumine.cosmetics.MCCosmeticsPlugin
 version: ${project.version}-${build.number}
 api-version: 1.13
-depend: []
+depend:
+- MythicMobs
 softdepend:
 - ModelEngine
-- MythicMobs
+- MythicCrucible
 - Vault
 - LibsDisguises
 - PlaceholderAPI
diff --git a/plugin/src/main/resources/config.yml b/plugin/src/main/resources/config.yml
index 461ec09acaac5f5cf5eda012a6d31e325f9896cf..ece72f5eac22ee43ffedc8ae54aa399868246ddb 100644
--- a/plugin/src/main/resources/config.yml
+++ b/plugin/src/main/resources/config.yml
@@ -1,16 +1,50 @@
+#
+# Configuration Options for Cosmetics
+#
+# Config options for MythicCosmetics. Learn more on the wiki here:
+#
+# Manual - https://git.mythiccraft.io/mythiccosmetics/MythicCosmetics/-/wikis/home
+# Discord - https://www.discord.gg/MythicCraft
+#
 Configuration:
+
+  #================================================================================
+  # Information for where data is stored
+  #================================================================================
+
   Storage:
     Driver: JSON
+
+  #================================================================================
+  # General Options
+  #================================================================================
+
   General:
-    EquipDelay: 5
+    EquipDelay: 5                    # Delay before equipping when a player joins
+    GenerateDefaultPack: true        # Whether to generate the default 'example' pack
+
+  #
+  # Plugin Assets refer to things like menu GUIs, icons, etc.
+  # These can be automatically implicitly generated by Crucible from a given pack
+  #
+  Assets:
+    CrucibleGeneration: false               # Should plugin assets be auto-generated by Crucible
+    PackToGenerateFrom: PLUGIN_DIR          # Mythic Pack to generate plugin assets from
+
+  Menus:
+    Close-On-Unequip: false
+
+  #================================================================================
+  # Options for Sprays
+  #================================================================================
+
   Sprays:
     Sound: 'entity.cat.hiss'
     Volume: 1.0
     Pitch: 2.0
     ReplaceLast: true
     PersistTime: 60
-  Menus:
-    Close-On-Unequip: false
+
   Language:
     Command-Header: "<yellow><strikethrough>------------<gold>=====</strikethrough> <bold><gradient:#dc0c1f:#ed858f>MCCosmetics</gradient></bold> <strikethrough><gold>=====<yellow>------------</strikethrough>"
     Command-Footer: "<yellow><strikethrough>--------------------------------------</strikethrough>"
diff --git a/pom.xml b/pom.xml
index ef80e4d75879410d03d5afe14e1c540e834dd1d1..39e6876058346473ff8eb295d8c1d52e614d21f7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,10 +1,10 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
   	<groupId>io.lumine</groupId>
-  	<artifactId>MCCosmetics-Plugin</artifactId>
+  	<artifactId>MythicCosmetics-Plugin</artifactId>
   	<version>${mccosmetics.version}</version>
-  	<name>MCCosmetics</name>
-  	<description>A plugin for creating insane cosmetics.</description>
+  	<name>MythicCosmetics</name>
+  	<description>A plugin for creating thicc cosmetics.</description>
   	<url>https://www.mythiccraft.io</url>
   	<packaging>pom</packaging>
     <organization>
@@ -13,10 +13,11 @@
     </organization>
  
 	<properties>  
-	    <mccosmetics.version>0.11.0</mccosmetics.version>
-	    <paperapi.version>1.20.1-R0.1-SNAPSHOT</paperapi.version>
-	    <lumineutils.version>1.19-SNAPSHOT</lumineutils.version>
-	    <lombok.version>1.18.22</lombok.version>
+	    <mccosmetics.version>0.0.1-SNAPSHOT</mccosmetics.version>
+	    <paperapi.version>1.21.3-R0.1-SNAPSHOT</paperapi.version>
+	    <mythic.version>5.8.0-SNAPSHOT</mythic.version>
+	    <lumineutils.version>1.20-SNAPSHOT</lumineutils.version>
+	    <lombok.version>1.18.32</lombok.version>
     	<!--suppress UnresolvedMavenProperty -->
 		<build.number>${CI_COMMIT_SHORT_SHA}</build.number>
     	<downloadSources>false</downloadSources>
@@ -31,10 +32,8 @@
 	<modules>
 	    <module>api</module>
         <module>plugin</module>
-        <module>v1_18_R2</module>
-        <module>v1_19_R2</module>
-        <module>v1_19_R3</module>
-        <module>v1_20_R1</module>
+        <module>v1_21_R2</module>
+        <module>v1_21_R3</module>
         <module>dist</module>
         <module>dist-premium</module>
 	</modules>
@@ -58,9 +57,9 @@
 	    <plugins>
 	      	<plugin>
 	        	<artifactId>maven-compiler-plugin</artifactId>
-	        	<version>3.8.0</version>
+	        	<version>3.13.0</version>
                 <configuration>
-                    <release>16</release>
+                    <release>21</release>
                 </configuration>
 			</plugin>
 		</plugins>
diff --git a/v1_18_R2/pom.xml b/v1_18_R2/pom.xml
deleted file mode 100644
index 40197012b5f38036a684a7ce3cdf62b228f3de87..0000000000000000000000000000000000000000
--- a/v1_18_R2/pom.xml
+++ /dev/null
@@ -1,164 +0,0 @@
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    
-    <artifactId>MCCosmetics-v1_18_R2</artifactId>
-    <parent>
-        <groupId>io.lumine</groupId>
-        <artifactId>MCCosmetics-Plugin</artifactId>
-        <version>${mccosmetics.version}</version>
-    </parent>
-
-    <build> 
-        <plugins>
-            <plugin>
-                <groupId>net.md-5</groupId>
-                <artifactId>specialsource-maven-plugin</artifactId>
-                <version>1.2.3</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>remap</goal>
-                        </goals>
-                        <id>remap-obf</id>
-                        <configuration>
-                            <srgIn>org.spigotmc:minecraft-server:1.18.2-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
-                            <reverse>true</reverse>
-                            <remappedDependencies>org.spigotmc:spigot:1.18.2-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
-                            <remappedArtifactAttached>true</remappedArtifactAttached>
-                            <remappedClassifierName>remapped-obf</remappedClassifierName>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>remap</goal>
-                        </goals>
-                        <id>remap-spigot</id>
-                        <configuration>
-                            <inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
-                            <srgIn>org.spigotmc:minecraft-server:1.18.2-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
-                            <remappedDependencies>org.spigotmc:spigot:1.18.2-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>flatten-maven-plugin</artifactId>
-                <version>1.2.2</version>
-                <configuration>
-                    <updatePomFile>true</updatePomFile>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>flatten</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>flatten</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>flatten.clean</id>
-                        <phase>clean</phase>
-                        <goals>
-                            <goal>clean</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build> 
-    <repositories> 
-        <repository>
-            <id>spigot-repo</id> 
-            <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
-        </repository>
-        <repository>
-            <id>lumine</id>
-            <url>https://mvn.lumine.io/repository/maven/</url>
-        </repository>
-        <repository>
-           <id>paper-repo</id>
-           <url>https://papermc.io/repo/repository/maven-public/</url>
-        </repository>
-        <repository>
-            <id>minecraft-libraries</id>
-            <name>Minecraft Libraries</name>
-            <url>https://libraries.minecraft.net</url>
-        </repository>
-    </repositories>
-
-    <dependencies>
-        <!-- Modules -->
-        <dependency>
-            <groupId>io.lumine</groupId>
-            <artifactId>LumineUtils</artifactId>
-            <version>${lumineutils.version}</version>
-            <scope>provided</scope> 
-        </dependency>
-        <dependency>
-            <groupId>io.lumine</groupId>
-            <artifactId>MCCosmetics</artifactId>
-            <version>${project.parent.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency> 
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <version>${lombok.version}</version>
-            <scope>provided</scope>
-        </dependency>
-
-        <!-- Spigot API -->
-        <dependency>
-            <groupId>org.spigotmc</groupId>
-            <artifactId>spigot-api</artifactId>
-            <version>1.18.2-R0.1-SNAPSHOT</version>
-            <classifier>shaded</classifier>
-            <scope>provided</scope>
-        </dependency> 
-        
-        <!-- Spigot NMS version -->  
-        <dependency>
-            <groupId>org.spigotmc</groupId>
-            <artifactId>spigot</artifactId>
-            <version>1.18.2-R0.1-SNAPSHOT</version>
-            <classifier>remapped-mojang</classifier>
-            <scope>provided</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>*</groupId>
-                    <artifactId>*</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>com.mojang</groupId>
-            <artifactId>authlib</artifactId>
-            <version>3.11.50</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.mojang</groupId>
-            <artifactId>datafixerupper</artifactId>
-            <version>1.0.20</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty-all</artifactId>
-            <version>4.1.68.Final</version>
-            <scope>provided</scope>
-        </dependency>
-        
-        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <version>1.8.0-beta4</version>
-        </dependency>
-
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_18_R2.java b/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_18_R2.java
deleted file mode 100644
index 70aaf5729135afac98eb3367149507a4fca0dc05..0000000000000000000000000000000000000000
--- a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_18_R2.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package io.lumine.cosmetics.nms;
-
-import com.google.common.collect.Maps;
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.Cosmetic;
-import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.api.players.wardrobe.WardrobeTracker;
-import io.lumine.cosmetics.managers.back.BackAccessory;
-import io.lumine.cosmetics.managers.gestures.Gesture;
-import io.lumine.cosmetics.managers.hats.Hat;
-import io.lumine.cosmetics.managers.offhand.Offhand;
-import io.lumine.cosmetics.managers.sprays.Spray;
-import io.lumine.cosmetics.nms.cosmetic.VolatileCosmeticHelper;
-import io.lumine.cosmetics.nms.v1_18_R2.cosmetic.*;
-import io.lumine.cosmetics.nms.v1_18_R2.network.VolatileChannelHandler;
-import io.lumine.cosmetics.nms.v1_18_R2.wardrobe.MannequinEntity;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelPipeline;
-import lombok.Getter;
-import net.minecraft.network.Connection;
-import net.minecraft.network.protocol.Packet;
-import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
-import net.minecraft.server.level.ServerLevel;
-import net.minecraft.server.level.ServerPlayer;
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
-import org.bukkit.World;
-import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_18_R2.entity.CraftLivingEntity;
-import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
-
-import java.util.Collection;
-import java.util.Map;
-
-public class VolatileCodeEnabled_v1_18_R2 implements VolatileCodeHandler {
-
-    @Getter private final MCCosmeticsPlugin plugin;
-    private final Map<Class<? extends Cosmetic>, VolatileCosmeticHelper> cosmeticHelpers = Maps.newConcurrentMap();
-    
-    public VolatileCodeEnabled_v1_18_R2(MCCosmeticsPlugin plugin) {
-        this.plugin = plugin;
-        cosmeticHelpers.put(Hat.class, new VolatileHatImpl(plugin, this));
-        cosmeticHelpers.put(BackAccessory.class, new VolatileBackImpl(plugin, this));
-        cosmeticHelpers.put(Spray.class, new VolatileSprayImpl(plugin, this));
-        cosmeticHelpers.put(Offhand.class, new VolatileOffhandImpl(plugin, this));
-        cosmeticHelpers.put(Gesture.class, new VolatileGestureImpl(plugin, this));
-    }
-
-    @Override
-    public VolatileCosmeticHelper getCosmeticHelper(Class<? extends Cosmetic> tClass) {
-        return cosmeticHelpers.get(tClass);
-    }
-
-    @Override
-    public Collection<VolatileCosmeticHelper> getCosmeticHelpers() {
-        return cosmeticHelpers.values();
-    }
-
-    @Override
-    public void injectPlayer(Player player) {
-        ServerPlayer ply = ((CraftPlayer) player).getHandle();
-        VolatileChannelHandler cdh = new VolatileChannelHandler(player, this);
-
-        ChannelPipeline pipeline = ply.connection.getConnection().channel.pipeline();
-        for (String name : pipeline.toMap().keySet()) {
-            if (pipeline.get(name) instanceof Connection) {
-                pipeline.addBefore(name, "mc_cosmetics_packet_handler", cdh);
-                break;
-            }
-        }
-    }
-
-    @Override
-    public void removePlayer(Player player) {
-        Channel channel = ((CraftPlayer) player).getHandle().connection.getConnection().channel;
-        channel.eventLoop().submit(() -> {
-            channel.pipeline().remove("mc_cosmetics_packet_handler");
-            return null;
-        });
-    }
-
-    public void broadcast(Packet<?>... packets) {
-        for(Player player : Bukkit.getOnlinePlayers()) {
-            var connection = ((CraftPlayer) player).getHandle().connection;
-            for(Packet<?> packet : packets) {
-                connection.send(packet);
-            }
-        }
-    }
-
-    public void broadcast(Player player, Packet<?>... packets) {
-        var connection = ((CraftPlayer) player).getHandle().connection;
-        for(Packet<?> packet : packets) {
-            connection.send(packet);
-        }
-    }
-
-    public void broadcastAroundAndSelf(Player wearer, Packet<?>... packets) {
-        final var level = ((CraftWorld) wearer.getWorld()).getHandle();
-        final var trackedEntity = level.getChunkSource().chunkMap.entityMap.get(wearer.getEntityId());
-
-        if(trackedEntity == null) {
-            broadcast(wearer.getWorld(), packets);
-            return;
-        }
-
-        for(Packet<?> packet : packets)
-            trackedEntity.broadcastAndSend(packet);
-    }
-
-    public void broadcastAround(Player wearer, Packet<?>... packets) {
-        final var level = ((CraftWorld) wearer.getWorld()).getHandle();
-        final var trackedEntity = level.getChunkSource().chunkMap.entityMap.get(wearer.getEntityId());
-
-        if(trackedEntity == null) {
-            broadcast(wearer.getWorld(), packets);
-            return;
-        }
-
-        for(Packet<?> packet : packets)
-            trackedEntity.broadcast(packet);
-    }
-
-    public void broadcast(World world, Packet<?>... packets) {
-        for(Player player : world.getPlayers()) {
-            var connection = ((CraftPlayer) player).getHandle().connection;
-            for(Packet<?> packet : packets) {
-                connection.send(packet);
-            }
-        }
-    }
-
-    public Entity getEntity(World world, int id) {
-        ServerLevel level = ((CraftWorld) world).getHandle();
-        final var entityManager = level.entityManager;
-        final var entity = entityManager.getEntityGetter().get(id);
-        return entity == null ? null : entity.getBukkitEntity();
-    }
-    
-    @Override
-    public Mannequin createMannequin(WardrobeTracker tracker, Player player, Location location) {
-        return new MannequinEntity(tracker,this,player,location);
-    }
-
-    @Override
-    public void removeFakeEntity(int id) {
-        ClientboundRemoveEntitiesPacket packet = new ClientboundRemoveEntitiesPacket(id);
-        broadcast(packet);
-    }
-
-    @Override
-    public void setBodyYaw(LivingEntity entity, double yaw) {
-        ((CraftLivingEntity) entity).getHandle().yBodyRot = (float) yaw;
-    }
-
-    @Override
-    public float getBodyYaw(LivingEntity entity) {
-        return ((CraftLivingEntity) entity).getHandle().yBodyRot;
-    }
-}
diff --git a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileBackImpl.java b/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileBackImpl.java
deleted file mode 100644
index 9711275e715f80071001214f66478d71ec7ed555..0000000000000000000000000000000000000000
--- a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileBackImpl.java
+++ /dev/null
@@ -1,302 +0,0 @@
-package io.lumine.cosmetics.nms.v1_18_R2.cosmetic;
-
-import com.google.common.collect.Maps;
-import com.mojang.datafixers.util.Pair;
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.Cosmetic;
-import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
-import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
-import io.lumine.cosmetics.api.players.CosmeticProfile;
-import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.logging.MCLogger;
-import io.lumine.cosmetics.managers.back.BackAccessory;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_18_R2;
-import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
-import io.lumine.cosmetics.players.Profile;
-import io.netty.buffer.Unpooled;
-import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.Packet;
-import net.minecraft.network.protocol.game.*;
-import net.minecraft.world.entity.EntityType;
-import net.minecraft.world.entity.EquipmentSlot;
-import net.minecraft.world.entity.decoration.ArmorStand;
-import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-public class VolatileBackImpl implements VolatileEquipmentHelper {
-
-	@Getter
-	private final MCCosmeticsPlugin plugin;
-	private final VolatileCodeEnabled_v1_18_R2 nmsHandler;
-	private final Map<Player, ArmorStand> activeProfile = Maps.newConcurrentMap();
-	private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
-
-	public VolatileBackImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_18_R2 nmsHandler) {
-		this.plugin = plugin;
-		this.nmsHandler = nmsHandler;
-	}
-
-	@Override
-	public void apply(CosmeticProfile profile) {
-		if (profile == null)
-			return;
-		Player player = profile.getPlayer();
-		
-		var maybeEquipped = profile.getEquipped(BackAccessory.class);
-		if(maybeEquipped.isEmpty()) {
-		    return;
-		}
-		var equipped = maybeEquipped.get();
-		var cosmetic = equipped.getCosmetic();
-		
-		if (!(cosmetic instanceof ItemCosmetic back)) {
-			return;
-		}
-
-		var nmsPlayer = ((CraftPlayer) player).getHandle();
-		var nmsBack = CraftItemStack.asNMSCopy(back.getCosmetic(equipped));
-
-		ArmorStand stand = activeProfile.get(player);
-		if(stand == null) {
-			playerTracker.put(player.getEntityId(), player);
-			stand = new ArmorStand(EntityType.ARMOR_STAND, ((CraftWorld) player.getWorld()).getHandle());
-			stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + nmsPlayer.getPassengersRidingOffset() + stand.getMyRidingOffset(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
-			stand.setMarker(true);
-			stand.setInvisible(true);
-			stand.setSilent(true);
-
-			activeProfile.put(player, stand);
-
-			ClientboundAddMobPacket mobPacket = new ClientboundAddMobPacket(stand);
-			ClientboundSetEntityDataPacket dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData(), true);
-			ClientboundSetPassengersPacket passengersPacket = createPassengerPacket(player.getEntityId(), stand.getId());
-
-			nmsHandler.broadcastAroundAndSelf(player, mobPacket, dataPacket, passengersPacket);
-		}
-
-		stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
-
-		ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsBack)));
-
-		nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-	}
-
-	@Override
-	public void unapply(CosmeticProfile profile) {
-		Player player = profile.getPlayer();
-		ArmorStand stand = activeProfile.remove(player);
-		if(stand == null)
-			return;
-		playerTracker.remove(player.getEntityId());
-		ClientboundRemoveEntitiesPacket removePacket = new ClientboundRemoveEntitiesPacket(stand.getId());
-		nmsHandler.broadcastAroundAndSelf(player, removePacket);
-	}
-    
-    @Override 
-    public void equipMannequin(Mannequin mannequin, EquippedCosmetic cosmetic) {
-        if(!(cosmetic.getCosmetic() instanceof BackAccessory back)) {
-            return;
-        }
-        
-        final var entityId = mannequin.getEntityId();
-        final var player = mannequin.getPlayer();
-        var nmsBack = CraftItemStack.asNMSCopy(back.getCosmetic(cosmetic));
-
-        var mannequinLocation = mannequin.getLocation();
-        
-        mannequin.removeExtraEntity(BackAccessory.class);
-
-        var stand = new ArmorStand(EntityType.ARMOR_STAND, ((CraftWorld) player.getWorld()).getHandle());
-        stand.moveTo(mannequinLocation.getX(), mannequinLocation.getY() + stand.getMyRidingOffset(), mannequinLocation.getZ(), mannequinLocation.getYaw(), 0);
-        stand.setMarker(true);
-        stand.setInvisible(true);
-        stand.setSilent(true);
-
-        mannequin.addExtraEntity(BackAccessory.class, stand.getId());
-        
-        var mobPacket = new ClientboundAddEntityPacket(stand);
-        var dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData(), true);
-        var passengersPacket = createPassengerPacket(entityId, stand.getId());
-
-        nmsHandler.broadcast(player, mobPacket, dataPacket, passengersPacket);
-
-        stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
-
-        var equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsBack)));
-
-        nmsHandler.broadcast(player, equipmentPacket);
-    }
-
-    @Override
-    public void unequipMannequin(Mannequin mannequin) {
-        mannequin.removeExtraEntity(BackAccessory.class);
-    }
-
-	@Override
-	public boolean read(Player sender, Object packet, boolean isCanceled) {
-		final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(sender);
-		if(profile == null || profile.isHidden(BackAccessory.class))
-			return true;
-		if(packet instanceof ServerboundMovePlayerPacket) {
-			handleRotate(profile);
-		}else if(packet instanceof ServerboundAcceptTeleportationPacket) {
-			final var list = handleSpawn(profile);
-			if(list == null)
-				return true;
-			final var connection = ((CraftPlayer) sender).getHandle().connection;
-			for(Object obj : list) {
-				connection.send((Packet<?>) obj);
-			}
-		}
-		return true;
-	}
-
-	@Override
-	public List<Object> write(Player receiver, Object packet) {
-		if(packet instanceof ClientboundAddPlayerPacket playerPacket) {
-			int id = playerPacket.getEntityId();
-			if(playerTracker.containsKey(id)) {
-				final var spawnedPlayer = playerTracker.get(id);
-				final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(spawnedPlayer);
-				if(profile == null || profile.isHidden(BackAccessory.class))
-					return null;
-				return handleSpawn(profile);
-			}
-		}else if(packet instanceof ClientboundRemoveEntitiesPacket removePacket) {
-			for(int id : removePacket.getEntityIds()) {
-				if(playerTracker.containsKey(id)) {
-					return handleDespawn(playerTracker.get(id));
-				}
-			}
-		}
-		/*
-		else if(packet instanceof ClientboundMoveEntityPacket moveEntityPacket) {
-			FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer());
-			moveEntityPacket.write(byteBuf);
-			int id = byteBuf.readVarInt();
-			if(playerTracker.containsKey(id)) {
-				final var spawnedPlayer = playerTracker.get(id);
-				final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(spawnedPlayer);
-				if(profile == null || profile.isHidden(BackAccessory.class))
-					return null;
-				return handleMove(profile, moveEntityPacket);
-			}
-		}else if(packet instanceof ClientboundTeleportEntityPacket teleportEntityPacket) {
-			int id = teleportEntityPacket.getId();
-			if(playerTracker.containsKey(id)) {
-				final var spawnedPlayer = playerTracker.get(id);
-				final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(spawnedPlayer);
-				if(profile == null || profile.isHidden(BackAccessory.class))
-					return null;
-				return handleTeleport(profile);
-			}
-		}*/
-
-		return null;
-	}
-
-	private void handleRotate(Profile profile) {
-		if(!hasBack(profile))
-			return;
-
-		final var wearer = profile.getPlayer();
-		final var nmsPlayer = ((CraftPlayer) wearer).getHandle();
-		final var stand = activeProfile.get(wearer);
-
-		ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(stand, VolatileEquipmentHelper.toByte(nmsPlayer.getYRot()));
-		nmsHandler.broadcastAroundAndSelf(wearer, packet);
-	}
-
-	private List<Object> handleSpawn(Profile profile) {
-		if(!hasBack(profile))
-			return null;
-
-		final var wearer = profile.getPlayer();
-		final var stand = activeProfile.get(wearer);
-
-		ClientboundAddMobPacket mobPacket = new ClientboundAddMobPacket(stand);
-		ClientboundSetEntityDataPacket dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData(), true);
-		ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, stand.getItemBySlot(EquipmentSlot.HEAD))));
-		ClientboundSetPassengersPacket passengersPacket = createPassengerPacket(wearer.getEntityId(), stand.getId());
-
-		return List.of(mobPacket, dataPacket, equipmentPacket, passengersPacket);
-	}
-
-	private List<Object> handleDespawn(Player player) {
-		final var stand = activeProfile.get(player);
-		if(stand == null)
-			return null;
-		ClientboundRemoveEntitiesPacket removePacket = new ClientboundRemoveEntitiesPacket(stand.getId());
-		return List.of(removePacket);
-	}
-
-	private List<Object> handleMove(Profile profile, ClientboundMoveEntityPacket moveEntityPacket) {
-		if(!hasBack(profile))
-			return null;
-
-		final var wearer = profile.getPlayer();
-		final var stand = activeProfile.get(wearer);
-
-		ClientboundMoveEntityPacket move;
-		if(moveEntityPacket.hasPosition() && moveEntityPacket.hasRotation()) {
-			move = new ClientboundMoveEntityPacket.PosRot(
-					stand.getId(),
-					moveEntityPacket.getXa(),
-					moveEntityPacket.getYa(),
-					moveEntityPacket.getZa(),
-					moveEntityPacket.getyRot(),
-					moveEntityPacket.getxRot(),
-					false);
-		}else if(moveEntityPacket.hasPosition()) {
-			move = new ClientboundMoveEntityPacket.Pos(
-					stand.getId(),
-					moveEntityPacket.getXa(),
-					moveEntityPacket.getYa(),
-					moveEntityPacket.getZa(),
-					false);
-		}else {
-			move = new ClientboundMoveEntityPacket.Rot(
-					stand.getId(),
-					moveEntityPacket.getyRot(),
-					moveEntityPacket.getxRot(),
-					false);
-		}
-		return List.of(move);
-	}
-
-	private List<Object> handleTeleport(Profile profile) {
-		if(!hasBack(profile))
-			return null;
-
-		final var wearer = profile.getPlayer();
-		final var nmsPlayer = ((CraftPlayer) wearer).getHandle();
-		final var stand = activeProfile.get(wearer);
-		stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + nmsPlayer.getPassengersRidingOffset() + stand.getMyRidingOffset(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
-
-		return List.of(new ClientboundTeleportEntityPacket(stand));
-	}
-
-	private boolean hasBack(Profile profile) {
-		if(profile == null)
-			return false;
-
-		var maybeBack = profile.getEquipped(BackAccessory.class);
-		return maybeBack.isPresent() && maybeBack.get().getCosmetic() instanceof ItemCosmetic && activeProfile.containsKey(profile.getPlayer());
-	}
-
-	private ClientboundSetPassengersPacket createPassengerPacket(int mount, int... driver) {
-		FriendlyByteBuf bb = new FriendlyByteBuf(Unpooled.buffer());
-		bb.writeVarInt(mount);
-		bb.writeVarIntArray(driver);
-		return new ClientboundSetPassengersPacket(bb);
-	}
-
-}
\ No newline at end of file
diff --git a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileGestureImpl.java b/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileGestureImpl.java
deleted file mode 100644
index 4fbf0bfe39f2bed727e939a23cfd35e0a124a584..0000000000000000000000000000000000000000
--- a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileGestureImpl.java
+++ /dev/null
@@ -1,178 +0,0 @@
-package io.lumine.cosmetics.nms.v1_18_R2.cosmetic;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.mojang.datafixers.util.Pair;
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.manager.HideableCosmetic;
-import io.lumine.cosmetics.api.players.CosmeticProfile;
-import io.lumine.cosmetics.managers.gestures.Gesture;
-import io.lumine.cosmetics.managers.gestures.GestureManager;
-import io.lumine.cosmetics.managers.gestures.QuitMethod;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_18_R2;
-import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
-import io.lumine.cosmetics.players.Profile;
-import io.netty.buffer.Unpooled;
-import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.*;
-import net.minecraft.world.entity.EntityType;
-import net.minecraft.world.entity.EquipmentSlot;
-import net.minecraft.world.entity.animal.horse.Horse;
-import net.minecraft.world.item.ItemStack;
-import org.bukkit.attribute.Attribute;
-import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_18_R2.attribute.CraftAttributeMap;
-import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class VolatileGestureImpl implements VolatileEquipmentHelper {
-
-	private static final List<Pair<EquipmentSlot, ItemStack>> empty = new ArrayList<>();
-
-	static {
-		for(final var slot : EquipmentSlot.values())
-			empty.add(Pair.of(slot, ItemStack.EMPTY));
-	}
-
-	@Getter
-	private final MCCosmeticsPlugin plugin;
-	private final VolatileCodeEnabled_v1_18_R2 nmsHandler;
-	private final Set<Player> activeProfile = Sets.newConcurrentHashSet();
-	private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
-
-	private Horse horse;
-
-	public VolatileGestureImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_18_R2 nmsHandler) {
-		this.plugin = plugin;
-		this.nmsHandler = nmsHandler;
-	}
-
-	@Override
-	public void apply(CosmeticProfile profile) {
-		if (profile == null)
-			return;
-		Player player = profile.getPlayer();
-		if(activeProfile.contains(player))
-			return;
-
-        final var maybeEquipped = profile.getEquipped(Gesture.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var opt = maybeEquipped.get().getCosmetic();
-        
-        if(!(opt instanceof Gesture gesture))
-            return;
-
-		playerTracker.put(player.getEntityId(), player);
-		activeProfile.add(player);
-		if(!gesture.isCanMove())
-			getHorsed(player);
-		player.setInvisible(true);
-
-		for(final var value : ((Profile) profile).getEquipped().values()) {
-			final var manager = value.getCosmetic().getManager();
-			if(!(manager instanceof HideableCosmetic hide))
-				continue;
-			hide.hide(profile, gesture);
-		}
-		ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), empty);
-		nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-	}
-
-	@Override
-	public void unapply(CosmeticProfile profile) {
-		if (profile == null)
-			return;
-		Player player = profile.getPlayer();
-		if(!activeProfile.contains(player))
-			return;
-
-		activeProfile.remove(player);
-		playerTracker.remove(player.getEntityId());
-		nmsHandler.broadcast(player, new ClientboundRemoveEntitiesPacket(horse.getId()));
-
-		final var nmsPlayer = ((CraftPlayer) player).getHandle();
-		List<Pair<EquipmentSlot, ItemStack>> equipment = new ArrayList<>();
-		for(EquipmentSlot slot : EquipmentSlot.values())
-			equipment.add(Pair.of(slot, nmsPlayer.getItemBySlot(slot)));
-		ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), equipment);
-		nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-
-		player.setInvisible(false);
-		for(final var value : ((Profile) profile).getEquipped().values()) {
-			final var manager = value.getCosmetic().getManager();
-			if(!(manager instanceof HideableCosmetic hide))
-				continue;
-			hide.show(profile);
-		}
-	}
-
-	private ClientboundSetPassengersPacket createPassengerPacket(int mount, int... driver) {
-		FriendlyByteBuf bb = new FriendlyByteBuf(Unpooled.buffer());
-		bb.writeVarInt(mount);
-		bb.writeVarIntArray(driver);
-		return new ClientboundSetPassengersPacket(bb);
-	}
-
-	private void getHorsed(Player player) {
-		final var nmsPlayer = ((CraftPlayer) player).getHandle();
-
-		if(horse == null) {
-			horse = new Horse(EntityType.HORSE, ((CraftWorld) player.getWorld()).getHandle());
-			horse.setInvisible(true);
-			horse.setHealth(0);
-			horse.getAttribute(CraftAttributeMap.toMinecraft(Attribute.GENERIC_MAX_HEALTH)).setBaseValue(0);
-		}
-		horse.setPos(nmsPlayer.getX(), nmsPlayer.getY() - horse.getPassengersRidingOffset() - nmsPlayer.getMyRidingOffset(), nmsPlayer.getZ());
-
-		ClientboundAddMobPacket mobPacket = new ClientboundAddMobPacket(horse);
-		ClientboundSetEntityDataPacket dataPacket = new ClientboundSetEntityDataPacket(horse.getId(), horse.getEntityData(), true);
-		ClientboundUpdateAttributesPacket attributesPacket = new ClientboundUpdateAttributesPacket(horse.getId(), horse.getAttributes().getSyncableAttributes());
-		ClientboundSetPassengersPacket passengersPacket = createPassengerPacket(horse.getId(), nmsPlayer.getId());
-
-		nmsHandler.broadcast(player, mobPacket, dataPacket, attributesPacket, passengersPacket);
-	}
-
-	@Override
-	public boolean read(Player sender, Object packet, boolean isCanceled) {
-        if(!plugin.getGestureManager().getTicking().containsKey(sender)) {
-            return true;
-        }
-
-		if(packet instanceof ServerboundPlayerInputPacket inputPacket) {
-			final var manager = (GestureManager) plugin.getGestureManager();
-			if(inputPacket.isShiftKeyDown())
-				manager.quit(sender, QuitMethod.SNEAK);
-			if(inputPacket.isJumping())
-				manager.quit(sender, QuitMethod.JUMP);
-		}else if(packet instanceof ServerboundSetCarriedItemPacket setSlotPacket) {
-			int oSlot = sender.getInventory().getHeldItemSlot();
-			if(oSlot != setSlotPacket.getSlot()) {
-				nmsHandler.broadcast(sender, new ClientboundSetCarriedItemPacket(oSlot));
-				return false;
-			}
-		}
-		return true;
-	}
-
-	@Override
-	public List<Object> write(Player receiver, Object packet) {
-		if(packet instanceof ClientboundSetEquipmentPacket equipmentPacket) {
-			int id = equipmentPacket.getEntity();
-			final var spawnedPlayer = playerTracker.get(id);
-			if(spawnedPlayer == null)
-				return null;
-			final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(spawnedPlayer);
-			if(profile != null)
-				return List.of(new ClientboundSetEquipmentPacket(id, empty));
-		}
-		return null;
-	}
-}
diff --git a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileHatImpl.java b/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileHatImpl.java
deleted file mode 100644
index 5480c3366cfaa85a1b9c34b2ab66940d5198914f..0000000000000000000000000000000000000000
--- a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileHatImpl.java
+++ /dev/null
@@ -1,197 +0,0 @@
-package io.lumine.cosmetics.nms.v1_18_R2.cosmetic;
-
-import com.google.common.collect.Maps;
-import com.mojang.datafixers.util.Pair;
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
-import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
-import io.lumine.cosmetics.api.players.CosmeticProfile;
-import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.managers.hats.Hat;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_18_R2;
-import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
-import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.reflection.Reflector;
-import io.netty.buffer.Unpooled;
-import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
-import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
-import net.minecraft.network.protocol.game.ServerboundAcceptTeleportationPacket;
-import net.minecraft.world.entity.EquipmentSlot;
-import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-public class VolatileHatImpl implements VolatileEquipmentHelper {
-
-    @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_18_R2 nmsHandler;
-    private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
-
-    public VolatileHatImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_18_R2 nmsHandler) {
-        this.plugin = plugin;
-        this.nmsHandler = nmsHandler;
-    }
-    
-    @Override
-    public void apply(CosmeticProfile profile) {
-
-        if (profile == null)
-            return;
-
-        Player player = profile.getPlayer();
-
-        final var maybeEquipped = profile.getEquipped(Hat.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var opt = maybeEquipped.get().getCosmetic();
-        
-        if(!(opt instanceof Hat hat)) {
-            return;
-        }
-
-        var nmsHat = CraftItemStack.asNMSCopy(hat.getCosmetic(maybeEquipped.get()));
-
-        playerTracker.put(player.getEntityId(), player);
-
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsHat)));
-
-        nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-    }
-
-    @Override
-    public void unapply(CosmeticProfile profile) {
-        final var nmsPlayer = ((CraftPlayer) profile.getPlayer()).getHandle();
-        final var item = nmsPlayer.getItemBySlot(EquipmentSlot.HEAD);
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(nmsPlayer.getId(), List.of(Pair.of(EquipmentSlot.HEAD, item)));
-        nmsHandler.broadcastAroundAndSelf(nmsPlayer.getBukkitEntity(), equipmentPacket);
-    }
-
-    @Override 
-    public void equipMannequin(Mannequin mannequin, EquippedCosmetic cosmetic) {
-        if(!(cosmetic.getCosmetic() instanceof Hat hat)) {
-            return;
-        }
-        
-        final var entityId = mannequin.getEntityId();
-        final var player = mannequin.getPlayer();
-        
-        var nmsHat = CraftItemStack.asNMSCopy(hat.getCosmetic(cosmetic));
-        
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(entityId, List.of(Pair.of(EquipmentSlot.HEAD, nmsHat)));
-
-        nmsHandler.broadcast(player, equipmentPacket);
-    }
-
-    @Override
-    public void unequipMannequin(Mannequin mannequin) {
-        final var nmsPlayer = ((CraftPlayer) mannequin.getPlayer()).getHandle();
-        final var item = nmsPlayer.getItemBySlot(EquipmentSlot.HEAD);
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(nmsPlayer.getId(), List.of(Pair.of(EquipmentSlot.HEAD, item)));
-        nmsHandler.broadcast(nmsPlayer.getBukkitEntity(), equipmentPacket);
-    }
-    
-    @Override
-    public boolean read(Player sender, Object packet, boolean isCanceled) {
-        if(packet instanceof ServerboundAcceptTeleportationPacket) {
-            final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(sender);
-            if(profile == null || profile.isHidden(Hat.class))
-                return true;
-            handleSpawn(profile);
-        }
-        return true;
-    }
-
-    @Override
-    public List<Object> write(Player receiver, Object packet) {
-        /*
-        if(packet instanceof ClientboundAddPlayerPacket playerPacket) {
-            int id = playerPacket.getEntityId();
-            Profile profile = getProfile(receiver, id);
-            if(profile != null && !profile.isHidden(Hat.class)) {
-                handleSpawn(profile);
-            }
-        } else */
-        
-        if(packet instanceof ClientboundSetEquipmentPacket equipmentPacket) {
-            int id = equipmentPacket.getEntity();
-            Profile profile = getProfile(receiver, id);
-            if(profile != null && !profile.isHidden(Hat.class)) {
-                modifyPacket(profile, equipmentPacket);
-            }
-        }
-        
-        return null;
-    }
-
-    private Profile getProfile(Player receiver, int id) {
-        final var entity = nmsHandler.getEntity(receiver.getWorld(), id);
-        if(!(entity instanceof Player player))
-            return null;
-        return plugin.getProfiles().getProfile(player);
-    }
-
-    public void handleSpawn(Profile profile) {
-
-        final var maybeEquipped = profile.getEquipped(Hat.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var equip = maybeEquipped.get();
-        var opt = equip.getCosmetic();
-        
-        if(!(opt instanceof ItemCosmetic hat)) {
-            return;
-        }
-
-        final var player = profile.getPlayer();
-        final var nmsHat = CraftItemStack.asNMSCopy(hat.getCosmetic(equip));
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsHat)));
-
-        nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-    }
-    
-    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, "c");
-    
-    private void modifyPacket(Profile profile, ClientboundSetEquipmentPacket packet) {
-        final var maybeEquipped = profile.getEquipped(Hat.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var equip = maybeEquipped.get();
-        var opt = equip.getCosmetic();
-        
-        if(!(opt instanceof ItemCosmetic hat)) {
-            return;
-        }
-
-        final var nmsItem = CraftItemStack.asNMSCopy(hat.getCosmetic(equip));
-        
-        var slots = (List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>>) packet.getSlots();
-        List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>> newSlots = new ArrayList<>();
-
-        boolean foundHead = false;
-        for(var pair : slots) {
-            final EquipmentSlot slot = pair.getFirst();
-            
-            if(slot == EquipmentSlot.HEAD) {
-                foundHead = true;
-                newSlots.add(Pair.of(pair.getFirst(), nmsItem));
-            } else {
-                newSlots.add(pair);
-            }
-        }
-        if(!foundHead) {
-            newSlots.add(Pair.of(EquipmentSlot.HEAD, nmsItem));
-        }
-        
-        refEq.set(packet, "c", newSlots);
-    }
-
-}
diff --git a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileOffhandImpl.java b/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileOffhandImpl.java
deleted file mode 100644
index 61afcf5218fb02cc350f0d89575d0659fa32cc2e..0000000000000000000000000000000000000000
--- a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileOffhandImpl.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package io.lumine.cosmetics.nms.v1_18_R2.cosmetic;
-
-import com.google.common.collect.Maps;
-import com.mojang.datafixers.util.Pair;
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
-import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
-import io.lumine.cosmetics.api.players.CosmeticProfile;
-import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.managers.hats.Hat;
-import io.lumine.cosmetics.managers.offhand.Offhand;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_18_R2;
-import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
-import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.reflection.Reflector;
-import io.netty.buffer.Unpooled;
-import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
-import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
-import net.minecraft.world.entity.EquipmentSlot;
-import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-public class VolatileOffhandImpl implements VolatileEquipmentHelper {
-
-    @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_18_R2 nmsHandler;
-    private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
-
-    public VolatileOffhandImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_18_R2 nmsHandler) {
-        this.plugin = plugin;
-        this.nmsHandler = nmsHandler;
-    }
-    
-    @Override
-    public void apply(CosmeticProfile profile) {
-
-        if (profile == null)
-            return;
-
-        Player player = profile.getPlayer();
-       
-        final var maybeEquipped = profile.getEquipped(Offhand.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var equip = maybeEquipped.get();
-        var opt = equip.getCosmetic();
-        
-        if(!(opt instanceof ItemCosmetic offhand))
-            return;
-
-        var nmsOffhand = CraftItemStack.asNMSCopy(offhand.getCosmetic(equip));
-
-        playerTracker.put(player.getEntityId(), player);
-
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), List.of(Pair.of(EquipmentSlot.OFFHAND, nmsOffhand)));
-
-        nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-
-    }
-
-    @Override
-    public void unapply(CosmeticProfile profile) {
-        final var nmsPlayer = ((CraftPlayer) profile.getPlayer()).getHandle();
-        final var item = nmsPlayer.getItemBySlot(EquipmentSlot.OFFHAND);
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(nmsPlayer.getId(), List.of(Pair.of(EquipmentSlot.OFFHAND, item)));
-        nmsHandler.broadcastAroundAndSelf(nmsPlayer.getBukkitEntity(), equipmentPacket);
-    }
-    
-    @Override 
-    public void equipMannequin(Mannequin mannequin, EquippedCosmetic cosmetic) {
-        if(!(cosmetic.getCosmetic() instanceof Offhand offhand)) {
-            return;
-        }
-        
-        final var entityId = mannequin.getEntityId();
-        final var player = mannequin.getPlayer();
-        
-        var nmsHat = CraftItemStack.asNMSCopy(offhand.getCosmetic(cosmetic));
-        
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(entityId, List.of(Pair.of(EquipmentSlot.OFFHAND, nmsHat)));
-
-        nmsHandler.broadcast(player, equipmentPacket);
-    }
-
-    @Override
-    public void unequipMannequin(Mannequin mannequin) {
-        final var nmsPlayer = ((CraftPlayer) mannequin.getPlayer()).getHandle();
-        final var item = nmsPlayer.getItemBySlot(EquipmentSlot.OFFHAND);
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(nmsPlayer.getId(), List.of(Pair.of(EquipmentSlot.OFFHAND, item)));
-        nmsHandler.broadcast(nmsPlayer.getBukkitEntity(), equipmentPacket);
-    }
-
-    @Override
-    public List<Object> write(Player receiver, Object packet) {
-        if(packet instanceof ClientboundSetEquipmentPacket equipmentPacket) {
-            int id = equipmentPacket.getEntity();
-            Profile profile = getProfile(receiver, id);
-            if(profile != null && !profile.isHidden(Offhand.class))
-                modifyPacket(profile, equipmentPacket);
-        }
-
-        return null;
-    }
-
-    private Profile getProfile(Player receiver, int id) {
-        final var entity = nmsHandler.getEntity(receiver.getWorld(), id);
-        if(!(entity instanceof Player player))
-            return null;
-        return plugin.getProfiles().getProfile(player);
-    }
-
-    public void handleSpawn(Profile profile) {
-        final var maybeEquipped = profile.getEquipped(Offhand.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var equip = maybeEquipped.get();
-        var opt = equip.getCosmetic();
-        
-        if(!(opt instanceof ItemCosmetic offhand))
-            return;
-
-        final var player = profile.getPlayer();
-        final var nmsOffhand = CraftItemStack.asNMSCopy(offhand.getCosmetic(equip));
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), List.of(Pair.of(EquipmentSlot.OFFHAND, nmsOffhand)));
-        nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-    }
-    
-    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, "c");
-    
-    private void modifyPacket(Profile profile, ClientboundSetEquipmentPacket packet) {
-        final var maybeEquipped = profile.getEquipped(Hat.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var equip = maybeEquipped.get();
-        var opt = equip.getCosmetic();
-        
-        if(!(opt instanceof ItemCosmetic hat)) {
-            return;
-        }
-
-        final var nmsItem = CraftItemStack.asNMSCopy(hat.getCosmetic(equip));
-        
-        var slots = (List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>>) packet.getSlots();
-        List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>> newSlots = new ArrayList<>();
-
-        boolean foundHead = false;
-        for(var pair : slots) {
-            final EquipmentSlot slot = pair.getFirst();
-            
-            if(slot == EquipmentSlot.HEAD) {
-                foundHead = true;
-                newSlots.add(Pair.of(pair.getFirst(), nmsItem));
-            } else {
-                newSlots.add(pair);
-            }
-        }
-        if(!foundHead) {
-            newSlots.add(Pair.of(EquipmentSlot.HEAD, nmsItem));
-        }
-        refEq.set(packet, "c", newSlots);
-    }
-
-}
diff --git a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileSprayImpl.java b/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileSprayImpl.java
deleted file mode 100644
index 972f0906762d800fe1477171b08dfd5469b0ae29..0000000000000000000000000000000000000000
--- a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/cosmetic/VolatileSprayImpl.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package io.lumine.cosmetics.nms.v1_18_R2.cosmetic;
-
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.managers.sprays.Spray;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_18_R2;
-import io.lumine.cosmetics.nms.cosmetic.VolatileSprayHelper;
-import lombok.Getter;
-import net.minecraft.core.BlockPos;
-import net.minecraft.core.Direction;
-import net.minecraft.network.protocol.game.ClientboundAddEntityPacket;
-import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket;
-import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
-import net.minecraft.world.entity.decoration.ItemFrame;
-import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.block.BlockFace;
-import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.MapMeta;
-
-public class VolatileSprayImpl implements VolatileSprayHelper {
-
-    @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_18_R2 nmsHandler;
-
-    public VolatileSprayImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_18_R2 nmsHandler) {
-        this.plugin = plugin;
-        this.nmsHandler = nmsHandler;
-    }
-
-    private static final ItemStack map = new ItemStack(Material.FILLED_MAP);
-    private static final MapMeta mapMeta = (MapMeta) map.getItemMeta();
-    
-    @Override
-    public int drawSpray(Spray spray, Location location, BlockFace face, int rotation) {
-        var world = ((CraftWorld) location.getWorld()).getHandle();
-        var pos = new BlockPos(location.getX(), location.getY(), location.getZ());
-
-        var image = spray.getImage();
-        
-        mapMeta.setMapId(image.getMapNumber());
-        map.setItemMeta(mapMeta);
-        
-        var nmsMap = CraftItemStack.asNMSCopy(map);
-
-        final int dir = switch(face) {
-            case DOWN  -> 0;
-            case UP    -> 1;
-            case NORTH -> 2;
-            case SOUTH -> 3;
-            case WEST  -> 4;
-            case EAST  -> 5;
-            default    -> 1;
-        };
-        
-        var frame = new ItemFrame(world, pos, Direction.UP);
-        frame.setItem(nmsMap);
-        frame.setInvisible(true);
-        frame.setRotation(rotation);
-
-        var packetAdd = new ClientboundAddEntityPacket(frame, dir);
-        var packetData = new ClientboundSetEntityDataPacket(frame.getId(), frame.getEntityData(), true);
-        var packetMap = constructMapPacket(image.getMapNumber(), image.getPixels());
-        
-        nmsHandler.broadcast(packetAdd, packetData, packetMap);
-        
-        return frame.getId();
-    }
-    
-    private static final int startX = 0;
-    private static final int startY = 0;
-    private static final int mapWidth = 128;
-    private static final int mapHeight = 128;
-    private static final byte mapScale = 1;
-    private static final boolean mapLocked = true;
-    
-    private ClientboundMapItemDataPacket constructMapPacket(int id, byte[] pixels) {
-        var mapData = constructMapData(startX, startY, mapWidth, mapHeight, pixels);
-        var packet = new ClientboundMapItemDataPacket(id, mapScale, mapLocked, null, mapData);
-
-        return packet;
-    }
-    
-    private MapItemSavedData.MapPatch constructMapData(int startX, int startY, int width, int height, byte[] pixels) {
-        return new MapItemSavedData.MapPatch(startX, startY, width, height, pixels);
-    }
-
-}
diff --git a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/wardrobe/MannequinEntity.java b/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/wardrobe/MannequinEntity.java
deleted file mode 100644
index fac6b642f288164d5c81966c4e32113d1b4edb2c..0000000000000000000000000000000000000000
--- a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/wardrobe/MannequinEntity.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package io.lumine.cosmetics.nms.v1_18_R2.wardrobe;
-
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-
-import com.google.common.collect.Maps;
-import com.mojang.authlib.GameProfile;
-import com.mojang.datafixers.util.Pair;
-
-import io.lumine.cosmetics.api.cosmetics.Cosmetic;
-import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.api.players.wardrobe.WardrobeTracker;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_18_R2;
-import io.netty.buffer.Unpooled;
-import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
-import net.minecraft.network.protocol.game.ClientboundAnimatePacket;
-import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket;
-import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
-import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket;
-import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
-import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket;
-import net.minecraft.server.level.ServerPlayer;
-import net.minecraft.world.entity.EquipmentSlot;
-
-public class MannequinEntity implements Mannequin {
-
-    private final VolatileCodeEnabled_v1_18_R2 handler;
-    @Getter private final WardrobeTracker tracker;
-    @Getter private final UUID uniqueId;
-    @Getter private final Player player;
-    @Getter private final Location location;
-    @Getter private float rotation;
-    
-    @Getter private ServerPlayer fakePlayer;
-    private Map<Class<? extends Cosmetic>,Integer> extraEntities = Maps.newConcurrentMap();
-
-    public MannequinEntity(WardrobeTracker tracker, VolatileCodeEnabled_v1_18_R2 handler, Player player, Location location) {
-        this.tracker = tracker;
-        this.handler = handler;
-        this.player = player;
-        this.location = location;
-        this.uniqueId = UUID.randomUUID();
-        
-        var serverPlayer = ((CraftPlayer) player).getHandle();
-        var level = ((CraftWorld) location.getWorld()).getHandle();
-
-        this.rotation = serverPlayer.getYRot() + 180;
-        
-        if(rotation > 180) { 
-            rotation = rotation - 360;
-        }
-        
-        var gameProfile = serverPlayer.getGameProfile();
-        
-        gameProfile = new GameProfile(uniqueId, "Wardrobe");
-        gameProfile.getProperties().putAll(serverPlayer.getGameProfile().getProperties());
-        
-        this.fakePlayer = new ServerPlayer(level.getServer(), level, gameProfile);
-        
-        var spawn = new FriendlyByteBuf(Unpooled.buffer());
-        
-        spawn.writeVarInt(fakePlayer.getId());
-        spawn.writeUUID(fakePlayer.getUUID());
-        spawn.writeDouble(location.getX());
-        spawn.writeDouble(location.getY());
-        spawn.writeDouble(location.getZ());
-        spawn.writeByte((byte)(int)(serverPlayer.getYRot() * 256.0F / 360.0F));
-        spawn.writeByte((byte)(int)(serverPlayer.getXRot() * 256.0F / 360.0F));
-
-        var packetPlayerInfo = new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.ADD_PLAYER, fakePlayer);
-        var packetAddPlayer = new ClientboundAddPlayerPacket(spawn);
-
-        var equipmentPacket = new ClientboundSetEquipmentPacket(fakePlayer.getId(), 
-                List.of(Pair.of(EquipmentSlot.HEAD, serverPlayer.getItemBySlot(EquipmentSlot.HEAD)),
-                        Pair.of(EquipmentSlot.CHEST, serverPlayer.getItemBySlot(EquipmentSlot.CHEST)),
-                        Pair.of(EquipmentSlot.LEGS, serverPlayer.getItemBySlot(EquipmentSlot.LEGS)),
-                        Pair.of(EquipmentSlot.FEET, serverPlayer.getItemBySlot(EquipmentSlot.FEET)),
-                        Pair.of(EquipmentSlot.MAINHAND, serverPlayer.getItemBySlot(EquipmentSlot.MAINHAND)),
-                        Pair.of(EquipmentSlot.OFFHAND, serverPlayer.getItemBySlot(EquipmentSlot.OFFHAND))));
-
-        var head = (byte)(int)(rotation * 256.0F / 360.0F);
-        var rotatePacket = new ClientboundRotateHeadPacket(fakePlayer, head);
-        
-        var swingPacket = new ClientboundAnimatePacket(fakePlayer, 0);
-        
-        handler.broadcast(player, packetPlayerInfo, packetAddPlayer, equipmentPacket, rotatePacket, swingPacket);
-        
-        for(var eq : handler.getPlugin().getProfiles().getProfile(player).getEquipped().values()) {
-            eq.getCosmetic().getManager().equipMannequin(this, eq);
-        }
-    }
-    
-    public void despawn() {
-        var packetPlayerInfo = new ClientboundPlayerInfoPacket(ClientboundPlayerInfoPacket.Action.REMOVE_PLAYER, fakePlayer);
-        var packetRemovePlayer = new ClientboundRemoveEntitiesPacket(fakePlayer.getId());
-        
-        handler.broadcast(player, packetPlayerInfo, packetRemovePlayer);
-        
-        for(var i : extraEntities.values()) {
-            var removePacket = new ClientboundRemoveEntitiesPacket(i);
-            handler.broadcast(player, removePacket);
-        }
-    }
-    
-    public void addExtraEntity(Class<? extends Cosmetic> type, int id) {
-        extraEntities.put(type, id);
-    }
-    
-    public void removeExtraEntity(Class<? extends Cosmetic> type) {
-        var id = extraEntities.remove(type);
-        
-        if(id != null) {
-            var removePacket = new ClientboundRemoveEntitiesPacket(id);
-            handler.broadcast(player, removePacket);
-        }
-    }
-    
-    public int getEntityId() {
-        return fakePlayer.getId();
-    }
-
-}
diff --git a/v1_19_R2/pom.xml b/v1_19_R2/pom.xml
deleted file mode 100644
index 0262f4a64f6ee0f7df9d9ba1908dd88c01af35d4..0000000000000000000000000000000000000000
--- a/v1_19_R2/pom.xml
+++ /dev/null
@@ -1,164 +0,0 @@
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    
-    <artifactId>MCCosmetics-v1_19_R2</artifactId>
-    <parent>
-        <groupId>io.lumine</groupId>
-        <artifactId>MCCosmetics-Plugin</artifactId>
-        <version>${mccosmetics.version}</version>
-    </parent>
-
-    <build> 
-        <plugins>
-            <plugin>
-                <groupId>net.md-5</groupId>
-                <artifactId>specialsource-maven-plugin</artifactId>
-                <version>1.2.3</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>remap</goal>
-                        </goals>
-                        <id>remap-obf</id>
-                        <configuration>
-                            <srgIn>org.spigotmc:minecraft-server:1.19.3-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
-                            <reverse>true</reverse>
-                            <remappedDependencies>org.spigotmc:spigot:1.19.3-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
-                            <remappedArtifactAttached>true</remappedArtifactAttached>
-                            <remappedClassifierName>remapped-obf</remappedClassifierName>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>remap</goal>
-                        </goals>
-                        <id>remap-spigot</id>
-                        <configuration>
-                            <inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
-                            <srgIn>org.spigotmc:minecraft-server:1.19.3-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
-                            <remappedDependencies>org.spigotmc:spigot:1.19.3-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>  
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>flatten-maven-plugin</artifactId>
-                <version>1.2.2</version>
-                <configuration>
-                    <updatePomFile>true</updatePomFile>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>flatten</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>flatten</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>flatten.clean</id>
-                        <phase>clean</phase>
-                        <goals>
-                            <goal>clean</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build> 
-    <repositories> 
-        <repository>
-            <id>spigot-repo</id> 
-            <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
-        </repository>
-        <repository>
-            <id>lumine</id>
-            <url>https://mvn.lumine.io/repository/maven/</url>
-        </repository>
-        <repository>
-           <id>paper-repo</id>
-           <url>https://papermc.io/repo/repository/maven-public/</url>
-        </repository>
-        <repository>
-            <id>minecraft-libraries</id>
-            <name>Minecraft Libraries</name>
-            <url>https://libraries.minecraft.net</url>
-        </repository>
-    </repositories>
-
-    <dependencies>
-        <!-- Modules -->
-        <dependency>
-            <groupId>io.lumine</groupId>
-            <artifactId>LumineUtils</artifactId>
-            <version>${lumineutils.version}</version>
-            <scope>provided</scope> 
-        </dependency>
-        <dependency>
-            <groupId>io.lumine</groupId>
-            <artifactId>MCCosmetics</artifactId>
-            <version>${project.parent.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency> 
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <version>${lombok.version}</version>
-            <scope>provided</scope>
-        </dependency>
-
-        <!-- Spigot API -->
-        <dependency>
-            <groupId>org.spigotmc</groupId>
-            <artifactId>spigot-api</artifactId>
-            <version>1.19.3-R0.1-SNAPSHOT</version>
-            <classifier>shaded</classifier>
-            <scope>provided</scope>
-        </dependency> 
-        
-        <!-- Spigot NMS version -->  
-        <dependency>
-            <groupId>org.spigotmc</groupId>
-            <artifactId>spigot</artifactId>
-            <version>1.19.3-R0.1-SNAPSHOT</version>
-            <classifier>remapped-mojang</classifier>
-            <scope>provided</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>*</groupId>
-                    <artifactId>*</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>com.mojang</groupId>
-            <artifactId>authlib</artifactId>
-            <version>3.11.50</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.mojang</groupId>
-            <artifactId>datafixerupper</artifactId>
-            <version>1.0.20</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty-all</artifactId>
-            <version>4.1.68.Final</version>
-            <scope>provided</scope>
-        </dependency>
-        
-        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <version>1.8.0-beta4</version>
-        </dependency>
-
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_19_R2.java b/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_19_R2.java
deleted file mode 100644
index d54012c5e7f6387b785aee842b7f7dee12fb7b08..0000000000000000000000000000000000000000
--- a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_19_R2.java
+++ /dev/null
@@ -1,184 +0,0 @@
-package io.lumine.cosmetics.nms;
-
-import com.google.common.collect.Maps;
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.Cosmetic;
-import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.api.players.wardrobe.WardrobeTracker;
-import io.lumine.cosmetics.managers.back.BackAccessory;
-import io.lumine.cosmetics.managers.gestures.Gesture;
-import io.lumine.cosmetics.managers.hats.Hat;
-import io.lumine.cosmetics.managers.offhand.Offhand;
-import io.lumine.cosmetics.managers.sprays.Spray;
-import io.lumine.cosmetics.nms.cosmetic.VolatileCosmeticHelper;
-import io.lumine.cosmetics.nms.v1_19_R2.cosmetic.*;
-import io.lumine.cosmetics.nms.v1_19_R2.network.VolatileChannelHandler;
-import io.lumine.cosmetics.nms.v1_19_R2.wardrobe.MannequinEntity;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelPipeline;
-import lombok.Getter;
-import net.minecraft.network.Connection;
-import net.minecraft.network.protocol.Packet;
-import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
-import net.minecraft.server.level.ServerLevel;
-import net.minecraft.server.level.ServerPlayer;
-import net.minecraft.world.level.entity.LevelEntityGetter;
-
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
-import org.bukkit.World;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftLivingEntity;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
-
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.Map;
-
-public class VolatileCodeEnabled_v1_19_R2 implements VolatileCodeHandler {
-
-    @Getter private final MCCosmeticsPlugin plugin;
-    private final Map<Class<? extends Cosmetic>, VolatileCosmeticHelper> cosmeticHelpers = Maps.newConcurrentMap();
-    
-    private Method entityGetter;
-
-    public VolatileCodeEnabled_v1_19_R2(MCCosmeticsPlugin plugin) {
-        this.plugin = plugin;
-        cosmeticHelpers.put(Hat.class, new VolatileHatImpl(plugin, this));
-        cosmeticHelpers.put(BackAccessory.class, new VolatileBackImpl(plugin, this));
-        cosmeticHelpers.put(Spray.class, new VolatileSprayImpl(plugin, this));
-        cosmeticHelpers.put(Offhand.class, new VolatileOffhandImpl(plugin, this));
-        cosmeticHelpers.put(Gesture.class, new VolatileGestureImpl(plugin, this));
-        
-        for(var method : ServerLevel.class.getMethods()) {
-            if(LevelEntityGetter.class.isAssignableFrom(method.getReturnType()) && method.getReturnType() != LevelEntityGetter.class) {
-                entityGetter = method;
-                break;
-            }
-        }
-    }
-
-    @Override
-    public VolatileCosmeticHelper getCosmeticHelper(Class<? extends Cosmetic> tClass) {
-        return cosmeticHelpers.get(tClass);
-    }
-
-    @Override
-    public Collection<VolatileCosmeticHelper> getCosmeticHelpers() {
-        return cosmeticHelpers.values();
-    }
-
-    @Override
-    public void injectPlayer(Player player) {
-        ServerPlayer ply = ((CraftPlayer) player).getHandle();
-        VolatileChannelHandler cdh = new VolatileChannelHandler(player, this);
-
-        ChannelPipeline pipeline = ply.connection.getConnection().channel.pipeline();
-        for (String name : pipeline.toMap().keySet()) {
-            if (pipeline.get(name) instanceof Connection) {
-                pipeline.addBefore(name, "mc_cosmetics_packet_handler", cdh);
-                break;
-            }
-        }
-    }
-
-    @Override
-    public void removePlayer(Player player) {
-        Channel channel = ((CraftPlayer) player).getHandle().connection.getConnection().channel;
-        channel.eventLoop().submit(() -> {
-            channel.pipeline().remove("mc_cosmetics_packet_handler");
-            return null;
-        });
-    }
-
-    public void broadcast(Packet<?>... packets) {
-        for(Player player : Bukkit.getOnlinePlayers()) {
-            var connection = ((CraftPlayer) player).getHandle().connection;
-            for(Packet<?> packet : packets) {
-                connection.send(packet);
-            }
-        }
-    }
-
-    public void broadcast(Player player, Packet<?>... packets) {
-        var connection = ((CraftPlayer) player).getHandle().connection;
-        for(Packet<?> packet : packets) {
-            connection.send(packet);
-        }
-    }
-
-    public void broadcastAroundAndSelf(Player wearer, Packet<?>... packets) {
-        final var level = ((CraftWorld) wearer.getWorld()).getHandle();
-        final var trackedEntity = level.getChunkSource().chunkMap.entityMap.get(wearer.getEntityId());
-
-        if(trackedEntity == null) {
-            broadcast(wearer.getWorld(), packets);
-            return;
-        }
-
-        for(Packet<?> packet : packets)
-            trackedEntity.broadcastAndSend(packet);
-    }
-
-    public void broadcastAround(Player wearer, Packet<?>... packets) {
-        final var level = ((CraftWorld) wearer.getWorld()).getHandle();
-        final var trackedEntity = level.getChunkSource().chunkMap.entityMap.get(wearer.getEntityId());
-
-        if(trackedEntity == null) {
-            broadcast(wearer.getWorld(), packets);
-            return;
-        }
-
-        for(Packet<?> packet : packets)
-            trackedEntity.broadcast(packet);
-    }
-
-    public void broadcast(World world, Packet<?>... packets) {
-        for(Player player : world.getPlayers()) {
-            var connection = ((CraftPlayer) player).getHandle().connection;
-            for(Packet<?> packet : packets) {
-                connection.send(packet);
-            }
-        }
-    }
-
-    public Entity getEntity(World world, int id) {
-        ServerLevel level = ((CraftWorld) world).getHandle();
-        
-        try {
-            var getter = entityGetter != null ?
-                    (LevelEntityGetter<net.minecraft.world.entity.Entity>) entityGetter.invoke(level) :
-                    level.entityManager.getEntityGetter();
-
-            final var entity = getter.get(id);
-            return entity == null ? null : entity.getBukkitEntity();
-        } catch(Exception | Error ex) {
-            ex.printStackTrace();
-            return null;
-        }
-    }
-    
-    @Override
-    public Mannequin createMannequin(WardrobeTracker tracker, Player player, Location location) {
-        return new MannequinEntity(tracker,this,player,location);
-    }
-    
-    @Override
-    public void removeFakeEntity(int id) {
-        ClientboundRemoveEntitiesPacket packet = new ClientboundRemoveEntitiesPacket(id);
-        broadcast(packet);
-    }
-
-    @Override
-    public void setBodyYaw(LivingEntity entity, double yaw) {
-        ((CraftLivingEntity) entity).getHandle().yBodyRot = (float) yaw;
-    }
-
-    @Override
-    public float getBodyYaw(LivingEntity entity) {
-        return ((CraftLivingEntity) entity).getHandle().yBodyRot;
-    }
-}
diff --git a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileHatImpl.java b/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileHatImpl.java
deleted file mode 100644
index c5831f673937a33a5b519e7a2a1a96fb61a32043..0000000000000000000000000000000000000000
--- a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileHatImpl.java
+++ /dev/null
@@ -1,199 +0,0 @@
-package io.lumine.cosmetics.nms.v1_19_R2.cosmetic;
-
-import com.google.common.collect.Maps;
-import com.mojang.datafixers.util.Pair;
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
-import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
-import io.lumine.cosmetics.api.players.CosmeticProfile;
-import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.managers.hats.Hat;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R2;
-import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
-import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.logging.Log;
-import io.lumine.utils.reflection.Reflector;
-import io.netty.buffer.Unpooled;
-import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
-import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
-import net.minecraft.network.protocol.game.ServerboundAcceptTeleportationPacket;
-import net.minecraft.world.entity.EquipmentSlot;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-public class VolatileHatImpl implements VolatileEquipmentHelper {
-
-    @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_19_R2 nmsHandler;
-    //private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
-
-    public VolatileHatImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R2 nmsHandler) {
-        this.plugin = plugin;
-        this.nmsHandler = nmsHandler;
-    }
-    
-    @Override
-    public void apply(CosmeticProfile profile) {
-
-        if (profile == null)
-            return;
-
-        Player player = profile.getPlayer();
-
-        final var maybeEquipped = profile.getEquipped(Hat.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var opt = maybeEquipped.get().getCosmetic();
-        
-        if(!(opt instanceof Hat hat))
-            return;
-
-        var nmsHat = CraftItemStack.asNMSCopy(hat.getCosmetic(maybeEquipped.get()));
-
-        //playerTracker.put(player.getEntityId(), player);
-
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsHat)));
-
-        nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-    }
-    
-    @Override
-    public void unapply(CosmeticProfile profile) {
-        final var nmsPlayer = ((CraftPlayer) profile.getPlayer()).getHandle();
-        final var item = nmsPlayer.getItemBySlot(EquipmentSlot.HEAD);
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(nmsPlayer.getId(), List.of(Pair.of(EquipmentSlot.HEAD, item)));
-        nmsHandler.broadcastAroundAndSelf(nmsPlayer.getBukkitEntity(), equipmentPacket);
-    }
-    
-    @Override 
-    public void equipMannequin(Mannequin mannequin, EquippedCosmetic cosmetic) {
-        if(!(cosmetic.getCosmetic() instanceof Hat hat)) {
-            return;
-        }
-        
-        final var entityId = mannequin.getEntityId();
-        final var player = mannequin.getPlayer();
-        
-        var nmsHat = CraftItemStack.asNMSCopy(hat.getCosmetic(cosmetic));
-        
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(entityId, 
-                List.of(Pair.of(EquipmentSlot.HEAD, nmsHat)));
-
-        nmsHandler.broadcast(player, equipmentPacket);
-    }
-
-    @Override
-    public void unequipMannequin(Mannequin mannequin) {
-        final var nmsPlayer = ((CraftPlayer) mannequin.getPlayer()).getHandle();
-        final var item = nmsPlayer.getItemBySlot(EquipmentSlot.HEAD);
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(nmsPlayer.getId(), List.of(Pair.of(EquipmentSlot.HEAD, item)));
-        nmsHandler.broadcast(nmsPlayer.getBukkitEntity(), equipmentPacket);
-    }
-    
-    @Override
-    public boolean read(Player sender, Object packet, boolean isCanceled) {
-        if(packet instanceof ServerboundAcceptTeleportationPacket) {
-            final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(sender);
-            if(profile == null || profile.isHidden(Hat.class))
-                return true;
-            handleSpawn(profile);
-        }
-        return true;
-    }
-
-    @Override
-    public List<Object> write(Player receiver, Object packet) {
-        /*
-        if(packet instanceof ClientboundAddPlayerPacket playerPacket) {
-            int id = playerPacket.getEntityId();
-            Profile profile = getProfile(receiver, id);
-            if(profile != null && !profile.isHidden(Hat.class)) {
-                handleSpawn(profile);
-            }
-        } else */
-        
-        if(packet instanceof ClientboundSetEquipmentPacket equipmentPacket) {
-            int id = equipmentPacket.getEntity();
-            Profile profile = getProfile(receiver, id);
-            if(profile != null && !profile.isHidden(Hat.class)) {
-                modifyPacket(profile, equipmentPacket);
-            }
-        }
-        
-        return null;
-    }
-
-    private Profile getProfile(Player receiver, int id) {
-        final var entity = nmsHandler.getEntity(receiver.getWorld(), id);
-        if(!(entity instanceof Player player))
-            return null;
-        return plugin.getProfiles().getProfile(player);
-    }
-
-    public void handleSpawn(Profile profile) {
-
-        final var maybeEquipped = profile.getEquipped(Hat.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var equip = maybeEquipped.get();
-        var opt = equip.getCosmetic();
-        
-        if(!(opt instanceof ItemCosmetic hat)) {
-            return;
-        }
-
-        final var player = profile.getPlayer();
-        final var nmsHat = CraftItemStack.asNMSCopy(hat.getCosmetic(equip));
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsHat)));
-
-        nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-    }
-    
-    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, "c");
-    
-    private void modifyPacket(Profile profile, ClientboundSetEquipmentPacket packet) {
-        final var maybeEquipped = profile.getEquipped(Hat.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var equip = maybeEquipped.get();
-        var opt = equip.getCosmetic();
-        
-        if(!(opt instanceof ItemCosmetic hat)) {
-            return;
-        }
-
-        final var nmsItem = CraftItemStack.asNMSCopy(hat.getCosmetic(equip));
-        
-        var slots = (List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>>) packet.getSlots();
-        List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>> newSlots = new ArrayList<>();
-
-        boolean foundHead = false;
-        for(var pair : slots) {
-            final EquipmentSlot slot = pair.getFirst();
-            
-            if(slot == EquipmentSlot.HEAD) {
-                foundHead = true;
-                newSlots.add(Pair.of(pair.getFirst(), nmsItem));
-            } else {
-                newSlots.add(pair);
-            }
-        }
-        if(!foundHead) {
-            newSlots.add(Pair.of(EquipmentSlot.HEAD, nmsItem));
-        }
-        
-        refEq.set(packet, "c", newSlots);
-    }
-
-}
diff --git a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileOffhandImpl.java b/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileOffhandImpl.java
deleted file mode 100644
index 0a7b6271f6415fb69b7a97d89c5349a17a461c0d..0000000000000000000000000000000000000000
--- a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileOffhandImpl.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package io.lumine.cosmetics.nms.v1_19_R2.cosmetic;
-
-import com.google.common.collect.Maps;
-import com.mojang.datafixers.util.Pair;
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
-import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
-import io.lumine.cosmetics.api.players.CosmeticProfile;
-import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.managers.hats.Hat;
-import io.lumine.cosmetics.managers.offhand.Offhand;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R2;
-import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
-import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.reflection.Reflector;
-import io.netty.buffer.Unpooled;
-import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
-import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
-import net.minecraft.world.entity.EquipmentSlot;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-public class VolatileOffhandImpl implements VolatileEquipmentHelper {
-
-    @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_19_R2 nmsHandler;
-    private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
-
-    public VolatileOffhandImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R2 nmsHandler) {
-        this.plugin = plugin;
-        this.nmsHandler = nmsHandler;
-    }
-    
-    @Override
-    public void apply(CosmeticProfile profile) {
-
-        if (profile == null)
-            return;
-
-        Player player = profile.getPlayer();
-       
-        final var maybeEquipped = profile.getEquipped(Offhand.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var equip = maybeEquipped.get();
-        var opt = equip.getCosmetic();
-        
-        if(!(opt instanceof ItemCosmetic offhand))
-            return;
-
-        var nmsOffhand = CraftItemStack.asNMSCopy(offhand.getCosmetic(equip));
-
-        playerTracker.put(player.getEntityId(), player);
-
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), List.of(Pair.of(EquipmentSlot.OFFHAND, nmsOffhand)));
-
-        nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-
-    }
-
-    @Override
-    public void unapply(CosmeticProfile profile) {
-        final var nmsPlayer = ((CraftPlayer) profile.getPlayer()).getHandle();
-        final var item = nmsPlayer.getItemBySlot(EquipmentSlot.OFFHAND);
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(nmsPlayer.getId(), List.of(Pair.of(EquipmentSlot.OFFHAND, item)));
-        nmsHandler.broadcastAroundAndSelf(nmsPlayer.getBukkitEntity(), equipmentPacket);
-    }
-    
-    @Override 
-    public void equipMannequin(Mannequin mannequin, EquippedCosmetic cosmetic) {
-        if(!(cosmetic.getCosmetic() instanceof Offhand offhand)) {
-            return;
-        }
-        
-        final var entityId = mannequin.getEntityId();
-        final var player = mannequin.getPlayer();
-        
-        var nmsHat = CraftItemStack.asNMSCopy(offhand.getCosmetic(cosmetic));
-        
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(entityId, List.of(Pair.of(EquipmentSlot.OFFHAND, nmsHat)));
-
-        nmsHandler.broadcast(player, equipmentPacket);
-    }
-
-    @Override
-    public void unequipMannequin(Mannequin mannequin) {
-        final var nmsPlayer = ((CraftPlayer) mannequin.getPlayer()).getHandle();
-        final var item = nmsPlayer.getItemBySlot(EquipmentSlot.OFFHAND);
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(nmsPlayer.getId(), List.of(Pair.of(EquipmentSlot.OFFHAND, item)));
-        nmsHandler.broadcast(nmsPlayer.getBukkitEntity(), equipmentPacket);
-    }
-
-    @Override
-    public List<Object> write(Player receiver, Object packet) {
-        if(packet instanceof ClientboundSetEquipmentPacket equipmentPacket) {
-            int id = equipmentPacket.getEntity();
-            Profile profile = getProfile(receiver, id);
-            if(profile != null && !profile.isHidden(Offhand.class))
-                modifyPacket(profile, equipmentPacket);
-        }
-
-        return null;
-    }
-
-    private Profile getProfile(Player receiver, int id) {
-        final var entity = nmsHandler.getEntity(receiver.getWorld(), id);
-        if(!(entity instanceof Player player))
-            return null;
-        return plugin.getProfiles().getProfile(player);
-    }
-
-    public void handleSpawn(Profile profile) {
-        final var maybeEquipped = profile.getEquipped(Offhand.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var equip = maybeEquipped.get();
-        var opt = equip.getCosmetic();
-        
-        if(!(opt instanceof ItemCosmetic offhand))
-            return;
-
-        final var player = profile.getPlayer();
-        final var nmsOffhand = CraftItemStack.asNMSCopy(offhand.getCosmetic(equip));
-        ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), List.of(Pair.of(EquipmentSlot.OFFHAND, nmsOffhand)));
-        nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-    }
-    
-    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, "c");
-    
-    private void modifyPacket(Profile profile, ClientboundSetEquipmentPacket packet) {
-        final var maybeEquipped = profile.getEquipped(Hat.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var equip = maybeEquipped.get();
-        var opt = equip.getCosmetic();
-        
-        if(!(opt instanceof ItemCosmetic hat)) {
-            return;
-        }
-
-        final var nmsItem = CraftItemStack.asNMSCopy(hat.getCosmetic(equip));
-        
-        var slots = (List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>>) packet.getSlots();
-        List<Pair<EquipmentSlot,net.minecraft.world.item.ItemStack>> newSlots = new ArrayList<>();
-
-        boolean foundHead = false;
-        for(var pair : slots) {
-            final EquipmentSlot slot = pair.getFirst();
-            
-            if(slot == EquipmentSlot.HEAD) {
-                foundHead = true;
-                newSlots.add(Pair.of(pair.getFirst(), nmsItem));
-            } else {
-                newSlots.add(pair);
-            }
-        }
-        if(!foundHead) {
-            newSlots.add(Pair.of(EquipmentSlot.HEAD, nmsItem));
-        }
-        refEq.set(packet, "c", newSlots);
-    }
-
-}
diff --git a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileSprayImpl.java b/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileSprayImpl.java
deleted file mode 100644
index 57e60298334d89d787eb3dda63bc53cf9e0a5584..0000000000000000000000000000000000000000
--- a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileSprayImpl.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package io.lumine.cosmetics.nms.v1_19_R2.cosmetic;
-
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.managers.sprays.Spray;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R2;
-import io.lumine.cosmetics.nms.cosmetic.VolatileSprayHelper;
-import lombok.Getter;
-import net.minecraft.core.BlockPos;
-import net.minecraft.core.Direction;
-import net.minecraft.network.protocol.game.ClientboundAddEntityPacket;
-import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket;
-import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
-import net.minecraft.world.entity.decoration.ItemFrame;
-import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.block.BlockFace;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.MapMeta;
-
-public class VolatileSprayImpl implements VolatileSprayHelper {
-
-    @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_19_R2 nmsHandler;
-
-    public VolatileSprayImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R2 nmsHandler) {
-        this.plugin = plugin;
-        this.nmsHandler = nmsHandler;
-    }
-
-    private static final ItemStack map = new ItemStack(Material.FILLED_MAP);
-    private static final MapMeta mapMeta = (MapMeta) map.getItemMeta();
-    
-    @Override
-    public int drawSpray(Spray spray, Location location, BlockFace face, int rotation) {
-        var world = ((CraftWorld) location.getWorld()).getHandle();
-        var pos = new BlockPos(location.getX(), location.getY(), location.getZ());
-
-        var image = spray.getImage();
-        
-        mapMeta.setMapId(image.getMapNumber());
-        map.setItemMeta(mapMeta);
-        
-        var nmsMap = CraftItemStack.asNMSCopy(map);
-
-        final int dir = switch(face) {
-            case DOWN  -> 0;
-            case UP    -> 1;
-            case NORTH -> 2;
-            case SOUTH -> 3;
-            case WEST  -> 4;
-            case EAST  -> 5;
-            default    -> 1;
-        };
-        
-        var frame = new ItemFrame(world, pos, Direction.UP);
-        frame.setItem(nmsMap);
-        frame.setInvisible(true);
-        frame.setRotation(rotation);
-
-        var packetAdd = new ClientboundAddEntityPacket(frame, dir);
-        var packetData = new ClientboundSetEntityDataPacket(frame.getId(), frame.getEntityData().getNonDefaultValues());
-        var packetMap = constructMapPacket(image.getMapNumber(), image.getPixels());
-        
-        nmsHandler.broadcast(packetAdd, packetData, packetMap);
-        
-        return frame.getId();
-    }
-    
-    private static final int startX = 0;
-    private static final int startY = 0;
-    private static final int mapWidth = 128;
-    private static final int mapHeight = 128;
-    private static final byte mapScale = 1;
-    private static final boolean mapLocked = true;
-    
-    private ClientboundMapItemDataPacket constructMapPacket(int id, byte[] pixels) {
-        var mapData = constructMapData(startX, startY, mapWidth, mapHeight, pixels);
-        var packet = new ClientboundMapItemDataPacket(id, mapScale, mapLocked, null, mapData);
-
-        return packet;
-    }
-    
-    private MapItemSavedData.MapPatch constructMapData(int startX, int startY, int width, int height, byte[] pixels) {
-        return new MapItemSavedData.MapPatch(startX, startY, width, height, pixels);
-    }
-
-}
diff --git a/v1_19_R3/.gitignore b/v1_19_R3/.gitignore
deleted file mode 100644
index e3425b9cc114cdcb390fb9c7201b1ffdce23d875..0000000000000000000000000000000000000000
--- a/v1_19_R3/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/.flattened-pom.xml
diff --git a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/NMSFields.java b/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/NMSFields.java
deleted file mode 100644
index bd7a9f239f9b5e86a1db4edeb29227e9d5284986..0000000000000000000000000000000000000000
--- a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/NMSFields.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.lumine.cosmetics.nms.v1_19_R3;
-
-public class NMSFields {
-
-    public static final String PLAYER_CONNECTION = "h";
-
-}
diff --git a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/network/VolatileChannelHandler.java b/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/network/VolatileChannelHandler.java
deleted file mode 100644
index 55bd332d18018142d91c953253cb4da209420bc8..0000000000000000000000000000000000000000
--- a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/network/VolatileChannelHandler.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package io.lumine.cosmetics.nms.v1_19_R3.network;
-
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R3;
-import io.netty.channel.ChannelDuplexHandler;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelPromise;
-import lombok.Getter;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class VolatileChannelHandler extends ChannelDuplexHandler {
-
-	private final VolatileCodeEnabled_v1_19_R3 nmsHandler;
-	@Getter private final Player player;
-
-	public VolatileChannelHandler(Player player, VolatileCodeEnabled_v1_19_R3 nmsHandler) {
-		this.player = player;
-		this.nmsHandler = nmsHandler;
-	}
-
-	@Override
-	public void write(ChannelHandlerContext ctx, Object obj, ChannelPromise promise) {
-
-		try {
-
-			List<Object> packets = new ArrayList<>();
-
-			for(final var helper : nmsHandler.getCosmeticHelpers()) {
-				final var writes = helper.write(player, obj);
-				if(writes != null)
-					packets.addAll(writes);
-			}
-
-			if(!packets.contains(obj))
-				super.write(ctx, obj, promise);
-			packets.remove(obj);
-
-			for (var p : packets) {
-				super.write(ctx, p, promise.channel().newPromise());
-			}
-		}catch (Exception e) {
-			e.printStackTrace();
-		}
-
-	}
-
-	@Override
-	public void channelRead(ChannelHandlerContext ctx, Object obj) throws Exception {
-
-		boolean isCanceled = false;
-		for(final var helper : nmsHandler.getCosmeticHelpers()) {
-			isCanceled |= !helper.read(player, obj, isCanceled);
-		}
-
-		if(!isCanceled)
-			super.channelRead(ctx, obj);
-	}
-
-}
diff --git a/v1_20_R1/.gitignore b/v1_20_R1/.gitignore
deleted file mode 100644
index e3425b9cc114cdcb390fb9c7201b1ffdce23d875..0000000000000000000000000000000000000000
--- a/v1_20_R1/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/.flattened-pom.xml
diff --git a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/NMSFields.java b/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/NMSFields.java
deleted file mode 100644
index 65e1df983caba325b1a46df0271a17341675b1e4..0000000000000000000000000000000000000000
--- a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/NMSFields.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package io.lumine.cosmetics.nms.v1_20_R1;
-
-public class NMSFields {
-
-    public static final String PLAYER_CONNECTION = "h";
-
-}
diff --git a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileBackImpl.java b/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileBackImpl.java
deleted file mode 100644
index ace9801b89e2e3c98f3ad78d3de8de1800c6b624..0000000000000000000000000000000000000000
--- a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileBackImpl.java
+++ /dev/null
@@ -1,298 +0,0 @@
-package io.lumine.cosmetics.nms.v1_20_R1.cosmetic;
-
-import com.google.common.collect.Maps;
-import com.mojang.datafixers.util.Pair;
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
-import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
-import io.lumine.cosmetics.api.players.CosmeticProfile;
-import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.managers.back.BackAccessory;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_20_R1;
-import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
-import io.lumine.cosmetics.players.Profile;
-import io.netty.buffer.Unpooled;
-import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.Packet;
-import net.minecraft.network.protocol.game.*;
-import net.minecraft.world.entity.EntityType;
-import net.minecraft.world.entity.EquipmentSlot;
-import net.minecraft.world.entity.decoration.ArmorStand;
-import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
-import org.bukkit.entity.Player;
-
-import java.util.List;
-import java.util.Map;
-
-public class VolatileBackImpl implements VolatileEquipmentHelper {
-
-	@Getter
-	private final MCCosmeticsPlugin plugin;
-	private final VolatileCodeEnabled_v1_20_R1 nmsHandler;
-	private final Map<Player, ArmorStand> activeProfile = Maps.newConcurrentMap();
-	private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
-
-	public VolatileBackImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_20_R1 nmsHandler) {
-		this.plugin = plugin;
-		this.nmsHandler = nmsHandler;
-	}
-
-	@Override
-	public void apply(CosmeticProfile profile) {
-		if (profile == null)
-			return;
-		Player player = profile.getPlayer();
-		
-		var maybeEquipped = profile.getEquipped(BackAccessory.class);
-		if(maybeEquipped.isEmpty()) {
-		    return;
-		}
-		var equipped = maybeEquipped.get();
-		var cosmetic = equipped.getCosmetic();
-		
-		if (!(cosmetic instanceof ItemCosmetic back)) {
-			return;
-		}
-
-		var nmsPlayer = ((CraftPlayer) player).getHandle();
-		var nmsBack = CraftItemStack.asNMSCopy(back.getCosmetic(equipped));
-
-		ArmorStand stand = activeProfile.get(player);
-		if(stand == null) {
-			playerTracker.put(player.getEntityId(), player);
-			stand = new ArmorStand(EntityType.ARMOR_STAND, ((CraftWorld) player.getWorld()).getHandle());
-			stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + nmsPlayer.getPassengersRidingOffset() + stand.getMyRidingOffset(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
-			stand.setMarker(true);
-			stand.setInvisible(true);
-			stand.setSilent(true);
-
-			activeProfile.put(player, stand);
-
-			var mobPacket = new ClientboundAddEntityPacket(stand);
-			var dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
-			var passengersPacket = createPassengerPacket(player.getEntityId(), stand.getId());
-
-			nmsHandler.broadcastAroundAndSelf(player, mobPacket, dataPacket, passengersPacket);
-		}
-
-		stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
-
-		var equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsBack)));
-
-		nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-	}
-
-	@Override
-	public void unapply(CosmeticProfile profile) {
-		Player player = profile.getPlayer();
-		ArmorStand stand = activeProfile.remove(player);
-		if(stand == null)
-			return;
-		playerTracker.remove(player.getEntityId());
-		ClientboundRemoveEntitiesPacket removePacket = new ClientboundRemoveEntitiesPacket(stand.getId());
-		nmsHandler.broadcastAroundAndSelf(player, removePacket);
-	}
-	
-    @Override 
-    public void equipMannequin(Mannequin mannequin, EquippedCosmetic cosmetic) {
-        if(!(cosmetic.getCosmetic() instanceof BackAccessory back)) {
-            return;
-        }
-        
-        final var entityId = mannequin.getEntityId();
-        final var player = mannequin.getPlayer();
-        var nmsBack = CraftItemStack.asNMSCopy(back.getCosmetic(cosmetic));
-
-        var mannequinLocation = mannequin.getLocation();
-        
-        mannequin.removeExtraEntity(BackAccessory.class);
-
-        var stand = new ArmorStand(EntityType.ARMOR_STAND, ((CraftWorld) player.getWorld()).getHandle());
-        stand.moveTo(mannequinLocation.getX(), mannequinLocation.getY() + stand.getMyRidingOffset(), mannequinLocation.getZ(), mannequinLocation.getYaw(), 0);
-        stand.setMarker(true);
-        stand.setInvisible(true);
-        stand.setSilent(true);
-
-        mannequin.addExtraEntity(BackAccessory.class, stand.getId());
-        
-        var mobPacket = new ClientboundAddEntityPacket(stand);
-        var dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
-        var passengersPacket = createPassengerPacket(entityId, stand.getId());
-
-        nmsHandler.broadcast(player, mobPacket, dataPacket, passengersPacket);
-
-        stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
-
-        var equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsBack)));
-
-        nmsHandler.broadcast(player, equipmentPacket);
-    }
-
-    @Override
-    public void unequipMannequin(Mannequin mannequin) {
-        mannequin.removeExtraEntity(BackAccessory.class);
-    }
-
-	@Override
-	public boolean read(Player sender, Object packet, boolean isCanceled) {
-		final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(sender);
-		if(profile == null || profile.isHidden(BackAccessory.class))
-			return true;
-		if(packet instanceof ServerboundMovePlayerPacket) {
-			handleRotate(profile);
-		}else if(packet instanceof ServerboundAcceptTeleportationPacket) {
-			final var list = handleSpawn(profile);
-			if(list == null)
-				return true;
-			final var connection = ((CraftPlayer) sender).getHandle().connection;
-			for(Object obj : list) {
-				connection.send((Packet<?>) obj);
-			}
-		}
-		return true;
-	}
-
-	@Override
-	public List<Object> write(Player receiver, Object packet) {
-		if(packet instanceof ClientboundAddPlayerPacket playerPacket) {
-			int id = playerPacket.getEntityId();
-			if(playerTracker.containsKey(id)) {
-				final var spawnedPlayer = playerTracker.get(id);
-				final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(spawnedPlayer);
-				if(profile == null || profile.isHidden(BackAccessory.class))
-					return null;
-				return handleSpawn(profile);
-			}
-		}else if(packet instanceof ClientboundRemoveEntitiesPacket removePacket) {
-			for(int id : removePacket.getEntityIds()) {
-				if(playerTracker.containsKey(id)) {
-					return handleDespawn(playerTracker.get(id));
-				}
-			}
-		}
-		/*
-		else if(packet instanceof ClientboundMoveEntityPacket moveEntityPacket) {
-			FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer());
-			moveEntityPacket.write(byteBuf);
-			int id = byteBuf.readVarInt();
-			if(playerTracker.containsKey(id)) {
-				final var spawnedPlayer = playerTracker.get(id);
-				final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(spawnedPlayer);
-				if(profile == null || profile.isHidden(BackAccessory.class))
-					return null;
-				return handleMove(profile, moveEntityPacket);
-			}
-		}else if(packet instanceof ClientboundTeleportEntityPacket teleportEntityPacket) {
-			int id = teleportEntityPacket.getId();
-			if(playerTracker.containsKey(id)) {
-				final var spawnedPlayer = playerTracker.get(id);
-				final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(spawnedPlayer);
-				if(profile == null || profile.isHidden(BackAccessory.class))
-					return null;
-				return handleTeleport(profile);
-			}
-		}*/
-
-		return null;
-	}
-
-	private void handleRotate(Profile profile) {
-		if(!hasBack(profile))
-			return;
-
-		final var wearer = profile.getPlayer();
-		final var nmsPlayer = ((CraftPlayer) wearer).getHandle();
-		final var stand = activeProfile.get(wearer);
-
-		ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(stand, VolatileEquipmentHelper.toByte(nmsPlayer.getYRot()));
-		nmsHandler.broadcastAroundAndSelf(wearer, packet);
-	}
-
-	private List<Object> handleSpawn(Profile profile) {
-		if(!hasBack(profile))
-			return null;
-
-		final var wearer = profile.getPlayer();
-		final var stand = activeProfile.get(wearer);
-
-		var mobPacket = new ClientboundAddEntityPacket(stand);
-		ClientboundSetEntityDataPacket dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
-		ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, stand.getItemBySlot(EquipmentSlot.HEAD))));
-		ClientboundSetPassengersPacket passengersPacket = createPassengerPacket(wearer.getEntityId(), stand.getId());
-
-		return List.of(mobPacket, dataPacket, equipmentPacket, passengersPacket);
-	}
-
-	private List<Object> handleDespawn(Player player) {
-		final var stand = activeProfile.get(player);
-		if(stand == null)
-			return null;
-		ClientboundRemoveEntitiesPacket removePacket = new ClientboundRemoveEntitiesPacket(stand.getId());
-		return List.of(removePacket);
-	}
-
-	private List<Object> handleMove(Profile profile, ClientboundMoveEntityPacket moveEntityPacket) {
-		if(!hasBack(profile))
-			return null;
-
-		final var wearer = profile.getPlayer();
-		final var stand = activeProfile.get(wearer);
-
-		ClientboundMoveEntityPacket move;
-		if(moveEntityPacket.hasPosition() && moveEntityPacket.hasRotation()) {
-			move = new ClientboundMoveEntityPacket.PosRot(
-					stand.getId(),
-					moveEntityPacket.getXa(),
-					moveEntityPacket.getYa(),
-					moveEntityPacket.getZa(),
-					moveEntityPacket.getyRot(),
-					moveEntityPacket.getxRot(),
-					false);
-		}else if(moveEntityPacket.hasPosition()) {
-			move = new ClientboundMoveEntityPacket.Pos(
-					stand.getId(),
-					moveEntityPacket.getXa(),
-					moveEntityPacket.getYa(),
-					moveEntityPacket.getZa(),
-					false);
-		}else {
-			move = new ClientboundMoveEntityPacket.Rot(
-					stand.getId(),
-					moveEntityPacket.getyRot(),
-					moveEntityPacket.getxRot(),
-					false);
-		}
-		return List.of(move);
-	}
-
-	private List<Object> handleTeleport(Profile profile) {
-		if(!hasBack(profile))
-			return null;
-
-		final var wearer = profile.getPlayer();
-		final var nmsPlayer = ((CraftPlayer) wearer).getHandle();
-		final var stand = activeProfile.get(wearer);
-		stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + nmsPlayer.getPassengersRidingOffset() + stand.getMyRidingOffset(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
-
-		return List.of(new ClientboundTeleportEntityPacket(stand));
-	}
-
-	private boolean hasBack(Profile profile) {
-		if(profile == null)
-			return false;
-
-		var maybeBack = profile.getEquipped(BackAccessory.class);
-		return maybeBack.isPresent() && maybeBack.get().getCosmetic() instanceof ItemCosmetic && activeProfile.containsKey(profile.getPlayer());
-	}
-
-	private ClientboundSetPassengersPacket createPassengerPacket(int mount, int... driver) {
-		FriendlyByteBuf bb = new FriendlyByteBuf(Unpooled.buffer());
-		bb.writeVarInt(mount);
-		bb.writeVarIntArray(driver);
-		return new ClientboundSetPassengersPacket(bb);
-	}
-
-}
\ No newline at end of file
diff --git a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileGestureImpl.java b/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileGestureImpl.java
deleted file mode 100644
index 8258354fd28269936efb02e989060092791b8345..0000000000000000000000000000000000000000
--- a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileGestureImpl.java
+++ /dev/null
@@ -1,178 +0,0 @@
-package io.lumine.cosmetics.nms.v1_20_R1.cosmetic;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.mojang.datafixers.util.Pair;
-import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.manager.HideableCosmetic;
-import io.lumine.cosmetics.api.players.CosmeticProfile;
-import io.lumine.cosmetics.managers.gestures.Gesture;
-import io.lumine.cosmetics.managers.gestures.GestureManager;
-import io.lumine.cosmetics.managers.gestures.QuitMethod;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_20_R1;
-import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
-import io.lumine.cosmetics.players.Profile;
-import io.netty.buffer.Unpooled;
-import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.*;
-import net.minecraft.world.entity.EntityType;
-import net.minecraft.world.entity.EquipmentSlot;
-import net.minecraft.world.entity.animal.horse.Horse;
-import net.minecraft.world.item.ItemStack;
-import org.bukkit.attribute.Attribute;
-import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R1.attribute.CraftAttributeMap;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class VolatileGestureImpl implements VolatileEquipmentHelper {
-
-	private static final List<Pair<EquipmentSlot, ItemStack>> empty = new ArrayList<>();
-
-	static {
-		for(final var slot : EquipmentSlot.values())
-			empty.add(Pair.of(slot, ItemStack.EMPTY));
-	}
-
-	@Getter
-	private final MCCosmeticsPlugin plugin;
-	private final VolatileCodeEnabled_v1_20_R1 nmsHandler;
-	private final Set<Player> activeProfile = Sets.newConcurrentHashSet();
-	private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
-
-	private Horse horse;
-
-	public VolatileGestureImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_20_R1 nmsHandler) {
-		this.plugin = plugin;
-		this.nmsHandler = nmsHandler;
-	}
-
-	@Override
-	public void apply(CosmeticProfile profile) {
-		if (profile == null)
-			return;
-		Player player = profile.getPlayer();
-		if(activeProfile.contains(player))
-			return;
-
-        final var maybeEquipped = profile.getEquipped(Gesture.class);
-        if(maybeEquipped.isEmpty()) {
-            return;
-        }
-        var opt = maybeEquipped.get().getCosmetic();
-        
-        if(!(opt instanceof Gesture gesture))
-            return;
-
-		playerTracker.put(player.getEntityId(), player);
-		activeProfile.add(player);
-		if(!gesture.isCanMove())
-			getHorsed(player);
-		player.setInvisible(true);
-
-		for(final var value : ((Profile) profile).getEquipped().values()) {
-			final var manager = value.getCosmetic().getManager();
-			if(!(manager instanceof HideableCosmetic hide))
-				continue;
-			hide.hide(profile, gesture);
-		}
-		ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), empty);
-		nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-	}
-
-	@Override
-	public void unapply(CosmeticProfile profile) {
-		if (profile == null)
-			return;
-		Player player = profile.getPlayer();
-		if(!activeProfile.contains(player))
-			return;
-
-		activeProfile.remove(player);
-		playerTracker.remove(player.getEntityId());
-		nmsHandler.broadcast(player, new ClientboundRemoveEntitiesPacket(horse.getId()));
-
-		final var nmsPlayer = ((CraftPlayer) player).getHandle();
-		List<Pair<EquipmentSlot, ItemStack>> equipment = new ArrayList<>();
-		for(EquipmentSlot slot : EquipmentSlot.values())
-			equipment.add(Pair.of(slot, nmsPlayer.getItemBySlot(slot)));
-		ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), equipment);
-		nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
-
-		player.setInvisible(false);
-		for(final var value : ((Profile) profile).getEquipped().values()) {
-			final var manager = value.getCosmetic().getManager();
-			if(!(manager instanceof HideableCosmetic hide))
-				continue;
-			hide.show(profile);
-		}
-	}
-
-	private ClientboundSetPassengersPacket createPassengerPacket(int mount, int... driver) {
-		FriendlyByteBuf bb = new FriendlyByteBuf(Unpooled.buffer());
-		bb.writeVarInt(mount);
-		bb.writeVarIntArray(driver);
-		return new ClientboundSetPassengersPacket(bb);
-	}
-
-	private void getHorsed(Player player) {
-		final var nmsPlayer = ((CraftPlayer) player).getHandle();
-
-		if(horse == null) {
-			horse = new Horse(EntityType.HORSE, ((CraftWorld) player.getWorld()).getHandle());
-			horse.setInvisible(true);
-			horse.setHealth(0);
-			horse.getAttribute(CraftAttributeMap.toMinecraft(Attribute.GENERIC_MAX_HEALTH)).setBaseValue(0);
-		}
-		horse.setPos(nmsPlayer.getX(), nmsPlayer.getY() - horse.getPassengersRidingOffset() - nmsPlayer.getMyRidingOffset(), nmsPlayer.getZ());
-
-		var mobPacket = new ClientboundAddEntityPacket(horse);
-		var dataPacket = new ClientboundSetEntityDataPacket(horse.getId(), horse.getEntityData().getNonDefaultValues());
-		var attributesPacket = new ClientboundUpdateAttributesPacket(horse.getId(), horse.getAttributes().getSyncableAttributes());
-		var passengersPacket = createPassengerPacket(horse.getId(), nmsPlayer.getId());
-
-		nmsHandler.broadcast(player, mobPacket, dataPacket, attributesPacket, passengersPacket);
-	}
-
-	@Override
-	public boolean read(Player sender, Object packet, boolean isCanceled) {
-		if(!plugin.getGestureManager().getTicking().containsKey(sender)) {
-		    return true;
-		}
-
-		if(packet instanceof ServerboundPlayerInputPacket inputPacket) {
-			final var manager = (GestureManager) plugin.getGestureManager();
-			if(inputPacket.isShiftKeyDown())
-				manager.quit(sender, QuitMethod.SNEAK);
-			if(inputPacket.isJumping())
-				manager.quit(sender, QuitMethod.JUMP);
-		}else if(packet instanceof ServerboundSetCarriedItemPacket setSlotPacket) {
-			int oSlot = sender.getInventory().getHeldItemSlot();
-			if(oSlot != setSlotPacket.getSlot()) {
-				nmsHandler.broadcast(sender, new ClientboundSetCarriedItemPacket(oSlot));
-				return false;
-			}
-		}
-		return true;
-	}
-
-	@Override
-	public List<Object> write(Player receiver, Object packet) {
-		if(packet instanceof ClientboundSetEquipmentPacket equipmentPacket) {
-			int id = equipmentPacket.getEntity();
-			final var spawnedPlayer = playerTracker.get(id);
-			if(spawnedPlayer == null)
-				return null;
-			final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(spawnedPlayer);
-			if(profile != null)
-				return List.of(new ClientboundSetEquipmentPacket(id, empty));
-		}
-		return null;
-	}
-}
diff --git a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/network/VolatileChannelHandler.java b/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/network/VolatileChannelHandler.java
deleted file mode 100644
index 52f5921856fb393cd866472a632fcb4f7ecd18af..0000000000000000000000000000000000000000
--- a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/network/VolatileChannelHandler.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package io.lumine.cosmetics.nms.v1_20_R1.network;
-
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_20_R1;
-import io.netty.channel.ChannelDuplexHandler;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelPromise;
-import lombok.Getter;
-import org.bukkit.entity.Player;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class VolatileChannelHandler extends ChannelDuplexHandler {
-
-	private final VolatileCodeEnabled_v1_20_R1 nmsHandler;
-	@Getter private final Player player;
-
-	public VolatileChannelHandler(Player player, VolatileCodeEnabled_v1_20_R1 nmsHandler) {
-		this.player = player;
-		this.nmsHandler = nmsHandler;
-	}
-
-	@Override
-	public void write(ChannelHandlerContext ctx, Object obj, ChannelPromise promise) {
-
-		try {
-
-			List<Object> packets = new ArrayList<>();
-
-			for(final var helper : nmsHandler.getCosmeticHelpers()) {
-				final var writes = helper.write(player, obj);
-				if(writes != null)
-					packets.addAll(writes);
-			}
-
-			if(!packets.contains(obj))
-				super.write(ctx, obj, promise);
-			packets.remove(obj);
-
-			for (var p : packets) {
-				super.write(ctx, p, promise.channel().newPromise());
-			}
-		}catch (Exception e) {
-			e.printStackTrace();
-		}
-
-	}
-
-	@Override
-	public void channelRead(ChannelHandlerContext ctx, Object obj) throws Exception {
-
-		boolean isCanceled = false;
-		for(final var helper : nmsHandler.getCosmeticHelpers()) {
-			isCanceled |= !helper.read(player, obj, isCanceled);
-		}
-
-		if(!isCanceled)
-			super.channelRead(ctx, obj);
-	}
-
-}
diff --git a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/wardrobe/MannequinEntity.java b/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/wardrobe/MannequinEntity.java
deleted file mode 100644
index 080a9f2e101bae3e847014dfb416557ad54ccbcd..0000000000000000000000000000000000000000
--- a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/wardrobe/MannequinEntity.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package io.lumine.cosmetics.nms.v1_20_R1.wardrobe;
-
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.mojang.authlib.GameProfile;
-import com.mojang.datafixers.util.Pair;
-
-import io.lumine.cosmetics.api.cosmetics.Cosmetic;
-import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.api.players.wardrobe.WardrobeTracker;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_20_R1;
-import io.netty.buffer.Unpooled;
-import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
-import net.minecraft.network.protocol.game.ClientboundAnimatePacket;
-import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket;
-import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket;
-import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
-import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket;
-import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
-import net.minecraft.server.level.ServerPlayer;
-import net.minecraft.world.entity.EquipmentSlot;
-
-public class MannequinEntity implements Mannequin {
-
-    private final VolatileCodeEnabled_v1_20_R1 handler;
-    @Getter private final WardrobeTracker tracker;
-    @Getter private final UUID uniqueId;
-    @Getter private final Player player;
-    @Getter private final Location location;
-    @Getter private float rotation;
-    
-    @Getter private ServerPlayer fakePlayer;
-    private Map<Class<? extends Cosmetic>,Integer> extraEntities = Maps.newConcurrentMap();
-
-    public MannequinEntity(WardrobeTracker tracker, VolatileCodeEnabled_v1_20_R1 handler, Player player, Location location) {
-        this.tracker = tracker;
-        this.handler = handler;
-        this.player = player;
-        this.location = location;
-        this.uniqueId = UUID.randomUUID();
-        
-        var serverPlayer = ((CraftPlayer) player).getHandle();
-        var level = ((CraftWorld) location.getWorld()).getHandle();
-
-        this.rotation = serverPlayer.getYRot() + 180;
-        
-        if(rotation > 180) { 
-            rotation = rotation - 360;
-        }
-        
-        var gameProfile = serverPlayer.getGameProfile();
-        
-        gameProfile = new GameProfile(uniqueId, "Wardrobe");
-        gameProfile.getProperties().putAll(serverPlayer.getGameProfile().getProperties());
-        
-        this.fakePlayer = new ServerPlayer(level.getServer(), level, gameProfile);
-        
-        var spawn = new FriendlyByteBuf(Unpooled.buffer());
-        
-        spawn.writeVarInt(fakePlayer.getId());
-        spawn.writeUUID(fakePlayer.getUUID());
-        spawn.writeDouble(location.getX());
-        spawn.writeDouble(location.getY());
-        spawn.writeDouble(location.getZ());
-        spawn.writeByte((byte)(int)(serverPlayer.getYRot() * 256.0F / 360.0F));
-        spawn.writeByte((byte)(int)(serverPlayer.getXRot() * 256.0F / 360.0F));
-
-        var packetPlayerInfo = new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, fakePlayer);
-        var packetAddPlayer = new ClientboundAddPlayerPacket(spawn);
-
-        var equipmentPacket = new ClientboundSetEquipmentPacket(fakePlayer.getId(), 
-                List.of(Pair.of(EquipmentSlot.HEAD, serverPlayer.getItemBySlot(EquipmentSlot.HEAD)),
-                        Pair.of(EquipmentSlot.CHEST, serverPlayer.getItemBySlot(EquipmentSlot.CHEST)),
-                        Pair.of(EquipmentSlot.LEGS, serverPlayer.getItemBySlot(EquipmentSlot.LEGS)),
-                        Pair.of(EquipmentSlot.FEET, serverPlayer.getItemBySlot(EquipmentSlot.FEET)),
-                        Pair.of(EquipmentSlot.MAINHAND, serverPlayer.getItemBySlot(EquipmentSlot.MAINHAND)),
-                        Pair.of(EquipmentSlot.OFFHAND, serverPlayer.getItemBySlot(EquipmentSlot.OFFHAND))));
-
-        var head = (byte)(int)(rotation * 256.0F / 360.0F);
-        var rotatePacket = new ClientboundRotateHeadPacket(fakePlayer, head);
-        
-        var swingPacket = new ClientboundAnimatePacket(fakePlayer, 0);
-        
-        handler.broadcast(player, packetPlayerInfo, packetAddPlayer, equipmentPacket, rotatePacket, swingPacket);
-        
-        for(var eq : handler.getPlugin().getProfiles().getProfile(player).getEquipped().values()) {
-            eq.getCosmetic().getManager().equipMannequin(this, eq);
-        }
-    }
-    
-    public void despawn() {
-        var packetPlayerInfo = new ClientboundPlayerInfoRemovePacket(Lists.newArrayList(fakePlayer.getUUID()));
-        var packetRemovePlayer = new ClientboundRemoveEntitiesPacket(fakePlayer.getId());
-        
-        handler.broadcast(player, packetPlayerInfo, packetRemovePlayer);
-        
-        for(var i : extraEntities.values()) {
-            var removePacket = new ClientboundRemoveEntitiesPacket(i);
-            handler.broadcast(player, removePacket);
-        }
-    }
-    
-    public void addExtraEntity(Class<? extends Cosmetic> type, int id) {
-        extraEntities.put(type, id);
-    }
-    
-    public void removeExtraEntity(Class<? extends Cosmetic> type) {
-        var id = extraEntities.remove(type);
-        
-        if(id != null) {
-            var removePacket = new ClientboundRemoveEntitiesPacket(id);
-            handler.broadcast(player, removePacket);
-        }
-    }
-    
-    public int getEntityId() {
-        return fakePlayer.getId();
-    }
-
-}
diff --git a/v1_18_R2/.gitignore b/v1_21_R2/.gitignore
similarity index 100%
rename from v1_18_R2/.gitignore
rename to v1_21_R2/.gitignore
diff --git a/v1_19_R3/pom.xml b/v1_21_R2/pom.xml
similarity index 87%
rename from v1_19_R3/pom.xml
rename to v1_21_R2/pom.xml
index 04f8b5ad95730742094553275e18b8021c222df8..2233a4e446cdf859ec4ba65647c2c009208af6a6 100644
--- a/v1_19_R3/pom.xml
+++ b/v1_21_R2/pom.xml
@@ -1,10 +1,10 @@
  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     
-    <artifactId>MCCosmetics-v1_19_R3</artifactId>
+    <artifactId>MythicCosmetics-v1_21_R2</artifactId>
     <parent>
         <groupId>io.lumine</groupId>
-        <artifactId>MCCosmetics-Plugin</artifactId>
+        <artifactId>MythicCosmetics-Plugin</artifactId>
         <version>${mccosmetics.version}</version>
     </parent>
 
@@ -13,7 +13,7 @@
             <plugin>
                 <groupId>net.md-5</groupId>
                 <artifactId>specialsource-maven-plugin</artifactId>
-                <version>1.2.3</version>
+                <version>2.0.3</version>
                 <executions>
                     <execution>
                         <phase>package</phase>
@@ -22,9 +22,9 @@
                         </goals>
                         <id>remap-obf</id>
                         <configuration>
-                            <srgIn>org.spigotmc:minecraft-server:1.19.4-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
+                            <srgIn>org.spigotmc:minecraft-server:1.21.3-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
                             <reverse>true</reverse>
-                            <remappedDependencies>org.spigotmc:spigot:1.19.4-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
+                            <remappedDependencies>org.spigotmc:spigot:1.21.3-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
                             <remappedArtifactAttached>true</remappedArtifactAttached>
                             <remappedClassifierName>remapped-obf</remappedClassifierName>
                         </configuration>
@@ -37,8 +37,8 @@
                         <id>remap-spigot</id>
                         <configuration>
                             <inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
-                            <srgIn>org.spigotmc:minecraft-server:1.19.4-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
-                            <remappedDependencies>org.spigotmc:spigot:1.19.4-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
+                            <srgIn>org.spigotmc:minecraft-server:1.21.3-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
+                            <remappedDependencies>org.spigotmc:spigot:1.21.3-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
                         </configuration>
                     </execution>
                 </executions>
@@ -91,15 +91,21 @@
 
     <dependencies>
         <!-- Modules -->
+        <dependency>
+            <groupId>io.lumine</groupId>
+            <artifactId>Mythic-Dist</artifactId>
+            <version>${mythic.version}</version>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>io.lumine</groupId>
             <artifactId>LumineUtils</artifactId>
             <version>${lumineutils.version}</version>
-            <scope>provided</scope> 
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>io.lumine</groupId>
-            <artifactId>MCCosmetics</artifactId>
+            <artifactId>MythicCosmetics</artifactId>
             <version>${project.parent.version}</version>
             <scope>provided</scope>
         </dependency>
@@ -114,7 +120,7 @@
         <dependency>
             <groupId>org.spigotmc</groupId>
             <artifactId>spigot-api</artifactId>
-            <version>1.19.4-R0.1-SNAPSHOT</version>
+            <version>1.21.3-R0.1-SNAPSHOT</version>
             <classifier>shaded</classifier>
             <scope>provided</scope>
         </dependency> 
@@ -123,7 +129,7 @@
         <dependency>
             <groupId>org.spigotmc</groupId>
             <artifactId>spigot</artifactId>
-            <version>1.19.4-R0.1-SNAPSHOT</version>
+            <version>1.21.3-R0.1-SNAPSHOT</version>
             <classifier>remapped-mojang</classifier>
             <scope>provided</scope>
             <exclusions>
diff --git a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_19_R3.java b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_21_R2.java
similarity index 87%
rename from v1_19_R3/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_19_R3.java
rename to v1_21_R2/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_21_R2.java
index f6c47402663038c78d69ebfd82ed78306686ff82..6cc39150a37ce349ced9e6a90966d04078b5c0c2 100644
--- a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_19_R3.java
+++ b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_21_R2.java
@@ -11,28 +11,27 @@ import io.lumine.cosmetics.managers.hats.Hat;
 import io.lumine.cosmetics.managers.offhand.Offhand;
 import io.lumine.cosmetics.managers.sprays.Spray;
 import io.lumine.cosmetics.nms.cosmetic.VolatileCosmeticHelper;
-import io.lumine.cosmetics.nms.v1_19_R3.NMSFields;
-import io.lumine.cosmetics.nms.v1_19_R3.network.VolatileChannelHandler;
-import io.lumine.cosmetics.nms.v1_19_R3.wardrobe.MannequinEntity;
-import io.lumine.cosmetics.nms.v1_19_R3.cosmetic.*;
-import io.lumine.utils.reflection.Reflector;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelPipeline;
+import io.lumine.cosmetics.nms.v1_21_R2.cosmetic.*;
+import io.lumine.cosmetics.nms.v1_21_R2.network.VolatileChannelHandler;
+import io.lumine.cosmetics.nms.v1_21_R2.wardrobe.MannequinEntity;
+import io.lumine.mythic.bukkit.utils.reflection.Reflector;
+import io.lumine.mythic.core.volatilecode.v1_21_R2.VolatileFields;
 import lombok.Getter;
 import net.minecraft.network.Connection;
 import net.minecraft.network.protocol.Packet;
 import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
 import net.minecraft.server.level.ServerLevel;
 import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.server.network.ServerCommonPacketListenerImpl;
 import net.minecraft.server.network.ServerGamePacketListenerImpl;
 import net.minecraft.world.level.entity.LevelEntityGetter;
 
 import org.bukkit.Bukkit;
 import org.bukkit.Location;
 import org.bukkit.World;
-import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R3.entity.CraftLivingEntity;
-import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R2.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R2.entity.CraftLivingEntity;
+import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.Player;
@@ -41,14 +40,14 @@ import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.Map;
 
-public class VolatileCodeEnabled_v1_19_R3 implements VolatileCodeHandler {
+public class VolatileCodeEnabled_v1_21_R2 implements VolatileCodeHandler {
 
     @Getter private final MCCosmeticsPlugin plugin;
     private final Map<Class<? extends Cosmetic>, VolatileCosmeticHelper> cosmeticHelpers = Maps.newConcurrentMap();
     
     private Method entityGetter;
 
-    public VolatileCodeEnabled_v1_19_R3(MCCosmeticsPlugin plugin) {
+    public VolatileCodeEnabled_v1_21_R2(MCCosmeticsPlugin plugin) {
         this.plugin = plugin;
         cosmeticHelpers.put(Hat.class, new VolatileHatImpl(plugin, this));
         cosmeticHelpers.put(BackAccessory.class, new VolatileBackImpl(plugin, this));
@@ -74,8 +73,8 @@ public class VolatileCodeEnabled_v1_19_R3 implements VolatileCodeHandler {
         return cosmeticHelpers.values();
     }
 
-    private Reflector<ServerGamePacketListenerImpl> refConnection
-            = new Reflector<ServerGamePacketListenerImpl>(ServerGamePacketListenerImpl.class, NMSFields.PLAYER_CONNECTION);
+    private Reflector<ServerCommonPacketListenerImpl> refConnection
+            = new Reflector<>(ServerCommonPacketListenerImpl.class, VolatileFields.PLAYER_CONNECTION);
 
     @Override
     public void injectPlayer(Player player) {
@@ -83,7 +82,7 @@ public class VolatileCodeEnabled_v1_19_R3 implements VolatileCodeHandler {
         VolatileChannelHandler cdh = new VolatileChannelHandler(player, this);
 
         var listener = ((CraftPlayer) player).getHandle().connection;
-        var connection = (Connection) refConnection.get(listener, NMSFields.PLAYER_CONNECTION);
+        var connection = (Connection) refConnection.get(listener, VolatileFields.PLAYER_CONNECTION);
         var pipeline = connection.channel.pipeline();
 
         for (String name : pipeline.toMap().keySet()) {
@@ -97,7 +96,7 @@ public class VolatileCodeEnabled_v1_19_R3 implements VolatileCodeHandler {
     @Override
     public void removePlayer(Player player) {
         var listener = ((CraftPlayer) player).getHandle().connection;
-        var connection = (Connection) refConnection.get(listener, NMSFields.PLAYER_CONNECTION);
+        var connection = (Connection) refConnection.get(listener, VolatileFields.PLAYER_CONNECTION);
         var channel = connection.channel;
         channel.eventLoop().submit(() -> {
             channel.pipeline().remove("mc_cosmetics_packet_handler");
diff --git a/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/NMSFields.java b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/NMSFields.java
new file mode 100644
index 0000000000000000000000000000000000000000..c406dba17344e5094816a63d038b9e9f6d0fa0e8
--- /dev/null
+++ b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/NMSFields.java
@@ -0,0 +1,7 @@
+package io.lumine.cosmetics.nms.v1_21_R2;
+
+public class NMSFields {
+
+    public static final String EQUIPMENT_SLOTS = "d";
+
+}
diff --git a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileBackImpl.java b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileBackImpl.java
similarity index 75%
rename from v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileBackImpl.java
rename to v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileBackImpl.java
index 60bae4851c21033ef863171b4390818effa1dbdd..0d1523986c636cf630a67c0b300f9902987c8520 100644
--- a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileBackImpl.java
+++ b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileBackImpl.java
@@ -1,18 +1,15 @@
-package io.lumine.cosmetics.nms.v1_19_R3.cosmetic;
+package io.lumine.cosmetics.nms.v1_21_R2.cosmetic;
 
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.mojang.datafixers.util.Pair;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.Cosmetic;
 import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
 import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.constants.CosmeticType;
-import io.lumine.cosmetics.logging.MCLogger;
 import io.lumine.cosmetics.managers.back.BackAccessory;
-import io.lumine.cosmetics.managers.offhand.Offhand;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R3;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R2;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
 import io.lumine.cosmetics.players.Profile;
 import io.netty.buffer.Unpooled;
@@ -22,25 +19,26 @@ import net.minecraft.network.protocol.Packet;
 import net.minecraft.network.protocol.game.*;
 import net.minecraft.world.entity.EntityType;
 import net.minecraft.world.entity.EquipmentSlot;
+import net.minecraft.world.entity.PositionMoveRotation;
+import net.minecraft.world.entity.Relative;
 import net.minecraft.world.entity.decoration.ArmorStand;
-import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
+import net.minecraft.world.phys.Vec3;
+import org.bukkit.craftbukkit.v1_21_R2.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack;
 import org.bukkit.entity.Player;
 
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 public class VolatileBackImpl implements VolatileEquipmentHelper {
 
 	@Getter
 	private final MCCosmeticsPlugin plugin;
-	private final VolatileCodeEnabled_v1_19_R3 nmsHandler;
+	private final VolatileCodeEnabled_v1_21_R2 nmsHandler;
 	private final Map<Player, ArmorStand> activeProfile = Maps.newConcurrentMap();
 	private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
 
-	public VolatileBackImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R3 nmsHandler) {
+	public VolatileBackImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R2 nmsHandler) {
 		this.plugin = plugin;
 		this.nmsHandler = nmsHandler;
 	}
@@ -69,18 +67,20 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
 		if(stand == null) {
 			playerTracker.put(player.getEntityId(), player);
 			stand = new ArmorStand(EntityType.ARMOR_STAND, ((CraftWorld) player.getWorld()).getHandle());
-			stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + nmsPlayer.getPassengersRidingOffset() + stand.getMyRidingOffset(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
+			stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + stand.getPassengerRidingPosition(nmsPlayer).y(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
 			stand.setMarker(true);
 			stand.setInvisible(true);
 			stand.setSilent(true);
 
 			activeProfile.put(player, stand);
 
-			var mobPacket = new ClientboundAddEntityPacket(stand);
+			var mobPacket = new ClientboundAddEntityPacket(stand.getId(), stand.getUUID(), nmsPlayer.getX(), nmsPlayer.getY() + stand.getPassengerRidingPosition(nmsPlayer).y(), nmsPlayer.getZ(), 0, 0, EntityType.ARMOR_STAND, 0, Vec3.ZERO, 0);
 			var dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
 			var passengersPacket = createPassengerPacket(player.getEntityId(), stand.getId());
 
-			nmsHandler.broadcastAroundAndSelf(player, mobPacket, dataPacket, passengersPacket);
+			final Collection<Packet<? super ClientGamePacketListener>> packets = Lists.newArrayList(mobPacket, dataPacket, passengersPacket);
+			final var bundlePacket = new ClientboundBundlePacket(packets);
+			nmsHandler.broadcastAroundAndSelf(player, bundlePacket);
 		}
 
 		stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
@@ -116,25 +116,23 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
         mannequin.removeExtraEntity(BackAccessory.class);
 
         var stand = new ArmorStand(EntityType.ARMOR_STAND, ((CraftWorld) player.getWorld()).getHandle());
-        stand.moveTo(mannequinLocation.getX(), mannequinLocation.getY() + stand.getMyRidingOffset(), mannequinLocation.getZ(), mannequinLocation.getYaw(), 0);
+        stand.moveTo(mannequinLocation.getX(), mannequinLocation.getY(), mannequinLocation.getZ(), mannequinLocation.getYaw(), 0);
         stand.setMarker(true);
         stand.setInvisible(true);
         stand.setSilent(true);
+		stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
 
         mannequin.addExtraEntity(BackAccessory.class, stand.getId());
-        
-        var mobPacket = new ClientboundAddEntityPacket(stand);
+
+		var mobPacket = new ClientboundAddEntityPacket(stand.getId(), stand.getUUID(), mannequinLocation.getX(), mannequinLocation.getY(), mannequinLocation.getZ(), 0, 0, EntityType.ARMOR_STAND, 0, Vec3.ZERO, 0);
         var dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
         var passengersPacket = createPassengerPacket(entityId, stand.getId());
-
-        nmsHandler.broadcast(player, mobPacket, dataPacket, passengersPacket);
-
-        stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
-
         var equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsBack)));
 
-        nmsHandler.broadcast(player, equipmentPacket);
-    }
+		final Collection<Packet<? super ClientGamePacketListener>> packets = Lists.newArrayList(mobPacket, dataPacket, passengersPacket, equipmentPacket);
+		final var bundlePacket = new ClientboundBundlePacket(packets);
+		nmsHandler.broadcast(player, bundlePacket);
+	}
 
     @Override
     public void unequipMannequin(Mannequin mannequin) {
@@ -162,8 +160,12 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
 
 	@Override
 	public List<Object> write(Player receiver, Object packet) {
-		if(packet instanceof ClientboundAddPlayerPacket playerPacket) {
-			int id = playerPacket.getEntityId();
+		if(packet instanceof ClientboundAddEntityPacket playerPacket) {
+			if(playerPacket.getType() != EntityType.PLAYER) {
+				return null;
+			}
+
+			int id = playerPacket.getId();
 			if(playerTracker.containsKey(id)) {
 				final var spawnedPlayer = playerTracker.get(id);
 				final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(spawnedPlayer);
@@ -217,13 +219,13 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
 	}
 
 	private List<Object> handleSpawn(Profile profile) {
-		if(!hasBack(profile))
+		if(!hasBack(profile)) {
 			return null;
-
+		}
 		final var wearer = profile.getPlayer();
 		final var stand = activeProfile.get(wearer);
 
-		var mobPacket = new ClientboundAddEntityPacket(stand);
+		var mobPacket = new ClientboundAddEntityPacket(stand, 0, stand.blockPosition());
 		ClientboundSetEntityDataPacket dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
 		ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, stand.getItemBySlot(EquipmentSlot.HEAD))));
 		ClientboundSetPassengersPacket passengersPacket = createPassengerPacket(wearer.getEntityId(), stand.getId());
@@ -253,36 +255,53 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
 					moveEntityPacket.getXa(),
 					moveEntityPacket.getYa(),
 					moveEntityPacket.getZa(),
-					moveEntityPacket.getyRot(),
-					moveEntityPacket.getxRot(),
+					encodeRot(moveEntityPacket.getyRot()),
+					encodeRot(moveEntityPacket.getxRot()),
 					false);
-		}else if(moveEntityPacket.hasPosition()) {
+		} else if(moveEntityPacket.hasPosition()) {
 			move = new ClientboundMoveEntityPacket.Pos(
 					stand.getId(),
 					moveEntityPacket.getXa(),
 					moveEntityPacket.getYa(),
 					moveEntityPacket.getZa(),
 					false);
-		}else {
+		} else {
 			move = new ClientboundMoveEntityPacket.Rot(
 					stand.getId(),
-					moveEntityPacket.getyRot(),
-					moveEntityPacket.getxRot(),
+					encodeRot(moveEntityPacket.getyRot()),
+					encodeRot(moveEntityPacket.getxRot()),
 					false);
 		}
 		return List.of(move);
 	}
 
+	protected byte encodeRot(float rot) {
+		return (byte) (rot / 360f * 255);
+	}
+
 	private List<Object> handleTeleport(Profile profile) {
-		if(!hasBack(profile))
+		if(!hasBack(profile)) {
 			return null;
+		}
 
 		final var wearer = profile.getPlayer();
 		final var nmsPlayer = ((CraftPlayer) wearer).getHandle();
 		final var stand = activeProfile.get(wearer);
-		stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + nmsPlayer.getPassengersRidingOffset() + stand.getMyRidingOffset(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
 
-		return List.of(new ClientboundTeleportEntityPacket(stand));
+		final var x = nmsPlayer.getX();
+		final var y = nmsPlayer.getY() + stand.getPassengerRidingPosition(nmsPlayer).y();
+		final var z = nmsPlayer.getZ();
+
+		stand.moveTo(x, y, z, nmsPlayer.getYRot(), 0);
+
+		final Set<Relative> set = new HashSet<>();
+
+		final var delta = new Vec3(0,0,0);
+		final var positionMoveRotation = new PositionMoveRotation(new Vec3(x,y,z), delta, 0, nmsPlayer.getXRot());
+
+		final var packet = new ClientboundTeleportEntityPacket(stand.getId(), positionMoveRotation, set, false);
+
+		return List.of(packet);
 	}
 
 	private boolean hasBack(Profile profile) {
@@ -297,7 +316,7 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
 		FriendlyByteBuf bb = new FriendlyByteBuf(Unpooled.buffer());
 		bb.writeVarInt(mount);
 		bb.writeVarIntArray(driver);
-		return new ClientboundSetPassengersPacket(bb);
+		return ClientboundSetPassengersPacket.STREAM_CODEC.decode(bb);
 	}
 
 }
\ No newline at end of file
diff --git a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileGestureImpl.java b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileGestureImpl.java
similarity index 88%
rename from v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileGestureImpl.java
rename to v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileGestureImpl.java
index d27c988ea5b4afb1e11ccb642fba9402c867678f..96d704a1b49a9233102e1468151d229aafb680d9 100644
--- a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileGestureImpl.java
+++ b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileGestureImpl.java
@@ -1,4 +1,4 @@
-package io.lumine.cosmetics.nms.v1_19_R2.cosmetic;
+package io.lumine.cosmetics.nms.v1_21_R2.cosmetic;
 
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -9,7 +9,7 @@ import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.managers.gestures.Gesture;
 import io.lumine.cosmetics.managers.gestures.GestureManager;
 import io.lumine.cosmetics.managers.gestures.QuitMethod;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R2;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R2;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
 import io.lumine.cosmetics.players.Profile;
 import io.netty.buffer.Unpooled;
@@ -21,9 +21,10 @@ import net.minecraft.world.entity.EquipmentSlot;
 import net.minecraft.world.entity.animal.horse.Horse;
 import net.minecraft.world.item.ItemStack;
 import org.bukkit.attribute.Attribute;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R2.attribute.CraftAttributeMap;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R2.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R2.attribute.CraftAttribute;
+import org.bukkit.craftbukkit.v1_21_R2.attribute.CraftAttributeMap;
+import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer;
 import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
@@ -42,19 +43,20 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 
 	@Getter
 	private final MCCosmeticsPlugin plugin;
-	private final VolatileCodeEnabled_v1_19_R2 nmsHandler;
+	private final VolatileCodeEnabled_v1_21_R2 nmsHandler;
 	private final Set<Player> activeProfile = Sets.newConcurrentHashSet();
 	private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
 
 	private Horse horse;
 
-	public VolatileGestureImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R2 nmsHandler) {
+	public VolatileGestureImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R2 nmsHandler) {
 		this.plugin = plugin;
 		this.nmsHandler = nmsHandler;
 	}
 
 	@Override
 	public void apply(CosmeticProfile profile) {
+		/*
 		if (profile == null)
 			return;
 		Player player = profile.getPlayer();
@@ -84,10 +86,13 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 		}
 		ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), empty);
 		nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
+
+		 */
 	}
 
 	@Override
 	public void unapply(CosmeticProfile profile) {
+		/*
 		if (profile == null)
 			return;
 		Player player = profile.getPlayer();
@@ -112,25 +117,32 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 				continue;
 			hide.show(profile);
 		}
+
+		 */
 	}
 
 	private ClientboundSetPassengersPacket createPassengerPacket(int mount, int... driver) {
+		/*
 		FriendlyByteBuf bb = new FriendlyByteBuf(Unpooled.buffer());
 		bb.writeVarInt(mount);
 		bb.writeVarIntArray(driver);
 		return new ClientboundSetPassengersPacket(bb);
+
+		 */
+		return null;
 	}
 
 	private void getHorsed(Player player) {
+		/*
 		final var nmsPlayer = ((CraftPlayer) player).getHandle();
 
 		if(horse == null) {
 			horse = new Horse(EntityType.HORSE, ((CraftWorld) player.getWorld()).getHandle());
 			horse.setInvisible(true);
 			horse.setHealth(0);
-			horse.getAttribute(CraftAttributeMap.toMinecraft(Attribute.GENERIC_MAX_HEALTH)).setBaseValue(0);
+			horse.getAttribute(CraftAttribute.bukkitToMinecraft(Attribute.MAX_HEALTH)).setBaseValue(0);
 		}
-		horse.setPos(nmsPlayer.getX(), nmsPlayer.getY() - horse.getPassengersRidingOffset() - nmsPlayer.getMyRidingOffset(), nmsPlayer.getZ());
+		horse.setPos(nmsPlayer.getX(), nmsPlayer.getY() - nmsPlayer.getMyRidingOffset(horse), nmsPlayer.getZ());
 
 		var mobPacket = new ClientboundAddEntityPacket(horse);
 		var dataPacket = new ClientboundSetEntityDataPacket(horse.getId(), horse.getEntityData().getNonDefaultValues());
@@ -138,17 +150,20 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 		var passengersPacket = createPassengerPacket(horse.getId(), nmsPlayer.getId());
 
 		nmsHandler.broadcast(player, mobPacket, dataPacket, attributesPacket, passengersPacket);
+
+		 */
 	}
 
 	@Override
 	public boolean read(Player sender, Object packet, boolean isCanceled) {
+		/*
 		if(!plugin.getGestureManager().getTicking().containsKey(sender)) {
 		    return true;
 		}
 
 		if(packet instanceof ServerboundPlayerInputPacket inputPacket) {
 			final var manager = (GestureManager) plugin.getGestureManager();
-			if(inputPacket.isShiftKeyDown())
+			if(inputPacket.input() == ServerboundPlayerInputPacket.)
 				manager.quit(sender, QuitMethod.SNEAK);
 			if(inputPacket.isJumping())
 				manager.quit(sender, QuitMethod.JUMP);
@@ -159,11 +174,13 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 				return false;
 			}
 		}
+		 */
 		return true;
 	}
 
 	@Override
 	public List<Object> write(Player receiver, Object packet) {
+		/*
 		if(packet instanceof ClientboundSetEquipmentPacket equipmentPacket) {
 			int id = equipmentPacket.getEntity();
 			final var spawnedPlayer = playerTracker.get(id);
@@ -173,6 +190,7 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 			if(profile != null)
 				return List.of(new ClientboundSetEquipmentPacket(id, empty));
 		}
+		 */
 		return null;
 	}
 }
diff --git a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileHatImpl.java b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileHatImpl.java
similarity index 92%
rename from v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileHatImpl.java
rename to v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileHatImpl.java
index 52b2cd7fa0c9dca261de446850c15c03538d7129..81dd85286990d8a48d1da7337ef65ced72b4ef9b 100644
--- a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileHatImpl.java
+++ b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileHatImpl.java
@@ -1,4 +1,4 @@
-package io.lumine.cosmetics.nms.v1_20_R1.cosmetic;
+package io.lumine.cosmetics.nms.v1_21_R2.cosmetic;
 
 import com.mojang.datafixers.util.Pair;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
@@ -7,16 +7,17 @@ import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
 import io.lumine.cosmetics.managers.hats.Hat;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_20_R1;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R2;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
+import io.lumine.cosmetics.nms.v1_21_R2.NMSFields;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.reflection.Reflector;
+import io.lumine.mythic.bukkit.utils.reflection.Reflector;
 import lombok.Getter;
 import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
 import net.minecraft.network.protocol.game.ServerboundAcceptTeleportationPacket;
 import net.minecraft.world.entity.EquipmentSlot;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack;
 import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
@@ -25,10 +26,10 @@ import java.util.List;
 public class VolatileHatImpl implements VolatileEquipmentHelper {
 
     @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_20_R1 nmsHandler;
+    private final VolatileCodeEnabled_v1_21_R2 nmsHandler;
     //private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
 
-    public VolatileHatImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_20_R1 nmsHandler) {
+    public VolatileHatImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R2 nmsHandler) {
         this.plugin = plugin;
         this.nmsHandler = nmsHandler;
     }
@@ -152,7 +153,7 @@ public class VolatileHatImpl implements VolatileEquipmentHelper {
         nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
     }
     
-    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, "c");
+    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, NMSFields.EQUIPMENT_SLOTS);
     
     private void modifyPacket(Profile profile, ClientboundSetEquipmentPacket packet) {
         final var maybeEquipped = profile.getEquipped(Hat.class);
@@ -186,7 +187,7 @@ public class VolatileHatImpl implements VolatileEquipmentHelper {
             newSlots.add(Pair.of(EquipmentSlot.HEAD, nmsItem));
         }
         
-        refEq.set(packet, "c", newSlots);
+        refEq.set(packet, NMSFields.EQUIPMENT_SLOTS, newSlots);
     }
 
 }
diff --git a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileOffhandImpl.java b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileOffhandImpl.java
similarity index 88%
rename from v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileOffhandImpl.java
rename to v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileOffhandImpl.java
index acf735f7f8d6cb7e23654302346acc4dec23f3de..b65d6918c236ae5c9735084d8a460129595ef2e6 100644
--- a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileOffhandImpl.java
+++ b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileOffhandImpl.java
@@ -1,4 +1,4 @@
-package io.lumine.cosmetics.nms.v1_20_R1.cosmetic;
+package io.lumine.cosmetics.nms.v1_21_R2.cosmetic;
 
 import com.google.common.collect.Maps;
 import com.mojang.datafixers.util.Pair;
@@ -9,15 +9,16 @@ import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
 import io.lumine.cosmetics.managers.hats.Hat;
 import io.lumine.cosmetics.managers.offhand.Offhand;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_20_R1;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R2;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
+import io.lumine.cosmetics.nms.v1_21_R2.NMSFields;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.reflection.Reflector;
+import io.lumine.mythic.bukkit.utils.reflection.Reflector;
 import lombok.Getter;
 import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
 import net.minecraft.world.entity.EquipmentSlot;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack;
 import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
@@ -27,10 +28,10 @@ import java.util.Map;
 public class VolatileOffhandImpl implements VolatileEquipmentHelper {
 
     @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_20_R1 nmsHandler;
+    private final VolatileCodeEnabled_v1_21_R2 nmsHandler;
     private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
 
-    public VolatileOffhandImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_20_R1 nmsHandler) {
+    public VolatileOffhandImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R2 nmsHandler) {
         this.plugin = plugin;
         this.nmsHandler = nmsHandler;
     }
@@ -131,10 +132,10 @@ public class VolatileOffhandImpl implements VolatileEquipmentHelper {
         nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
     }
     
-    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, "c");
+    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, NMSFields.EQUIPMENT_SLOTS);
     
     private void modifyPacket(Profile profile, ClientboundSetEquipmentPacket packet) {
-        final var maybeEquipped = profile.getEquipped(Hat.class);
+        final var maybeEquipped = profile.getEquipped(Offhand.class);
         if(maybeEquipped.isEmpty()) {
             return;
         }
@@ -154,7 +155,7 @@ public class VolatileOffhandImpl implements VolatileEquipmentHelper {
         for(var pair : slots) {
             final EquipmentSlot slot = pair.getFirst();
             
-            if(slot == EquipmentSlot.HEAD) {
+            if(slot == EquipmentSlot.OFFHAND) {
                 foundHead = true;
                 newSlots.add(Pair.of(pair.getFirst(), nmsItem));
             } else {
@@ -162,9 +163,9 @@ public class VolatileOffhandImpl implements VolatileEquipmentHelper {
             }
         }
         if(!foundHead) {
-            newSlots.add(Pair.of(EquipmentSlot.HEAD, nmsItem));
+            newSlots.add(Pair.of(EquipmentSlot.OFFHAND, nmsItem));
         }
-        refEq.set(packet, "c", newSlots);
+        refEq.set(packet, NMSFields.EQUIPMENT_SLOTS, newSlots);
     }
 
 }
diff --git a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileSprayImpl.java b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileSprayImpl.java
similarity index 86%
rename from v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileSprayImpl.java
rename to v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileSprayImpl.java
index 87c67368d6b1cfd94e8db3fc0ab4d3570d4e3361..c69b1bc4351be2a1b86f67181fd2c121012f600b 100644
--- a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileSprayImpl.java
+++ b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/cosmetic/VolatileSprayImpl.java
@@ -1,8 +1,8 @@
-package io.lumine.cosmetics.nms.v1_19_R3.cosmetic;
+package io.lumine.cosmetics.nms.v1_21_R2.cosmetic;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.managers.sprays.Spray;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R3;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R2;
 import io.lumine.cosmetics.nms.cosmetic.VolatileSprayHelper;
 import lombok.Getter;
 import net.minecraft.core.BlockPos;
@@ -11,21 +11,22 @@ import net.minecraft.network.protocol.game.ClientboundAddEntityPacket;
 import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket;
 import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
 import net.minecraft.world.entity.decoration.ItemFrame;
+import net.minecraft.world.level.saveddata.maps.MapId;
 import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
 import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.block.BlockFace;
-import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_21_R2.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.meta.MapMeta;
 
 public class VolatileSprayImpl implements VolatileSprayHelper {
 
     @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_19_R3 nmsHandler;
+    private final VolatileCodeEnabled_v1_21_R2 nmsHandler;
 
-    public VolatileSprayImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R3 nmsHandler) {
+    public VolatileSprayImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R2 nmsHandler) {
         this.plugin = plugin;
         this.nmsHandler = nmsHandler;
     }
@@ -60,7 +61,7 @@ public class VolatileSprayImpl implements VolatileSprayHelper {
         frame.setInvisible(true);
         frame.setRotation(rotation);
 
-        var packetAdd = new ClientboundAddEntityPacket(frame, dir);
+        var packetAdd = new ClientboundAddEntityPacket(frame, dir, pos);
         var packetData = new ClientboundSetEntityDataPacket(frame.getId(), frame.getEntityData().getNonDefaultValues());
         var packetMap = constructMapPacket(image.getMapNumber(), image.getPixels());
         
@@ -78,7 +79,7 @@ public class VolatileSprayImpl implements VolatileSprayHelper {
     
     private ClientboundMapItemDataPacket constructMapPacket(int id, byte[] pixels) {
         var mapData = constructMapData(startX, startY, mapWidth, mapHeight, pixels);
-        var packet = new ClientboundMapItemDataPacket(id, mapScale, mapLocked, null, mapData);
+        var packet = new ClientboundMapItemDataPacket(new MapId(id), mapScale, mapLocked, null, mapData);
 
         return packet;
     }
diff --git a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/network/VolatileChannelHandler.java b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/network/VolatileChannelHandler.java
similarity index 87%
rename from v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/network/VolatileChannelHandler.java
rename to v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/network/VolatileChannelHandler.java
index f1e30f7bfb958e704437254a1035aaeb0ef4d1ac..734ff2bf287b9cba9f7813bc772209de23953bf5 100644
--- a/v1_18_R2/src/main/java/io/lumine/cosmetics/nms/v1_18_R2/network/VolatileChannelHandler.java
+++ b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/network/VolatileChannelHandler.java
@@ -1,6 +1,6 @@
-package io.lumine.cosmetics.nms.v1_18_R2.network;
+package io.lumine.cosmetics.nms.v1_21_R2.network;
 
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_18_R2;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R2;
 import io.netty.channel.ChannelDuplexHandler;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelPromise;
@@ -12,10 +12,10 @@ import java.util.List;
 
 public class VolatileChannelHandler extends ChannelDuplexHandler {
 
-	private final VolatileCodeEnabled_v1_18_R2 nmsHandler;
+	private final VolatileCodeEnabled_v1_21_R2 nmsHandler;
 	@Getter private final Player player;
 
-	public VolatileChannelHandler(Player player, VolatileCodeEnabled_v1_18_R2 nmsHandler) {
+	public VolatileChannelHandler(Player player, VolatileCodeEnabled_v1_21_R2 nmsHandler) {
 		this.player = player;
 		this.nmsHandler = nmsHandler;
 	}
diff --git a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/wardrobe/MannequinEntity.java b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/wardrobe/MannequinEntity.java
similarity index 56%
rename from v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/wardrobe/MannequinEntity.java
rename to v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/wardrobe/MannequinEntity.java
index 150b43880bd2f0a8e013501c1fd80d3ed02f3f62..703d7be489519fa8597646cb6340cdbd3c81a6e2 100644
--- a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/wardrobe/MannequinEntity.java
+++ b/v1_21_R2/src/main/java/io/lumine/cosmetics/nms/v1_21_R2/wardrobe/MannequinEntity.java
@@ -1,12 +1,20 @@
-package io.lumine.cosmetics.nms.v1_19_R3.wardrobe;
+package io.lumine.cosmetics.nms.v1_21_R2.wardrobe;
 
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 
+import io.lumine.mythic.bukkit.MythicBukkit;
+import net.minecraft.core.RegistryAccess;
+import net.minecraft.core.registries.Registries;
+import net.minecraft.network.RegistryFriendlyByteBuf;
+import net.minecraft.network.chat.RemoteChatSession;
+import net.minecraft.network.codec.ByteBufCodecs;
+import net.minecraft.network.protocol.game.*;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.level.GameType;
+import net.minecraft.world.phys.Vec3;
 import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R2.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer;
 import org.bukkit.entity.Player;
 
 import com.google.common.collect.Lists;
@@ -17,38 +25,33 @@ import com.mojang.datafixers.util.Pair;
 import io.lumine.cosmetics.api.cosmetics.Cosmetic;
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
 import io.lumine.cosmetics.api.players.wardrobe.WardrobeTracker;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R3;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R2;
 import io.netty.buffer.Unpooled;
 import lombok.Getter;
 import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
-import net.minecraft.network.protocol.game.ClientboundAnimatePacket;
-import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket;
-import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket;
-import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
-import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket;
-import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
-import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket;
 import net.minecraft.server.level.ServerPlayer;
 import net.minecraft.world.entity.EquipmentSlot;
 
+import javax.annotation.Nullable;
+
 public class MannequinEntity implements Mannequin {
 
-    private final VolatileCodeEnabled_v1_19_R3 handler;
+    private final VolatileCodeEnabled_v1_21_R2 handler;
     @Getter private final WardrobeTracker tracker;
     @Getter private final UUID uniqueId;
     @Getter private final Player player;
     @Getter private final Location location;
     @Getter private float rotation;
     
-    @Getter private ServerPlayer fakePlayer;
+    @Getter private int fakePlayerId;
     private Map<Class<? extends Cosmetic>,Integer> extraEntities = Maps.newConcurrentMap();
 
-    public MannequinEntity(WardrobeTracker tracker, VolatileCodeEnabled_v1_19_R3 handler, Player player, Location location) {
+    public MannequinEntity(WardrobeTracker tracker, VolatileCodeEnabled_v1_21_R2 handler, Player player, Location location) {
         this.tracker = tracker;
         this.handler = handler;
         this.player = player;
         this.location = location;
+        this.fakePlayerId = MythicBukkit.inst().getVolatileCodeHandler().getEntityHandler().getNextEntityId();
         this.uniqueId = UUID.randomUUID();
         
         var serverPlayer = ((CraftPlayer) player).getHandle();
@@ -64,23 +67,25 @@ public class MannequinEntity implements Mannequin {
         
         gameProfile = new GameProfile(uniqueId, "Wardrobe");
         gameProfile.getProperties().putAll(serverPlayer.getGameProfile().getProperties());
-        
-        this.fakePlayer = new ServerPlayer(level.getServer(), level, gameProfile);
-        
-        var spawn = new FriendlyByteBuf(Unpooled.buffer());
-        
-        spawn.writeVarInt(fakePlayer.getId());
-        spawn.writeUUID(fakePlayer.getUUID());
-        spawn.writeDouble(location.getX());
-        spawn.writeDouble(location.getY());
-        spawn.writeDouble(location.getZ());
-        spawn.writeByte((byte)(int)(serverPlayer.getYRot() * 256.0F / 360.0F));
-        spawn.writeByte((byte)(int)(serverPlayer.getXRot() * 256.0F / 360.0F));
-
-        var packetPlayerInfo = new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, fakePlayer);
-        var packetAddPlayer = new ClientboundAddPlayerPacket(spawn);
-
-        var equipmentPacket = new ClientboundSetEquipmentPacket(fakePlayer.getId(), 
+
+        final var buf = new RegistryFriendlyByteBuf(Unpooled.buffer(), RegistryAccess.EMPTY);
+
+        final EnumSet<ClientboundPlayerInfoUpdatePacket.Action> actionSet = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER);
+        buf.writeEnumSet(actionSet, ClientboundPlayerInfoUpdatePacket.Action.class);
+
+        var fakePlayerEntry = List.of(new ClientboundPlayerInfoUpdatePacket.Entry(uniqueId, gameProfile, false, 0, GameType.CREATIVE, null, 0, null));
+        buf.writeCollection(fakePlayerEntry, (var0x, var1) -> {
+            var0x.writeUUID(var1.profileId());
+
+            GameProfile var2 = (GameProfile)Objects.requireNonNull(var1.profile());
+            var0x.writeUtf(var2.getName(), 16);
+            ByteBufCodecs.GAME_PROFILE_PROPERTIES.encode(var0x, var2.getProperties());
+        });
+
+        var packetPlayerInfo = ClientboundPlayerInfoUpdatePacket.STREAM_CODEC.decode(buf);
+
+        var packetAddPlayer = new ClientboundAddEntityPacket(fakePlayerId, uniqueId, location.getX(), location.getY(), location.getZ(), serverPlayer.getXRot(), serverPlayer.getYRot(), EntityType.PLAYER, 0, Vec3.ZERO, serverPlayer.getYHeadRot());
+        var equipmentPacket = new ClientboundSetEquipmentPacket(fakePlayerId,
                 List.of(Pair.of(EquipmentSlot.HEAD, serverPlayer.getItemBySlot(EquipmentSlot.HEAD)),
                         Pair.of(EquipmentSlot.CHEST, serverPlayer.getItemBySlot(EquipmentSlot.CHEST)),
                         Pair.of(EquipmentSlot.LEGS, serverPlayer.getItemBySlot(EquipmentSlot.LEGS)),
@@ -89,9 +94,16 @@ public class MannequinEntity implements Mannequin {
                         Pair.of(EquipmentSlot.OFFHAND, serverPlayer.getItemBySlot(EquipmentSlot.OFFHAND))));
 
         var head = (byte)(int)(rotation * 256.0F / 360.0F);
-        var rotatePacket = new ClientboundRotateHeadPacket(fakePlayer, head);
-        
-        var swingPacket = new ClientboundAnimatePacket(fakePlayer, 0);
+
+        var rotateByteBuf = new FriendlyByteBuf(Unpooled.buffer());
+        rotateByteBuf.writeVarInt(fakePlayerId);
+        rotateByteBuf.writeByte(head);
+        var rotatePacket = ClientboundRotateHeadPacket.STREAM_CODEC.decode(rotateByteBuf);
+
+        var animateByteBuf = new FriendlyByteBuf(Unpooled.buffer());
+        animateByteBuf.writeVarInt(fakePlayerId);
+        animateByteBuf.writeByte(ClientboundAnimatePacket.SWING_MAIN_HAND);
+        var swingPacket = ClientboundAnimatePacket.STREAM_CODEC.decode(animateByteBuf);
         
         handler.broadcast(player, packetPlayerInfo, packetAddPlayer, equipmentPacket, rotatePacket, swingPacket);
         
@@ -101,8 +113,8 @@ public class MannequinEntity implements Mannequin {
     }
     
     public void despawn() {
-        var packetPlayerInfo = new ClientboundPlayerInfoRemovePacket(Lists.newArrayList(fakePlayer.getUUID()));
-        var packetRemovePlayer = new ClientboundRemoveEntitiesPacket(fakePlayer.getId());
+        var packetPlayerInfo = new ClientboundPlayerInfoRemovePacket(Lists.newArrayList(uniqueId));
+        var packetRemovePlayer = new ClientboundRemoveEntitiesPacket(fakePlayerId);
         
         handler.broadcast(player, packetPlayerInfo, packetRemovePlayer);
         
@@ -126,7 +138,7 @@ public class MannequinEntity implements Mannequin {
     }
     
     public int getEntityId() {
-        return fakePlayer.getId();
+        return fakePlayerId;
     }
 
 }
diff --git a/v1_19_R2/.gitignore b/v1_21_R3/.gitignore
similarity index 100%
rename from v1_19_R2/.gitignore
rename to v1_21_R3/.gitignore
diff --git a/v1_20_R1/pom.xml b/v1_21_R3/pom.xml
similarity index 87%
rename from v1_20_R1/pom.xml
rename to v1_21_R3/pom.xml
index aa51cd53ef34eb89023064a8d17d90bd9429750b..e345449b7a905a8846d6db3c88c639fe6af6dcc4 100644
--- a/v1_20_R1/pom.xml
+++ b/v1_21_R3/pom.xml
@@ -1,10 +1,10 @@
  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     
-    <artifactId>MCCosmetics-v1_20_R1</artifactId>
+    <artifactId>MythicCosmetics-v1_21_R3</artifactId>
     <parent>
         <groupId>io.lumine</groupId>
-        <artifactId>MCCosmetics-Plugin</artifactId>
+        <artifactId>MythicCosmetics-Plugin</artifactId>
         <version>${mccosmetics.version}</version>
     </parent>
 
@@ -13,7 +13,7 @@
             <plugin>
                 <groupId>net.md-5</groupId>
                 <artifactId>specialsource-maven-plugin</artifactId>
-                <version>1.2.3</version>
+                <version>2.0.3</version>
                 <executions>
                     <execution>
                         <phase>package</phase>
@@ -22,9 +22,9 @@
                         </goals>
                         <id>remap-obf</id>
                         <configuration>
-                            <srgIn>org.spigotmc:minecraft-server:1.20.1-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
+                            <srgIn>org.spigotmc:minecraft-server:1.21.4-R0.1-SNAPSHOT:txt:maps-mojang</srgIn>
                             <reverse>true</reverse>
-                            <remappedDependencies>org.spigotmc:spigot:1.20.1-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
+                            <remappedDependencies>org.spigotmc:spigot:1.21.4-R0.1-SNAPSHOT:jar:remapped-mojang</remappedDependencies>
                             <remappedArtifactAttached>true</remappedArtifactAttached>
                             <remappedClassifierName>remapped-obf</remappedClassifierName>
                         </configuration>
@@ -37,8 +37,8 @@
                         <id>remap-spigot</id>
                         <configuration>
                             <inputFile>${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar</inputFile>
-                            <srgIn>org.spigotmc:minecraft-server:1.20.1-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
-                            <remappedDependencies>org.spigotmc:spigot:1.20.1-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
+                            <srgIn>org.spigotmc:minecraft-server:1.21.4-R0.1-SNAPSHOT:csrg:maps-spigot</srgIn>
+                            <remappedDependencies>org.spigotmc:spigot:1.21.4-R0.1-SNAPSHOT:jar:remapped-obf</remappedDependencies>
                         </configuration>
                     </execution>
                 </executions>
@@ -91,15 +91,21 @@
 
     <dependencies>
         <!-- Modules -->
+        <dependency>
+            <groupId>io.lumine</groupId>
+            <artifactId>Mythic-Dist</artifactId>
+            <version>${mythic.version}</version>
+            <scope>provided</scope>
+        </dependency>
         <dependency>
             <groupId>io.lumine</groupId>
             <artifactId>LumineUtils</artifactId>
             <version>${lumineutils.version}</version>
-            <scope>provided</scope> 
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>io.lumine</groupId>
-            <artifactId>MCCosmetics</artifactId>
+            <artifactId>MythicCosmetics</artifactId>
             <version>${project.parent.version}</version>
             <scope>provided</scope>
         </dependency>
@@ -114,7 +120,7 @@
         <dependency>
             <groupId>org.spigotmc</groupId>
             <artifactId>spigot-api</artifactId>
-            <version>1.20.1-R0.1-SNAPSHOT</version>
+            <version>1.21.4-R0.1-SNAPSHOT</version>
             <classifier>shaded</classifier>
             <scope>provided</scope>
         </dependency> 
@@ -123,7 +129,7 @@
         <dependency>
             <groupId>org.spigotmc</groupId>
             <artifactId>spigot</artifactId>
-            <version>1.20.1-R0.1-SNAPSHOT</version>
+            <version>1.21.4-R0.1-SNAPSHOT</version>
             <classifier>remapped-mojang</classifier>
             <scope>provided</scope>
             <exclusions>
diff --git a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_20_R1.java b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_21_R3.java
similarity index 87%
rename from v1_20_R1/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_20_R1.java
rename to v1_21_R3/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_21_R3.java
index b9cf5fa4f5c58a830aa8015625d5537db94345c3..757c5a079453e969aed86937ccf6d745ec1806a0 100644
--- a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_20_R1.java
+++ b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/VolatileCodeEnabled_v1_21_R3.java
@@ -11,27 +11,27 @@ import io.lumine.cosmetics.managers.hats.Hat;
 import io.lumine.cosmetics.managers.offhand.Offhand;
 import io.lumine.cosmetics.managers.sprays.Spray;
 import io.lumine.cosmetics.nms.cosmetic.VolatileCosmeticHelper;
-import io.lumine.cosmetics.nms.v1_20_R1.NMSFields;
-import io.lumine.cosmetics.nms.v1_20_R1.cosmetic.*;
-import io.lumine.cosmetics.nms.v1_20_R1.network.VolatileChannelHandler;
-import io.lumine.cosmetics.nms.v1_20_R1.wardrobe.MannequinEntity;
-import io.lumine.cosmetics.nms.v1_20_R1.cosmetic.*;
-import io.lumine.utils.reflection.Reflector;
+import io.lumine.cosmetics.nms.v1_21_R3.cosmetic.*;
+import io.lumine.cosmetics.nms.v1_21_R3.cosmetic.*;
+import io.lumine.cosmetics.nms.v1_21_R3.network.VolatileChannelHandler;
+import io.lumine.cosmetics.nms.v1_21_R3.wardrobe.MannequinEntity;
+import io.lumine.mythic.bukkit.utils.reflection.Reflector;
+import io.lumine.mythic.core.volatilecode.v1_21_R3.VolatileFields;
 import lombok.Getter;
 import net.minecraft.network.Connection;
 import net.minecraft.network.protocol.Packet;
 import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
 import net.minecraft.server.level.ServerLevel;
 import net.minecraft.server.level.ServerPlayer;
-import net.minecraft.server.network.ServerGamePacketListenerImpl;
+import net.minecraft.server.network.ServerCommonPacketListenerImpl;
 import net.minecraft.world.level.entity.LevelEntityGetter;
 
 import org.bukkit.Bukkit;
 import org.bukkit.Location;
 import org.bukkit.World;
-import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftLivingEntity;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R3.entity.CraftLivingEntity;
+import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.Player;
@@ -40,14 +40,14 @@ import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.Map;
 
-public class VolatileCodeEnabled_v1_20_R1 implements VolatileCodeHandler {
+public class VolatileCodeEnabled_v1_21_R3 implements VolatileCodeHandler {
 
     @Getter private final MCCosmeticsPlugin plugin;
     private final Map<Class<? extends Cosmetic>, VolatileCosmeticHelper> cosmeticHelpers = Maps.newConcurrentMap();
     
     private Method entityGetter;
 
-    public VolatileCodeEnabled_v1_20_R1(MCCosmeticsPlugin plugin) {
+    public VolatileCodeEnabled_v1_21_R3(MCCosmeticsPlugin plugin) {
         this.plugin = plugin;
         cosmeticHelpers.put(Hat.class, new VolatileHatImpl(plugin, this));
         cosmeticHelpers.put(BackAccessory.class, new VolatileBackImpl(plugin, this));
@@ -73,8 +73,8 @@ public class VolatileCodeEnabled_v1_20_R1 implements VolatileCodeHandler {
         return cosmeticHelpers.values();
     }
 
-    private Reflector<ServerGamePacketListenerImpl> refConnection
-            = new Reflector<ServerGamePacketListenerImpl>(ServerGamePacketListenerImpl.class, NMSFields.PLAYER_CONNECTION);
+    private Reflector<ServerCommonPacketListenerImpl> refConnection
+            = new Reflector<>(ServerCommonPacketListenerImpl.class, VolatileFields.PLAYER_CONNECTION);
 
     @Override
     public void injectPlayer(Player player) {
@@ -82,7 +82,7 @@ public class VolatileCodeEnabled_v1_20_R1 implements VolatileCodeHandler {
         VolatileChannelHandler cdh = new VolatileChannelHandler(player, this);
 
         var listener = ((CraftPlayer) player).getHandle().connection;
-        var connection = (Connection) refConnection.get(listener, NMSFields.PLAYER_CONNECTION);
+        var connection = (Connection) refConnection.get(listener, VolatileFields.PLAYER_CONNECTION);
         var pipeline = connection.channel.pipeline();
 
         for (String name : pipeline.toMap().keySet()) {
@@ -96,7 +96,7 @@ public class VolatileCodeEnabled_v1_20_R1 implements VolatileCodeHandler {
     @Override
     public void removePlayer(Player player) {
         var listener = ((CraftPlayer) player).getHandle().connection;
-        var connection = (Connection) refConnection.get(listener, NMSFields.PLAYER_CONNECTION);
+        var connection = (Connection) refConnection.get(listener, VolatileFields.PLAYER_CONNECTION);
         var channel = connection.channel;
         channel.eventLoop().submit(() -> {
             channel.pipeline().remove("mc_cosmetics_packet_handler");
diff --git a/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/NMSFields.java b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/NMSFields.java
new file mode 100644
index 0000000000000000000000000000000000000000..d9114687c5120990bdfd1d8ea5b5649dd8823e95
--- /dev/null
+++ b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/NMSFields.java
@@ -0,0 +1,7 @@
+package io.lumine.cosmetics.nms.v1_21_R3;
+
+public class NMSFields {
+
+    public static final String EQUIPMENT_SLOTS = "d";
+
+}
diff --git a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileBackImpl.java b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileBackImpl.java
similarity index 75%
rename from v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileBackImpl.java
rename to v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileBackImpl.java
index dbab01974e5bbc180c82d70fc87e0dcaabde56c9..edcc1600f3dcfab5f541b6f810642008b0d9e264 100644
--- a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/cosmetic/VolatileBackImpl.java
+++ b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileBackImpl.java
@@ -1,5 +1,6 @@
-package io.lumine.cosmetics.nms.v1_19_R2.cosmetic;
+package io.lumine.cosmetics.nms.v1_21_R3.cosmetic;
 
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.mojang.datafixers.util.Pair;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
@@ -8,7 +9,7 @@ import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
 import io.lumine.cosmetics.managers.back.BackAccessory;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R2;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
 import io.lumine.cosmetics.players.Profile;
 import io.netty.buffer.Unpooled;
@@ -18,24 +19,26 @@ import net.minecraft.network.protocol.Packet;
 import net.minecraft.network.protocol.game.*;
 import net.minecraft.world.entity.EntityType;
 import net.minecraft.world.entity.EquipmentSlot;
+import net.minecraft.world.entity.PositionMoveRotation;
+import net.minecraft.world.entity.Relative;
 import net.minecraft.world.entity.decoration.ArmorStand;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
+import net.minecraft.world.phys.Vec3;
+import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack;
 import org.bukkit.entity.Player;
 
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 public class VolatileBackImpl implements VolatileEquipmentHelper {
 
 	@Getter
 	private final MCCosmeticsPlugin plugin;
-	private final VolatileCodeEnabled_v1_19_R2 nmsHandler;
+	private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
 	private final Map<Player, ArmorStand> activeProfile = Maps.newConcurrentMap();
 	private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
 
-	public VolatileBackImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R2 nmsHandler) {
+	public VolatileBackImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
 		this.plugin = plugin;
 		this.nmsHandler = nmsHandler;
 	}
@@ -64,18 +67,20 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
 		if(stand == null) {
 			playerTracker.put(player.getEntityId(), player);
 			stand = new ArmorStand(EntityType.ARMOR_STAND, ((CraftWorld) player.getWorld()).getHandle());
-			stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + nmsPlayer.getPassengersRidingOffset() + stand.getMyRidingOffset(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
+			stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + stand.getPassengerRidingPosition(nmsPlayer).y(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
 			stand.setMarker(true);
 			stand.setInvisible(true);
 			stand.setSilent(true);
 
 			activeProfile.put(player, stand);
 
-			var mobPacket = new ClientboundAddEntityPacket(stand);
+			var mobPacket = new ClientboundAddEntityPacket(stand.getId(), stand.getUUID(), nmsPlayer.getX(), nmsPlayer.getY() + stand.getPassengerRidingPosition(nmsPlayer).y(), nmsPlayer.getZ(), 0, 0, EntityType.ARMOR_STAND, 0, Vec3.ZERO, 0);
 			var dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
 			var passengersPacket = createPassengerPacket(player.getEntityId(), stand.getId());
 
-			nmsHandler.broadcastAroundAndSelf(player, mobPacket, dataPacket, passengersPacket);
+			final Collection<Packet<? super ClientGamePacketListener>> packets = Lists.newArrayList(mobPacket, dataPacket, passengersPacket);
+			final var bundlePacket = new ClientboundBundlePacket(packets);
+			nmsHandler.broadcastAroundAndSelf(player, bundlePacket);
 		}
 
 		stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
@@ -111,25 +116,23 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
         mannequin.removeExtraEntity(BackAccessory.class);
 
         var stand = new ArmorStand(EntityType.ARMOR_STAND, ((CraftWorld) player.getWorld()).getHandle());
-        stand.moveTo(mannequinLocation.getX(), mannequinLocation.getY() + stand.getMyRidingOffset(), mannequinLocation.getZ(), mannequinLocation.getYaw(), 0);
+        stand.moveTo(mannequinLocation.getX(), mannequinLocation.getY(), mannequinLocation.getZ(), mannequinLocation.getYaw(), 0);
         stand.setMarker(true);
         stand.setInvisible(true);
         stand.setSilent(true);
+		stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
 
         mannequin.addExtraEntity(BackAccessory.class, stand.getId());
-        
-        var mobPacket = new ClientboundAddEntityPacket(stand);
+
+		var mobPacket = new ClientboundAddEntityPacket(stand.getId(), stand.getUUID(), mannequinLocation.getX(), mannequinLocation.getY(), mannequinLocation.getZ(), 0, 0, EntityType.ARMOR_STAND, 0, Vec3.ZERO, 0);
         var dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
         var passengersPacket = createPassengerPacket(entityId, stand.getId());
-
-        nmsHandler.broadcast(player, mobPacket, dataPacket, passengersPacket);
-
-        stand.setItemSlot(EquipmentSlot.HEAD, nmsBack);
-
         var equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, nmsBack)));
 
-        nmsHandler.broadcast(player, equipmentPacket);
-    }
+		final Collection<Packet<? super ClientGamePacketListener>> packets = Lists.newArrayList(mobPacket, dataPacket, passengersPacket, equipmentPacket);
+		final var bundlePacket = new ClientboundBundlePacket(packets);
+		nmsHandler.broadcast(player, bundlePacket);
+	}
 
     @Override
     public void unequipMannequin(Mannequin mannequin) {
@@ -157,8 +160,12 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
 
 	@Override
 	public List<Object> write(Player receiver, Object packet) {
-		if(packet instanceof ClientboundAddPlayerPacket playerPacket) {
-			int id = playerPacket.getEntityId();
+		if(packet instanceof ClientboundAddEntityPacket playerPacket) {
+			if(playerPacket.getType() != EntityType.PLAYER) {
+				return null;
+			}
+
+			int id = playerPacket.getId();
 			if(playerTracker.containsKey(id)) {
 				final var spawnedPlayer = playerTracker.get(id);
 				final var profile = MCCosmeticsPlugin.inst().getProfiles().getProfile(spawnedPlayer);
@@ -212,13 +219,13 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
 	}
 
 	private List<Object> handleSpawn(Profile profile) {
-		if(!hasBack(profile))
+		if(!hasBack(profile)) {
 			return null;
-
+		}
 		final var wearer = profile.getPlayer();
 		final var stand = activeProfile.get(wearer);
 
-		var mobPacket = new ClientboundAddEntityPacket(stand);
+		var mobPacket = new ClientboundAddEntityPacket(stand, 0, stand.blockPosition());
 		ClientboundSetEntityDataPacket dataPacket = new ClientboundSetEntityDataPacket(stand.getId(), stand.getEntityData().getNonDefaultValues());
 		ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(stand.getId(), List.of(Pair.of(EquipmentSlot.HEAD, stand.getItemBySlot(EquipmentSlot.HEAD))));
 		ClientboundSetPassengersPacket passengersPacket = createPassengerPacket(wearer.getEntityId(), stand.getId());
@@ -248,36 +255,53 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
 					moveEntityPacket.getXa(),
 					moveEntityPacket.getYa(),
 					moveEntityPacket.getZa(),
-					moveEntityPacket.getyRot(),
-					moveEntityPacket.getxRot(),
+					encodeRot(moveEntityPacket.getyRot()),
+					encodeRot(moveEntityPacket.getxRot()),
 					false);
-		}else if(moveEntityPacket.hasPosition()) {
+		} else if(moveEntityPacket.hasPosition()) {
 			move = new ClientboundMoveEntityPacket.Pos(
 					stand.getId(),
 					moveEntityPacket.getXa(),
 					moveEntityPacket.getYa(),
 					moveEntityPacket.getZa(),
 					false);
-		}else {
+		} else {
 			move = new ClientboundMoveEntityPacket.Rot(
 					stand.getId(),
-					moveEntityPacket.getyRot(),
-					moveEntityPacket.getxRot(),
+					encodeRot(moveEntityPacket.getyRot()),
+					encodeRot(moveEntityPacket.getxRot()),
 					false);
 		}
 		return List.of(move);
 	}
 
+	protected byte encodeRot(float rot) {
+		return (byte) (rot / 360f * 255);
+	}
+
 	private List<Object> handleTeleport(Profile profile) {
-		if(!hasBack(profile))
+		if(!hasBack(profile)) {
 			return null;
+		}
 
 		final var wearer = profile.getPlayer();
 		final var nmsPlayer = ((CraftPlayer) wearer).getHandle();
 		final var stand = activeProfile.get(wearer);
-		stand.moveTo(nmsPlayer.getX(), nmsPlayer.getY() + nmsPlayer.getPassengersRidingOffset() + stand.getMyRidingOffset(), nmsPlayer.getZ(), nmsPlayer.getYRot(), 0);
 
-		return List.of(new ClientboundTeleportEntityPacket(stand));
+		final var x = nmsPlayer.getX();
+		final var y = nmsPlayer.getY() + stand.getPassengerRidingPosition(nmsPlayer).y();
+		final var z = nmsPlayer.getZ();
+
+		stand.moveTo(x, y, z, nmsPlayer.getYRot(), 0);
+
+		final Set<Relative> set = new HashSet<>();
+
+		final var delta = new Vec3(0,0,0);
+		final var positionMoveRotation = new PositionMoveRotation(new Vec3(x,y,z), delta, 0, nmsPlayer.getXRot());
+
+		final var packet = new ClientboundTeleportEntityPacket(stand.getId(), positionMoveRotation, set, false);
+
+		return List.of(packet);
 	}
 
 	private boolean hasBack(Profile profile) {
@@ -292,7 +316,7 @@ public class VolatileBackImpl implements VolatileEquipmentHelper {
 		FriendlyByteBuf bb = new FriendlyByteBuf(Unpooled.buffer());
 		bb.writeVarInt(mount);
 		bb.writeVarIntArray(driver);
-		return new ClientboundSetPassengersPacket(bb);
+		return ClientboundSetPassengersPacket.STREAM_CODEC.decode(bb);
 	}
 
 }
\ No newline at end of file
diff --git a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileGestureImpl.java b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileGestureImpl.java
similarity index 83%
rename from v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileGestureImpl.java
rename to v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileGestureImpl.java
index b0006dd5fac101f0482f9666463bf7219d7bf30c..ff9cef58a9e73188f989b6b814ee7b367cc77035 100644
--- a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileGestureImpl.java
+++ b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileGestureImpl.java
@@ -1,29 +1,21 @@
-package io.lumine.cosmetics.nms.v1_19_R3.cosmetic;
+package io.lumine.cosmetics.nms.v1_21_R3.cosmetic;
 
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.mojang.datafixers.util.Pair;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
-import io.lumine.cosmetics.api.cosmetics.manager.HideableCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
-import io.lumine.cosmetics.managers.gestures.Gesture;
-import io.lumine.cosmetics.managers.gestures.GestureManager;
-import io.lumine.cosmetics.managers.gestures.QuitMethod;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R3;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
-import io.lumine.cosmetics.players.Profile;
-import io.netty.buffer.Unpooled;
 import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
 import net.minecraft.network.protocol.game.*;
-import net.minecraft.world.entity.EntityType;
 import net.minecraft.world.entity.EquipmentSlot;
 import net.minecraft.world.entity.animal.horse.Horse;
 import net.minecraft.world.item.ItemStack;
-import org.bukkit.attribute.Attribute;
-import org.bukkit.craftbukkit.v1_19_R3.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R3.attribute.CraftAttributeMap;
-import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R3.attribute.CraftAttribute;
+import org.bukkit.craftbukkit.v1_21_R3.attribute.CraftAttributeMap;
+import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
 import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
@@ -42,19 +34,20 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 
 	@Getter
 	private final MCCosmeticsPlugin plugin;
-	private final VolatileCodeEnabled_v1_19_R3 nmsHandler;
+	private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
 	private final Set<Player> activeProfile = Sets.newConcurrentHashSet();
 	private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
 
 	private Horse horse;
 
-	public VolatileGestureImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R3 nmsHandler) {
+	public VolatileGestureImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
 		this.plugin = plugin;
 		this.nmsHandler = nmsHandler;
 	}
 
 	@Override
 	public void apply(CosmeticProfile profile) {
+		/*
 		if (profile == null)
 			return;
 		Player player = profile.getPlayer();
@@ -84,10 +77,13 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 		}
 		ClientboundSetEquipmentPacket equipmentPacket = new ClientboundSetEquipmentPacket(player.getEntityId(), empty);
 		nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
+
+		 */
 	}
 
 	@Override
 	public void unapply(CosmeticProfile profile) {
+		/*
 		if (profile == null)
 			return;
 		Player player = profile.getPlayer();
@@ -112,25 +108,32 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 				continue;
 			hide.show(profile);
 		}
+
+		 */
 	}
 
 	private ClientboundSetPassengersPacket createPassengerPacket(int mount, int... driver) {
+		/*
 		FriendlyByteBuf bb = new FriendlyByteBuf(Unpooled.buffer());
 		bb.writeVarInt(mount);
 		bb.writeVarIntArray(driver);
 		return new ClientboundSetPassengersPacket(bb);
+
+		 */
+		return null;
 	}
 
 	private void getHorsed(Player player) {
+		/*
 		final var nmsPlayer = ((CraftPlayer) player).getHandle();
 
 		if(horse == null) {
 			horse = new Horse(EntityType.HORSE, ((CraftWorld) player.getWorld()).getHandle());
 			horse.setInvisible(true);
 			horse.setHealth(0);
-			horse.getAttribute(CraftAttributeMap.toMinecraft(Attribute.GENERIC_MAX_HEALTH)).setBaseValue(0);
+			horse.getAttribute(CraftAttribute.bukkitToMinecraft(Attribute.MAX_HEALTH)).setBaseValue(0);
 		}
-		horse.setPos(nmsPlayer.getX(), nmsPlayer.getY() - horse.getPassengersRidingOffset() - nmsPlayer.getMyRidingOffset(), nmsPlayer.getZ());
+		horse.setPos(nmsPlayer.getX(), nmsPlayer.getY() - nmsPlayer.getMyRidingOffset(horse), nmsPlayer.getZ());
 
 		var mobPacket = new ClientboundAddEntityPacket(horse);
 		var dataPacket = new ClientboundSetEntityDataPacket(horse.getId(), horse.getEntityData().getNonDefaultValues());
@@ -138,17 +141,20 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 		var passengersPacket = createPassengerPacket(horse.getId(), nmsPlayer.getId());
 
 		nmsHandler.broadcast(player, mobPacket, dataPacket, attributesPacket, passengersPacket);
+
+		 */
 	}
 
 	@Override
 	public boolean read(Player sender, Object packet, boolean isCanceled) {
+		/*
 		if(!plugin.getGestureManager().getTicking().containsKey(sender)) {
 		    return true;
 		}
 
 		if(packet instanceof ServerboundPlayerInputPacket inputPacket) {
 			final var manager = (GestureManager) plugin.getGestureManager();
-			if(inputPacket.isShiftKeyDown())
+			if(inputPacket.input() == ServerboundPlayerInputPacket.)
 				manager.quit(sender, QuitMethod.SNEAK);
 			if(inputPacket.isJumping())
 				manager.quit(sender, QuitMethod.JUMP);
@@ -159,11 +165,13 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 				return false;
 			}
 		}
+		 */
 		return true;
 	}
 
 	@Override
 	public List<Object> write(Player receiver, Object packet) {
+		/*
 		if(packet instanceof ClientboundSetEquipmentPacket equipmentPacket) {
 			int id = equipmentPacket.getEntity();
 			final var spawnedPlayer = playerTracker.get(id);
@@ -173,6 +181,7 @@ public class VolatileGestureImpl implements VolatileEquipmentHelper {
 			if(profile != null)
 				return List.of(new ClientboundSetEquipmentPacket(id, empty));
 		}
+		 */
 		return null;
 	}
 }
diff --git a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileHatImpl.java b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileHatImpl.java
similarity index 90%
rename from v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileHatImpl.java
rename to v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileHatImpl.java
index ce5e16be76a220b9782fd4c5f0a99c4b37931683..0dac2e93b86bd6b9315941c546a6230f6cdadf40 100644
--- a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileHatImpl.java
+++ b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileHatImpl.java
@@ -1,6 +1,5 @@
-package io.lumine.cosmetics.nms.v1_19_R3.cosmetic;
+package io.lumine.cosmetics.nms.v1_21_R3.cosmetic;
 
-import com.google.common.collect.Maps;
 import com.mojang.datafixers.util.Pair;
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
@@ -8,22 +7,18 @@ import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
 import io.lumine.cosmetics.managers.hats.Hat;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R3;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
+import io.lumine.cosmetics.nms.v1_21_R3.NMSFields;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.logging.Log;
-import io.lumine.utils.reflection.Reflector;
-import io.netty.buffer.Unpooled;
+import io.lumine.mythic.bukkit.utils.reflection.Reflector;
 import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
 import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
 import net.minecraft.network.protocol.game.ServerboundAcceptTeleportationPacket;
 import net.minecraft.world.entity.EquipmentSlot;
-import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack;
 import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -31,10 +26,10 @@ import java.util.List;
 public class VolatileHatImpl implements VolatileEquipmentHelper {
 
     @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_19_R3 nmsHandler;
+    private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
     //private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
 
-    public VolatileHatImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R3 nmsHandler) {
+    public VolatileHatImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
         this.plugin = plugin;
         this.nmsHandler = nmsHandler;
     }
@@ -158,7 +153,7 @@ public class VolatileHatImpl implements VolatileEquipmentHelper {
         nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
     }
     
-    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, "c");
+    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, NMSFields.EQUIPMENT_SLOTS);
     
     private void modifyPacket(Profile profile, ClientboundSetEquipmentPacket packet) {
         final var maybeEquipped = profile.getEquipped(Hat.class);
@@ -192,7 +187,7 @@ public class VolatileHatImpl implements VolatileEquipmentHelper {
             newSlots.add(Pair.of(EquipmentSlot.HEAD, nmsItem));
         }
         
-        refEq.set(packet, "c", newSlots);
+        refEq.set(packet, NMSFields.EQUIPMENT_SLOTS, newSlots);
     }
 
 }
diff --git a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileOffhandImpl.java b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileOffhandImpl.java
similarity index 87%
rename from v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileOffhandImpl.java
rename to v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileOffhandImpl.java
index 8f96447db06e2c50a966f57c0a007523fdfbde2d..462aa18afbeac9214f58a827f2a3c495a539170f 100644
--- a/v1_19_R3/src/main/java/io/lumine/cosmetics/nms/v1_19_R3/cosmetic/VolatileOffhandImpl.java
+++ b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileOffhandImpl.java
@@ -1,4 +1,4 @@
-package io.lumine.cosmetics.nms.v1_19_R3.cosmetic;
+package io.lumine.cosmetics.nms.v1_21_R3.cosmetic;
 
 import com.google.common.collect.Maps;
 import com.mojang.datafixers.util.Pair;
@@ -7,20 +7,17 @@ import io.lumine.cosmetics.api.cosmetics.EquippedCosmetic;
 import io.lumine.cosmetics.api.cosmetics.ItemCosmetic;
 import io.lumine.cosmetics.api.players.CosmeticProfile;
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
-import io.lumine.cosmetics.managers.hats.Hat;
 import io.lumine.cosmetics.managers.offhand.Offhand;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R3;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
 import io.lumine.cosmetics.nms.cosmetic.VolatileEquipmentHelper;
+import io.lumine.cosmetics.nms.v1_21_R3.NMSFields;
 import io.lumine.cosmetics.players.Profile;
-import io.lumine.utils.reflection.Reflector;
-import io.netty.buffer.Unpooled;
+import io.lumine.mythic.bukkit.utils.reflection.Reflector;
 import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
 import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
 import net.minecraft.world.entity.EquipmentSlot;
-import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer;
-import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack;
 import org.bukkit.entity.Player;
 
 import java.util.ArrayList;
@@ -30,10 +27,10 @@ import java.util.Map;
 public class VolatileOffhandImpl implements VolatileEquipmentHelper {
 
     @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_19_R3 nmsHandler;
+    private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
     private final Map<Integer, Player> playerTracker = Maps.newConcurrentMap();
 
-    public VolatileOffhandImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_19_R3 nmsHandler) {
+    public VolatileOffhandImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
         this.plugin = plugin;
         this.nmsHandler = nmsHandler;
     }
@@ -134,10 +131,10 @@ public class VolatileOffhandImpl implements VolatileEquipmentHelper {
         nmsHandler.broadcastAroundAndSelf(player, equipmentPacket);
     }
     
-    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, "c");
+    private static Reflector<ClientboundSetEquipmentPacket> refEq = new Reflector(ClientboundSetEquipmentPacket.class, NMSFields.EQUIPMENT_SLOTS);
     
     private void modifyPacket(Profile profile, ClientboundSetEquipmentPacket packet) {
-        final var maybeEquipped = profile.getEquipped(Hat.class);
+        final var maybeEquipped = profile.getEquipped(Offhand.class);
         if(maybeEquipped.isEmpty()) {
             return;
         }
@@ -157,7 +154,7 @@ public class VolatileOffhandImpl implements VolatileEquipmentHelper {
         for(var pair : slots) {
             final EquipmentSlot slot = pair.getFirst();
             
-            if(slot == EquipmentSlot.HEAD) {
+            if(slot == EquipmentSlot.OFFHAND) {
                 foundHead = true;
                 newSlots.add(Pair.of(pair.getFirst(), nmsItem));
             } else {
@@ -165,9 +162,9 @@ public class VolatileOffhandImpl implements VolatileEquipmentHelper {
             }
         }
         if(!foundHead) {
-            newSlots.add(Pair.of(EquipmentSlot.HEAD, nmsItem));
+            newSlots.add(Pair.of(EquipmentSlot.OFFHAND, nmsItem));
         }
-        refEq.set(packet, "c", newSlots);
+        refEq.set(packet, NMSFields.EQUIPMENT_SLOTS, newSlots);
     }
 
 }
diff --git a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileSprayImpl.java b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileSprayImpl.java
similarity index 86%
rename from v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileSprayImpl.java
rename to v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileSprayImpl.java
index 9dd9d68f4b2511ff0406215feb68bfd0de07df2e..b946a9d2ef382ab27cb19138c475558561e33f82 100644
--- a/v1_20_R1/src/main/java/io/lumine/cosmetics/nms/v1_20_R1/cosmetic/VolatileSprayImpl.java
+++ b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/cosmetic/VolatileSprayImpl.java
@@ -1,8 +1,8 @@
-package io.lumine.cosmetics.nms.v1_20_R1.cosmetic;
+package io.lumine.cosmetics.nms.v1_21_R3.cosmetic;
 
 import io.lumine.cosmetics.MCCosmeticsPlugin;
 import io.lumine.cosmetics.managers.sprays.Spray;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_20_R1;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
 import io.lumine.cosmetics.nms.cosmetic.VolatileSprayHelper;
 import lombok.Getter;
 import net.minecraft.core.BlockPos;
@@ -11,21 +11,22 @@ import net.minecraft.network.protocol.game.ClientboundAddEntityPacket;
 import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket;
 import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket;
 import net.minecraft.world.entity.decoration.ItemFrame;
+import net.minecraft.world.level.saveddata.maps.MapId;
 import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
 import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.block.BlockFace;
-import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;
-import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.meta.MapMeta;
 
 public class VolatileSprayImpl implements VolatileSprayHelper {
 
     @Getter private final MCCosmeticsPlugin plugin;
-    private final VolatileCodeEnabled_v1_20_R1 nmsHandler;
+    private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
 
-    public VolatileSprayImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_20_R1 nmsHandler) {
+    public VolatileSprayImpl(MCCosmeticsPlugin plugin, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
         this.plugin = plugin;
         this.nmsHandler = nmsHandler;
     }
@@ -60,7 +61,7 @@ public class VolatileSprayImpl implements VolatileSprayHelper {
         frame.setInvisible(true);
         frame.setRotation(rotation);
 
-        var packetAdd = new ClientboundAddEntityPacket(frame, dir);
+        var packetAdd = new ClientboundAddEntityPacket(frame, dir, pos);
         var packetData = new ClientboundSetEntityDataPacket(frame.getId(), frame.getEntityData().getNonDefaultValues());
         var packetMap = constructMapPacket(image.getMapNumber(), image.getPixels());
         
@@ -78,7 +79,7 @@ public class VolatileSprayImpl implements VolatileSprayHelper {
     
     private ClientboundMapItemDataPacket constructMapPacket(int id, byte[] pixels) {
         var mapData = constructMapData(startX, startY, mapWidth, mapHeight, pixels);
-        var packet = new ClientboundMapItemDataPacket(id, mapScale, mapLocked, null, mapData);
+        var packet = new ClientboundMapItemDataPacket(new MapId(id), mapScale, mapLocked, null, mapData);
 
         return packet;
     }
diff --git a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/network/VolatileChannelHandler.java b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/network/VolatileChannelHandler.java
similarity index 87%
rename from v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/network/VolatileChannelHandler.java
rename to v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/network/VolatileChannelHandler.java
index 017ae708279545c0ff73e661ede9817f16e6fda6..88f0b6e935b468792829f9c337b49911ed93185b 100644
--- a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/network/VolatileChannelHandler.java
+++ b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/network/VolatileChannelHandler.java
@@ -1,6 +1,6 @@
-package io.lumine.cosmetics.nms.v1_19_R2.network;
+package io.lumine.cosmetics.nms.v1_21_R3.network;
 
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R2;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
 import io.netty.channel.ChannelDuplexHandler;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelPromise;
@@ -12,10 +12,10 @@ import java.util.List;
 
 public class VolatileChannelHandler extends ChannelDuplexHandler {
 
-	private final VolatileCodeEnabled_v1_19_R2 nmsHandler;
+	private final VolatileCodeEnabled_v1_21_R3 nmsHandler;
 	@Getter private final Player player;
 
-	public VolatileChannelHandler(Player player, VolatileCodeEnabled_v1_19_R2 nmsHandler) {
+	public VolatileChannelHandler(Player player, VolatileCodeEnabled_v1_21_R3 nmsHandler) {
 		this.player = player;
 		this.nmsHandler = nmsHandler;
 	}
diff --git a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/wardrobe/MannequinEntity.java b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/wardrobe/MannequinEntity.java
similarity index 56%
rename from v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/wardrobe/MannequinEntity.java
rename to v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/wardrobe/MannequinEntity.java
index 5064d53f997cfcf5f346bdf98886a70d7f86b471..1407bad3fd199637dac52b7a87cb96f05afe4174 100644
--- a/v1_19_R2/src/main/java/io/lumine/cosmetics/nms/v1_19_R2/wardrobe/MannequinEntity.java
+++ b/v1_21_R3/src/main/java/io/lumine/cosmetics/nms/v1_21_R3/wardrobe/MannequinEntity.java
@@ -1,12 +1,20 @@
-package io.lumine.cosmetics.nms.v1_19_R2.wardrobe;
+package io.lumine.cosmetics.nms.v1_21_R3.wardrobe;
 
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 
+import io.lumine.mythic.bukkit.MythicBukkit;
+import io.netty.buffer.Unpooled;
+import net.minecraft.core.RegistryAccess;
+import net.minecraft.network.FriendlyByteBuf;
+import net.minecraft.network.RegistryFriendlyByteBuf;
+import net.minecraft.network.codec.ByteBufCodecs;
+import net.minecraft.network.protocol.game.*;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.level.GameType;
+import net.minecraft.world.phys.Vec3;
 import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_19_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer;
 import org.bukkit.entity.Player;
 
 import com.google.common.collect.Lists;
@@ -17,70 +25,62 @@ import com.mojang.datafixers.util.Pair;
 import io.lumine.cosmetics.api.cosmetics.Cosmetic;
 import io.lumine.cosmetics.api.players.wardrobe.Mannequin;
 import io.lumine.cosmetics.api.players.wardrobe.WardrobeTracker;
-import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_19_R2;
-import io.netty.buffer.Unpooled;
+import io.lumine.cosmetics.nms.VolatileCodeEnabled_v1_21_R3;
 import lombok.Getter;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.game.ClientboundAddPlayerPacket;
-import net.minecraft.network.protocol.game.ClientboundAnimatePacket;
-import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket;
-import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket;
-import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket;
-import net.minecraft.network.protocol.game.ClientboundRotateHeadPacket;
-import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
-import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket;
-import net.minecraft.server.level.ServerPlayer;
 import net.minecraft.world.entity.EquipmentSlot;
 
 public class MannequinEntity implements Mannequin {
 
-    private final VolatileCodeEnabled_v1_19_R2 handler;
+    private final VolatileCodeEnabled_v1_21_R3 handler;
     @Getter private final WardrobeTracker tracker;
     @Getter private final UUID uniqueId;
     @Getter private final Player player;
     @Getter private final Location location;
     @Getter private float rotation;
     
-    @Getter private ServerPlayer fakePlayer;
+    @Getter private int fakePlayerId;
     private Map<Class<? extends Cosmetic>,Integer> extraEntities = Maps.newConcurrentMap();
 
-    public MannequinEntity(WardrobeTracker tracker, VolatileCodeEnabled_v1_19_R2 handler, Player player, Location location) {
+    public MannequinEntity(WardrobeTracker tracker, VolatileCodeEnabled_v1_21_R3 handler, Player player, Location location) {
         this.tracker = tracker;
         this.handler = handler;
         this.player = player;
         this.location = location;
+        this.fakePlayerId = MythicBukkit.inst().getVolatileCodeHandler().getEntityHandler().getNextEntityId();
         this.uniqueId = UUID.randomUUID();
-        
+
         var serverPlayer = ((CraftPlayer) player).getHandle();
         var level = ((CraftWorld) location.getWorld()).getHandle();
 
         this.rotation = serverPlayer.getYRot() + 180;
-        
-        if(rotation > 180) { 
+
+        if(rotation > 180) {
             rotation = rotation - 360;
         }
-        
+
         var gameProfile = serverPlayer.getGameProfile();
-        
+
         gameProfile = new GameProfile(uniqueId, "Wardrobe");
         gameProfile.getProperties().putAll(serverPlayer.getGameProfile().getProperties());
-        
-        this.fakePlayer = new ServerPlayer(level.getServer(), level, gameProfile);
-        
-        var spawn = new FriendlyByteBuf(Unpooled.buffer());
-        
-        spawn.writeVarInt(fakePlayer.getId());
-        spawn.writeUUID(fakePlayer.getUUID());
-        spawn.writeDouble(location.getX());
-        spawn.writeDouble(location.getY());
-        spawn.writeDouble(location.getZ());
-        spawn.writeByte((byte)(int)(serverPlayer.getYRot() * 256.0F / 360.0F));
-        spawn.writeByte((byte)(int)(serverPlayer.getXRot() * 256.0F / 360.0F));
-
-        var packetPlayerInfo = new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, fakePlayer);
-        var packetAddPlayer = new ClientboundAddPlayerPacket(spawn);
-
-        var equipmentPacket = new ClientboundSetEquipmentPacket(fakePlayer.getId(), 
+
+        final var buf = new RegistryFriendlyByteBuf(Unpooled.buffer(), RegistryAccess.EMPTY);
+
+        final EnumSet<ClientboundPlayerInfoUpdatePacket.Action> actionSet = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER);
+        buf.writeEnumSet(actionSet, ClientboundPlayerInfoUpdatePacket.Action.class);
+
+        var fakePlayerEntry = List.of(new ClientboundPlayerInfoUpdatePacket.Entry(uniqueId, gameProfile, false, 0, GameType.CREATIVE, null, true, 0, null));
+        buf.writeCollection(fakePlayerEntry, (var0x, var1) -> {
+            var0x.writeUUID(var1.profileId());
+
+            GameProfile var2 = (GameProfile) Objects.requireNonNull(var1.profile());
+            var0x.writeUtf(var2.getName(), 16);
+            ByteBufCodecs.GAME_PROFILE_PROPERTIES.encode(var0x, var2.getProperties());
+        });
+
+        var packetPlayerInfo = ClientboundPlayerInfoUpdatePacket.STREAM_CODEC.decode(buf);
+
+        var packetAddPlayer = new ClientboundAddEntityPacket(fakePlayerId, uniqueId, location.getX(), location.getY(), location.getZ(), serverPlayer.getXRot(), serverPlayer.getYRot(), EntityType.PLAYER, 0, Vec3.ZERO, serverPlayer.getYHeadRot());
+        var equipmentPacket = new ClientboundSetEquipmentPacket(fakePlayerId,
                 List.of(Pair.of(EquipmentSlot.HEAD, serverPlayer.getItemBySlot(EquipmentSlot.HEAD)),
                         Pair.of(EquipmentSlot.CHEST, serverPlayer.getItemBySlot(EquipmentSlot.CHEST)),
                         Pair.of(EquipmentSlot.LEGS, serverPlayer.getItemBySlot(EquipmentSlot.LEGS)),
@@ -89,20 +89,27 @@ public class MannequinEntity implements Mannequin {
                         Pair.of(EquipmentSlot.OFFHAND, serverPlayer.getItemBySlot(EquipmentSlot.OFFHAND))));
 
         var head = (byte)(int)(rotation * 256.0F / 360.0F);
-        var rotatePacket = new ClientboundRotateHeadPacket(fakePlayer, head);
-        
-        var swingPacket = new ClientboundAnimatePacket(fakePlayer, 0);
-        
+
+        var rotateByteBuf = new FriendlyByteBuf(Unpooled.buffer());
+        rotateByteBuf.writeVarInt(fakePlayerId);
+        rotateByteBuf.writeByte(head);
+        var rotatePacket = ClientboundRotateHeadPacket.STREAM_CODEC.decode(rotateByteBuf);
+
+        var animateByteBuf = new FriendlyByteBuf(Unpooled.buffer());
+        animateByteBuf.writeVarInt(fakePlayerId);
+        animateByteBuf.writeByte(ClientboundAnimatePacket.SWING_MAIN_HAND);
+        var swingPacket = ClientboundAnimatePacket.STREAM_CODEC.decode(animateByteBuf);
+
         handler.broadcast(player, packetPlayerInfo, packetAddPlayer, equipmentPacket, rotatePacket, swingPacket);
-        
+
         for(var eq : handler.getPlugin().getProfiles().getProfile(player).getEquipped().values()) {
             eq.getCosmetic().getManager().equipMannequin(this, eq);
         }
     }
     
     public void despawn() {
-        var packetPlayerInfo = new ClientboundPlayerInfoRemovePacket(Lists.newArrayList(fakePlayer.getUUID()));
-        var packetRemovePlayer = new ClientboundRemoveEntitiesPacket(fakePlayer.getId());
+        var packetPlayerInfo = new ClientboundPlayerInfoRemovePacket(Lists.newArrayList(uniqueId));
+        var packetRemovePlayer = new ClientboundRemoveEntitiesPacket(fakePlayerId);
         
         handler.broadcast(player, packetPlayerInfo, packetRemovePlayer);
         
@@ -126,7 +133,7 @@ public class MannequinEntity implements Mannequin {
     }
     
     public int getEntityId() {
-        return fakePlayer.getId();
+        return fakePlayerId;
     }
 
 }