diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AuraSkillsHook.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AuraSkillsHook.java
index db3eb2a9..34e22ba1 100644
--- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AuraSkillsHook.java
+++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AuraSkillsHook.java
@@ -83,7 +83,7 @@ public class AuraSkillsHook implements RPGHandler, Listener {
 
         double currentMaxMana = user.getMaxMana();
 
-        if(user.getMana() > currentMaxMana) {
+        if (user.getMana() > currentMaxMana) {
             user.setMana(currentMaxMana);
         }
 
@@ -106,13 +106,13 @@ public class AuraSkillsHook implements RPGHandler, Listener {
     public void a(UserLoadEvent event) {
         Player player = event.getPlayer();
         PlayerData playerData = PlayerData.get(player);
-        playerData.setRPGPlayer(new AuraSkillsPlayer(playerData, event.getUser()));
+        playerData.setRPGPlayer(new PlayerWrapper(playerData, event.getUser()));
     }
 
-    public static class AuraSkillsPlayer extends RPGPlayer {
+    private static class PlayerWrapper extends RPGPlayer {
         private final SkillsUser info;
 
-        public AuraSkillsPlayer(PlayerData playerData, SkillsUser rpgPlayerData) {
+        public PlayerWrapper(PlayerData playerData, SkillsUser rpgPlayerData) {
             super(playerData);
 
             info = rpgPlayerData;
@@ -149,7 +149,7 @@ public class AuraSkillsHook implements RPGHandler, Listener {
         }
     }
 
-    public class RequiredProfessionStat extends RequiredLevelStat {
+    private class RequiredProfessionStat extends RequiredLevelStat {
         private final Skill skill;
 
         public RequiredProfessionStat(Skills skill) {
@@ -161,19 +161,17 @@ public class AuraSkillsHook implements RPGHandler, Listener {
 
         @Override
         public boolean canUse(RPGPlayer player, NBTItem item, boolean message) {
+            final int requirement = item.getInteger(this.getNBTPath());
+            if (requirement <= 0) return true;
 
             final int skillLevel = aSkills.getUser(player.getPlayer().getUniqueId()).getSkillLevel(skill);
-            final int required = item.getInteger("MMOITEMS_REQUIRED_" + skill.name());
+            if (skillLevel >= requirement || player.getPlayer().hasPermission("mmoitems.bypass.level")) return true;
 
-            if (skillLevel < required && !player.getPlayer().hasPermission("mmoitems.bypass.level")) {
-                if (message) {
-                    Message.NOT_ENOUGH_PROFESSION.format(ChatColor.RED, "#profession#", skill.getDisplayName(Locale.getDefault())).send(player.getPlayer());
-                    player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f);
-                }
-                return false;
+            if (message) {
+                Message.NOT_ENOUGH_PROFESSION.format(ChatColor.RED, "#profession#", skill.getDisplayName(Locale.getDefault())).send(player.getPlayer());
+                player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f);
             }
-
-            return true;
+            return false;
         }
     }
 }
\ No newline at end of file
diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AureliumSkillsHook.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AureliumSkillsHook.java
index 73feadf7..98f8d446 100644
--- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AureliumSkillsHook.java
+++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/rpg/AureliumSkillsHook.java
@@ -91,13 +91,13 @@ public class AureliumSkillsHook implements RPGHandler, Listener {
     public void a(PlayerDataLoadEvent event) {
         Player player = event.getPlayerData().getPlayer();
         PlayerData playerData = PlayerData.get(player);
-        playerData.setRPGPlayer(new AureliumSkillsPlayer(playerData, event.getPlayerData()));
+        playerData.setRPGPlayer(new PlayerWrapper(playerData, event.getPlayerData()));
     }
 
-    public class AureliumSkillsPlayer extends RPGPlayer {
+    public class PlayerWrapper extends RPGPlayer {
         private final com.archyx.aureliumskills.data.PlayerData info;
 
-        public AureliumSkillsPlayer(PlayerData playerData, com.archyx.aureliumskills.data.PlayerData rpgPlayerData) {
+        public PlayerWrapper(PlayerData playerData, com.archyx.aureliumskills.data.PlayerData rpgPlayerData) {
             super(playerData);
 
             info = rpgPlayerData;
@@ -150,19 +150,17 @@ public class AureliumSkillsHook implements RPGHandler, Listener {
 
         @Override
         public boolean canUse(RPGPlayer player, NBTItem item, boolean message) {
+            final int requirement = item.getInteger(this.getNBTPath());
+            if (requirement <= 0) return true;
 
             final int skillLevel = AureliumAPI.getSkillLevel(player.getPlayer(), skill);
-            final int required = item.getInteger("MMOITEMS_REQUIRED_" + skill.name());
+            if (skillLevel >= requirement || player.getPlayer().hasPermission("mmoitems.bypass.level")) return true;
 
-            if (skillLevel < required && !player.getPlayer().hasPermission("mmoitems.bypass.level")) {
-                if (message) {
-                    Message.NOT_ENOUGH_PROFESSION.format(ChatColor.RED, "#profession#", skill.getDisplayName(Locale.getDefault())).send(player.getPlayer());
-                    player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f);
-                }
-                return false;
+            if (message) {
+                Message.NOT_ENOUGH_PROFESSION.format(ChatColor.RED, "#profession#", skill.getDisplayName(Locale.getDefault())).send(player.getPlayer());
+                player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f);
             }
-
-            return true;
+            return false;
         }
     }
 }
\ No newline at end of file
diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/RequiredLevel.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/RequiredLevel.java
index 6d4a5c00..b00d4112 100644
--- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/RequiredLevel.java
+++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/RequiredLevel.java
@@ -1,29 +1,17 @@
 package net.Indyuce.mmoitems.stat;
 
-import io.lumine.mythic.lib.api.item.ItemTag;
 import io.lumine.mythic.lib.api.item.NBTItem;
-import io.lumine.mythic.lib.api.item.SupportedNBTTagValues;
 import net.Indyuce.mmoitems.ItemStats;
-import net.Indyuce.mmoitems.api.item.build.ItemStackBuilder;
-import net.Indyuce.mmoitems.api.item.mmoitem.ReadMMOItem;
 import net.Indyuce.mmoitems.api.player.RPGPlayer;
-import net.Indyuce.mmoitems.api.util.NumericStatFormula;
 import net.Indyuce.mmoitems.api.util.message.Message;
-import net.Indyuce.mmoitems.stat.data.DoubleData;
 import net.Indyuce.mmoitems.stat.data.RequiredLevelData;
-import net.Indyuce.mmoitems.stat.data.random.RandomRequiredLevelData;
-import net.Indyuce.mmoitems.stat.data.type.StatData;
-import net.Indyuce.mmoitems.stat.type.DoubleStat;
-import net.Indyuce.mmoitems.stat.type.ItemRestriction;
+import net.Indyuce.mmoitems.stat.type.RequiredLevelStat;
 import org.bukkit.ChatColor;
 import org.bukkit.Material;
 import org.bukkit.Sound;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
-import java.util.ArrayList;
-
-public class RequiredLevel extends DoubleStat implements ItemRestriction {
+public class RequiredLevel extends RequiredLevelStat {
 
     /**
      * Stat that uses a custom DoubleStatData because the merge algorithm is
@@ -31,100 +19,21 @@ public class RequiredLevel extends DoubleStat implements ItemRestriction {
      * only keep the highest levels of the two and not sum the two values
      */
     public RequiredLevel() {
-        super("REQUIRED_LEVEL", Material.EXPERIENCE_BOTTLE, "Required Level",
-                new String[]{"The level your item needs", "in order to be used."}, new String[]{"!block", "all"});
-    }
-
-    @Override
-    public void whenApplied(@NotNull ItemStackBuilder item, @NotNull DoubleData data) {
-        final int lvl = (int) data.getValue();
-        if (lvl <= 0) return;
-
-        item.getLore().insert(getPath(), DoubleStat.formatPath(getPath(), getGeneralStatFormat(), false, false, lvl));
-        item.addItemTag(getAppliedNBT(data));
-    }
-
-    @Override
-    public void whenPreviewed(@NotNull ItemStackBuilder item, @NotNull DoubleData currentData, @NotNull NumericStatFormula templateData) throws IllegalArgumentException {
-
-        // Get Value
-        double techMinimum = templateData.calculate(0, NumericStatFormula.FormulaInputType.LOWER_BOUND);
-        double techMaximum = templateData.calculate(0, NumericStatFormula.FormulaInputType.UPPER_BOUND);
-
-        // Add NBT Path
-        item.addItemTag(getAppliedNBT(currentData));
-
-        // Display if not ZERO
-        if (techMinimum != 0 || techMaximum != 0) {
-            final String builtRange = DoubleStat.formatPath(getPath(), getGeneralStatFormat(), false, false, Math.floor(techMinimum), Math.floor(techMaximum));
-
-            // Just display normally
-            item.getLore().insert(getPath(), builtRange);
-        }
-    }
-
-    @NotNull
-    @Override
-    public ArrayList<ItemTag> getAppliedNBT(@NotNull DoubleData data) {
-
-        // Make and bake
-        ArrayList<ItemTag> ret = new ArrayList<>();
-        ret.add(new ItemTag(getNBTPath(), data.getValue()));
-        return ret;
-    }
-
-    @Override
-    public RandomRequiredLevelData whenInitialized(Object object) {
-        return new RandomRequiredLevelData(object);
-    }
-
-    @Override
-    public void whenLoaded(@NotNull ReadMMOItem mmoitem) {
-
-        // Find relevat tgs
-        ArrayList<ItemTag> tags = new ArrayList<>();
-        if (mmoitem.getNBT().hasTag(getNBTPath()))
-            tags.add(ItemTag.getTagAtPath(getNBTPath(), mmoitem.getNBT(), SupportedNBTTagValues.DOUBLE));
-
-        // Build
-        StatData data = getLoadedNBT(tags);
-
-        // Valid?
-        if (data != null) {
-            mmoitem.setData(this, data);
-        }
-    }
-
-
-    @Nullable
-    @Override
-    public RequiredLevelData getLoadedNBT(@NotNull ArrayList<ItemTag> storedTags) {
-
-        // Find
-        ItemTag rTag = ItemTag.getTagAtPath(getNBTPath(), storedTags);
-
-        // Found?
-        if (rTag != null) {
-
-            // Yes
-            return new RequiredLevelData((Double) rTag.getValue());
-        }
-
-        // no
-        return null;
+        super("LEVEL", Material.EXPERIENCE_BOTTLE, "Level", new String[]{"The level your item needs", "in order to be used."});
     }
 
     @Override
     public boolean canUse(RPGPlayer player, NBTItem item, boolean message) {
-        int level = item.getInteger(ItemStats.REQUIRED_LEVEL.getNBTPath());
-        if (player.getLevel() < level && !player.getPlayer().hasPermission("mmoitems.bypass.level")) {
-            if (message) {
-                Message.NOT_ENOUGH_LEVELS.format(ChatColor.RED).send(player.getPlayer());
-                player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f);
-            }
-            return false;
+        final int level = item.getInteger(this.getNBTPath());
+        if (level <= 0) return true;
+
+        if (player.getLevel() >= level || player.getPlayer().hasPermission("mmoitems.bypass.level")) return true;
+
+        if (message) {
+            Message.NOT_ENOUGH_LEVELS.format(ChatColor.RED).send(player.getPlayer());
+            player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1.5f);
         }
-        return true;
+        return false;
     }
 
 	/*
diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/RequiredLevelStat.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/RequiredLevelStat.java
index ff7c3887..923c511a 100644
--- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/RequiredLevelStat.java
+++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/stat/type/RequiredLevelStat.java
@@ -2,6 +2,7 @@ package net.Indyuce.mmoitems.stat.type;
 
 import io.lumine.mythic.lib.api.item.ItemTag;
 import io.lumine.mythic.lib.api.item.SupportedNBTTagValues;
+import io.lumine.mythic.lib.util.annotation.BackwardsCompatibility;
 import net.Indyuce.mmoitems.api.item.build.ItemStackBuilder;
 import net.Indyuce.mmoitems.api.item.mmoitem.ReadMMOItem;
 import net.Indyuce.mmoitems.api.util.NumericStatFormula;
@@ -16,18 +17,25 @@ import org.jetbrains.annotations.Nullable;
 import java.util.ArrayList;
 
 /**
- * Used by {@link net.Indyuce.mmoitems.comp.rpg.AuraSkillsHook}
- * to handle required skill levels.
+ * Mostly used by external plugins to implement custom level
+ * requirements like Heroes secondary hero level reqs or
+ * AuraSkills/MMOCore for profession levels.
+ *
+ * @author Jules
  */
 public abstract class RequiredLevelStat extends DoubleStat implements ItemRestriction, GemStoneStat {
     // private final String idKey;
 
+    @Deprecated
+    @BackwardsCompatibility(version = "6.10")
+    public RequiredLevelStat(boolean ignored, String idKey, Material mat, String nameKey, String[] lore) {
+        super(idKey, mat, "Required " + nameKey, lore, new String[]{"!block", "all"});
+
+        // this.idKey = idKey;
+    }
+
     public RequiredLevelStat(String idKey, Material mat, String nameKey, String[] lore) {
-        super("REQUIRED_" + idKey,
-                mat,
-                "Required " + nameKey,
-                lore,
-                new String[]{"!block", "all"});
+        super("REQUIRED_" + idKey, mat, "Required " + nameKey, lore, new String[]{"!block", "all"});
 
         // this.idKey = idKey;
     }
@@ -36,12 +44,12 @@ public abstract class RequiredLevelStat extends DoubleStat implements ItemRestri
     public void whenApplied(@NotNull ItemStackBuilder item, @NotNull DoubleData data) {
 
         // Lore Management
-        int lvl = (int) data.getValue();
-        String format = getGeneralStatFormat().replace("{value}", String.valueOf(lvl));
+        final int requirement = (int) data.getValue();
+        final String format = getGeneralStatFormat().replace("{value}", String.valueOf(requirement));
         item.getLore().insert(getPath(), format);
 
         // Insert NBT
-        item.addItemTag(new ItemTag(getNBTPath(), lvl));
+        item.addItemTag(new ItemTag(getNBTPath(), requirement));
     }
 
     @Override
@@ -52,18 +60,13 @@ public abstract class RequiredLevelStat extends DoubleStat implements ItemRestri
         double techMaximum = templateData.calculate(0, NumericStatFormula.FormulaInputType.UPPER_BOUND);
 
         // Cancel if it its NEGATIVE and this doesn't support negative stats.
-        if (techMaximum < 0 && !handleNegativeStats()) {
-            return;
-        }
-        if (techMinimum < 0 && !handleNegativeStats()) {
-            techMinimum = 0;
-        }
-        if (techMinimum < ((NumericStatFormula) templateData).getBase() - ((NumericStatFormula) templateData).getMaxSpread()) {
-            techMinimum = ((NumericStatFormula) templateData).getBase() - ((NumericStatFormula) templateData).getMaxSpread();
-        }
-        if (techMaximum > ((NumericStatFormula) templateData).getBase() + ((NumericStatFormula) templateData).getMaxSpread()) {
-            techMaximum = ((NumericStatFormula) templateData).getBase() + ((NumericStatFormula) templateData).getMaxSpread();
-        }
+        if (techMaximum < 0 && !handleNegativeStats()) return;
+
+        if (techMinimum < 0 && !handleNegativeStats()) techMinimum = 0;
+        if (techMinimum < templateData.getBase() - templateData.getMaxSpread())
+            techMinimum = templateData.getBase() - templateData.getMaxSpread();
+        if (techMaximum > templateData.getBase() + templateData.getMaxSpread())
+            techMaximum = templateData.getBase() + templateData.getMaxSpread();
 
         // Add NBT Path
         item.addItemTag(getAppliedNBT(currentData));
@@ -91,7 +94,7 @@ public abstract class RequiredLevelStat extends DoubleStat implements ItemRestri
     @Override
     public void whenLoaded(@NotNull ReadMMOItem mmoitem) {
 
-        // Find relevat tgs
+        // Find relevant tgs
         ArrayList<ItemTag> tags = new ArrayList<>();
         if (mmoitem.getNBT().hasTag(getNBTPath()))
             tags.add(ItemTag.getTagAtPath(getNBTPath(), mmoitem.getNBT(), SupportedNBTTagValues.DOUBLE));