diff --git a/core/pom.xml b/core/pom.xml
index 7f78d5d..f5f4aab 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -15,7 +15,6 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <cache2k-version>2.6.1.Final</cache2k-version>
     </properties>
 
     <repositories>
@@ -23,10 +22,6 @@
             <id>papermc</id>
             <url>https://repo.papermc.io/repository/maven-public/</url>
         </repository>
-        <repository>
-            <id>xenondevs</id>
-            <url>https://repo.xenondevs.xyz/releases</url>
-        </repository>
         <repository>
             <id>spigot-repo</id>
             <url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
@@ -58,9 +53,9 @@
         </dependency>
         <!-- Inventory Lib -->
         <dependency>
-            <groupId>de.studiocode.invui</groupId>
-            <artifactId>InvUI</artifactId>
-            <version>0.10.2</version>
+            <groupId>xyz.xenondevs.invui</groupId>
+            <artifactId>invui</artifactId>
+            <version>1.0-SNAPSHOT</version>
         </dependency>
         <!-- AnvilGUI -->
         <dependency>
@@ -86,23 +81,23 @@
         <dependency>
             <groupId>org.mariadb.jdbc</groupId>
             <artifactId>mariadb-java-client</artifactId>
-            <version>3.1.0</version>
+            <version>3.1.2</version>
         </dependency>
         <!-- YAML Reader -->
         <dependency>
             <groupId>com.github.jsixface</groupId>
             <artifactId>yamlconfig</artifactId>
-            <version>1.1.1</version>
+            <version>1.1.2</version>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-core</artifactId>
-            <version>2.14.0-rc1</version>
+            <version>2.14.2</version>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.dataformat</groupId>
             <artifactId>jackson-dataformat-yaml</artifactId>
-            <version>2.14.0-rc1</version>
+            <version>2.14.2</version>
         </dependency>
         <!-- Redis -->
         <dependency>
diff --git a/core/src/main/java/net/artelnatif/nicko/NickoBukkit.java b/core/src/main/java/net/artelnatif/nicko/NickoBukkit.java
index b080349..16554ce 100644
--- a/core/src/main/java/net/artelnatif/nicko/NickoBukkit.java
+++ b/core/src/main/java/net/artelnatif/nicko/NickoBukkit.java
@@ -1,8 +1,8 @@
 package net.artelnatif.nicko;
 
-import de.studiocode.invui.gui.structure.Structure;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.SimpleItem;
+import xyz.xenondevs.invui.gui.structure.Structure;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SimpleItem;
 import net.artelnatif.nicko.command.NickoCommand;
 import net.artelnatif.nicko.config.Configuration;
 import net.artelnatif.nicko.config.ConfigurationManager;
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/AdminGUI.java b/core/src/main/java/net/artelnatif/nicko/gui/AdminGUI.java
index b7ac911..cdfc4be 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/AdminGUI.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/AdminGUI.java
@@ -1,19 +1,17 @@
 package net.artelnatif.nicko.gui;
 
-import de.studiocode.invui.gui.GUI;
-import de.studiocode.invui.gui.builder.GUIBuilder;
-import de.studiocode.invui.gui.builder.guitype.GUIType;
-import de.studiocode.invui.window.impl.single.SimpleWindow;
-import net.artelnatif.nicko.gui.items.common.GoBack;
 import net.artelnatif.nicko.gui.items.admin.ManageCache;
+import net.artelnatif.nicko.gui.items.common.GoBack;
 import org.bukkit.entity.Player;
+import xyz.xenondevs.invui.gui.Gui;
+import xyz.xenondevs.invui.window.Window;
 
 public class AdminGUI {
     private final Player player;
-    private final GUI gui;
+    private final Gui gui;
 
     public AdminGUI(Player player) {
-        this.gui = new GUIBuilder<>(GUIType.NORMAL)
+        this.gui = Gui.normal()
                 .setStructure(
                         "# # # # # # # # #",
                         "# % % X X S % % #",
@@ -25,11 +23,11 @@ public class AdminGUI {
         this.player = player;
     }
 
-    public GUI getGUI() {
+    public Gui getGUI() {
         return gui;
     }
 
     public void open() {
-        new SimpleWindow(player, "Nicko", gui).show();
+        Window.single().setGui(gui).setTitle("Nicko").open(player);
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/AppearanceManagerGUI.java b/core/src/main/java/net/artelnatif/nicko/gui/AppearanceManagerGUI.java
index 98837a7..bba1055 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/AppearanceManagerGUI.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/AppearanceManagerGUI.java
@@ -1,21 +1,19 @@
 package net.artelnatif.nicko.gui;
 
-import de.studiocode.invui.gui.GUI;
-import de.studiocode.invui.gui.builder.GUIBuilder;
-import de.studiocode.invui.gui.builder.guitype.GUIType;
-import de.studiocode.invui.window.impl.single.SimpleWindow;
 import net.artelnatif.nicko.gui.items.common.GoBack;
-import net.artelnatif.nicko.gui.items.skin.ChangeSkin;
 import net.artelnatif.nicko.gui.items.skin.ChangeName;
 import net.artelnatif.nicko.gui.items.skin.ChangeNameAndSkin;
+import net.artelnatif.nicko.gui.items.skin.ChangeSkin;
 import org.bukkit.entity.Player;
+import xyz.xenondevs.invui.gui.Gui;
+import xyz.xenondevs.invui.window.Window;
 
 public class AppearanceManagerGUI {
     private final Player player;
-    private final GUI gui;
+    private final Gui gui;
 
     public AppearanceManagerGUI(Player player) {
-        this.gui = new GUIBuilder<>(GUIType.NORMAL)
+        this.gui = Gui.normal()
                 .setStructure(
                         "# # # # # # # # #",
                         "# % % % % % % % #",
@@ -32,6 +30,6 @@ public class AppearanceManagerGUI {
     }
 
     public void open() {
-        new SimpleWindow(player, "Nicko", gui).show();
+        Window.single().setGui(gui).setTitle("Nicko").open(player);
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/MainGUI.java b/core/src/main/java/net/artelnatif/nicko/gui/MainGUI.java
index d7d2324..8e66292 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/MainGUI.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/MainGUI.java
@@ -1,18 +1,16 @@
 package net.artelnatif.nicko.gui;
 
-import de.studiocode.invui.gui.GUI;
-import de.studiocode.invui.gui.builder.GUIBuilder;
-import de.studiocode.invui.gui.builder.guitype.GUIType;
-import de.studiocode.invui.window.impl.single.SimpleWindow;
 import net.artelnatif.nicko.gui.items.main.AdminSubGUI;
 import net.artelnatif.nicko.gui.items.main.AppearanceManagerSubGUI;
 import net.artelnatif.nicko.gui.items.main.ResetAppearance;
 import net.artelnatif.nicko.gui.items.main.SettingsSubGUI;
 import org.bukkit.entity.Player;
+import xyz.xenondevs.invui.gui.Gui;
+import xyz.xenondevs.invui.window.Window;
 
 public class MainGUI {
     private final Player player;
-    private final GUI gui;
+    private final Gui gui;
 
     public MainGUI(Player player) {
         final String[] dynamicStructure = new String[]{
@@ -26,7 +24,7 @@ public class MainGUI {
             dynamicStructure[3] = dynamicStructure[3].replace("A", "#");
         }
 
-        this.gui = new GUIBuilder<>(GUIType.NORMAL)
+        this.gui = Gui.normal()
                 .setStructure(dynamicStructure)
                 .addIngredient('R', new ResetAppearance())
                 .addIngredient('S', new AppearanceManagerSubGUI())
@@ -36,11 +34,11 @@ public class MainGUI {
         this.player = player;
     }
 
-    public GUI getGUI() {
+    public Gui getGUI() {
         return gui;
     }
 
     public void open() {
-        new SimpleWindow(player, "Nicko", gui).show();
+        Window.single().setGui(gui).setTitle("Nicko").open(player);
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/SettingsGUI.java b/core/src/main/java/net/artelnatif/nicko/gui/SettingsGUI.java
index 98bbdda..6e302bf 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/SettingsGUI.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/SettingsGUI.java
@@ -1,18 +1,16 @@
 package net.artelnatif.nicko.gui;
 
-import de.studiocode.invui.gui.GUI;
-import de.studiocode.invui.gui.builder.GUIBuilder;
-import de.studiocode.invui.gui.builder.guitype.GUIType;
-import de.studiocode.invui.window.impl.single.SimpleWindow;
 import net.artelnatif.nicko.gui.items.common.GoBack;
 import net.artelnatif.nicko.gui.items.settings.BungeeCordCycling;
 import net.artelnatif.nicko.gui.items.settings.LanguageCycling;
 import net.artelnatif.nicko.gui.items.settings.OptionUnavailable;
 import org.bukkit.entity.Player;
+import xyz.xenondevs.invui.gui.Gui;
+import xyz.xenondevs.invui.window.Window;
 
 public class SettingsGUI {
     private final Player player;
-    private final GUI gui;
+    private final Gui gui;
 
     public SettingsGUI(Player player) {
         final String[] dynamicStructure = new String[]{
@@ -24,7 +22,7 @@ public class SettingsGUI {
         // TODO: 3/6/23 Replace when Redis is not enabled
         dynamicStructure[1] = dynamicStructure[1].replace("T", "U");
 
-        this.gui = new GUIBuilder<>(GUIType.NORMAL)
+        this.gui = Gui.normal()
                 .setStructure(dynamicStructure)
                 .addIngredient('B', new GoBack(new MainGUI(player).getGUI()))
                 .addIngredient('L', new LanguageCycling().get(player))
@@ -35,6 +33,6 @@ public class SettingsGUI {
     }
 
     public void open() {
-        new SimpleWindow(player, "Nicko", gui).show();
+        Window.single().setGui(gui).setTitle("Nicko").open(player);
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/admin/CacheManagementGUI.java b/core/src/main/java/net/artelnatif/nicko/gui/admin/CacheManagementGUI.java
index ac23ff1..549d230 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/admin/CacheManagementGUI.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/admin/CacheManagementGUI.java
@@ -1,22 +1,20 @@
 package net.artelnatif.nicko.gui.admin;
 
-import de.studiocode.invui.gui.GUI;
-import de.studiocode.invui.gui.builder.GUIBuilder;
-import de.studiocode.invui.gui.builder.guitype.GUIType;
-import de.studiocode.invui.window.impl.single.SimpleWindow;
 import net.artelnatif.nicko.gui.AdminGUI;
 import net.artelnatif.nicko.gui.items.admin.cache.CacheDetailed;
 import net.artelnatif.nicko.gui.items.admin.cache.CacheInvalidate;
 import net.artelnatif.nicko.gui.items.admin.cache.CacheOverview;
 import net.artelnatif.nicko.gui.items.common.GoBack;
 import org.bukkit.entity.Player;
+import xyz.xenondevs.invui.gui.Gui;
+import xyz.xenondevs.invui.window.Window;
 
 public class CacheManagementGUI {
     private final Player player;
-    private final GUI gui;
+    private final Gui gui;
 
     public CacheManagementGUI(Player player) {
-        this.gui = new GUIBuilder<>(GUIType.NORMAL)
+        this.gui = Gui.normal()
                 .setStructure("B # S A D")
                 .addIngredient('B', new GoBack(new AdminGUI(player).getGUI()))
                 .addIngredient('S', new CacheOverview())
@@ -26,11 +24,11 @@ public class CacheManagementGUI {
         this.player = player;
     }
 
-    public GUI getGUI() {
+    public Gui getGUI() {
         return gui;
     }
 
     public void open() {
-        new SimpleWindow(player, "Nicko", gui).show();
+        Window.single().setGui(gui).setTitle("Nicko").open(player);
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/admin/cache/CacheDetailledGUI.java b/core/src/main/java/net/artelnatif/nicko/gui/admin/cache/CacheDetailledGUI.java
index 14723a7..f233a3a 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/admin/cache/CacheDetailledGUI.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/admin/cache/CacheDetailledGUI.java
@@ -1,11 +1,9 @@
 package net.artelnatif.nicko.gui.admin.cache;
 
-import de.studiocode.invui.gui.GUI;
-import de.studiocode.invui.gui.builder.GUIBuilder;
-import de.studiocode.invui.gui.builder.guitype.GUIType;
-import de.studiocode.invui.gui.structure.Markers;
-import de.studiocode.invui.item.Item;
-import de.studiocode.invui.window.impl.single.SimpleWindow;
+import xyz.xenondevs.invui.gui.Gui;
+import xyz.xenondevs.invui.gui.ScrollGui;
+import xyz.xenondevs.invui.gui.structure.Markers;
+import xyz.xenondevs.invui.item.Item;
 import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.gui.items.admin.cache.SkinPlaceholder;
 import net.artelnatif.nicko.gui.admin.CacheManagementGUI;
@@ -14,6 +12,7 @@ import net.artelnatif.nicko.gui.items.common.ScrollDown;
 import net.artelnatif.nicko.gui.items.common.ScrollUp;
 import net.artelnatif.nicko.mojang.MojangSkin;
 import org.bukkit.entity.Player;
+import xyz.xenondevs.invui.window.Window;
 
 import java.util.List;
 import java.util.Map;
@@ -23,7 +22,7 @@ import java.util.stream.Collectors;
 
 public class CacheDetailledGUI {
     private final Player player;
-    private final GUI gui;
+    private final Gui gui;
 
     public CacheDetailledGUI(Player player) {
         final ConcurrentMap<String, Optional<MojangSkin>> skins = NickoBukkit.getInstance().getMojangAPI().getCache().asMap();
@@ -36,29 +35,24 @@ public class CacheDetailledGUI {
                 .map(SkinPlaceholder::new)
                 .collect(Collectors.toList());
 
-        this.gui = new GUIBuilder<>(GUIType.SCROLL_ITEMS)
-                .setStructure(
-                        "% # # # # # # # %",
-                        "# x x x x x x U #",
-                        "# x x x x x x # #",
-                        "# x x x x x x # #",
-                        "# x x x x x x D #",
-                        "B # # # # # # # %"
-                )
-                .addIngredient('x', Markers.ITEM_LIST_SLOT_HORIZONTAL)
-                .addIngredient('U', new ScrollUp())
-                .addIngredient('D', new ScrollDown())
-                .addIngredient('B', new GoBack(new CacheManagementGUI(player).getGUI()))
-                .setItems(items)
-                .build();
+        gui = ScrollGui.items(guiItemBuilder -> {
+            guiItemBuilder.setStructure("% # # # # # # # %",
+                    "# x x x x x x U #",
+                    "# x x x x x x # #",
+                    "# x x x x x x D #",
+                    "# x x x x x x # #",
+                    "B # # # # # # # %");
+            guiItemBuilder.addIngredient('x', Markers.CONTENT_LIST_SLOT_HORIZONTAL);
+            guiItemBuilder.addIngredient('U', new ScrollUp());
+            guiItemBuilder.addIngredient('D', new ScrollDown());
+            guiItemBuilder.addIngredient('B', new GoBack(new CacheManagementGUI(player).getGUI()));
+            guiItemBuilder.setContent(items);
+        });
+
         this.player = player;
     }
 
-    public GUI getGUI() {
-        return gui;
-    }
-
     public void open() {
-        new SimpleWindow(player, "Nicko", gui).show();
+        Window.single().setGui(gui).setTitle("Nicko").open(player);
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/admin/ManageCache.java b/core/src/main/java/net/artelnatif/nicko/gui/items/admin/ManageCache.java
index d7c7562..ed814ec 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/admin/ManageCache.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/admin/ManageCache.java
@@ -1,8 +1,8 @@
 package net.artelnatif.nicko.gui.items.admin;
 
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.builder.SkullBuilder;
-import de.studiocode.invui.item.impl.AsyncItem;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.builder.SkullBuilder;
+import xyz.xenondevs.invui.item.impl.AsyncItem;
 import net.artelnatif.nicko.gui.admin.CacheManagementGUI;
 import org.bukkit.Material;
 import org.bukkit.entity.Player;
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheDetailed.java b/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheDetailed.java
index 2b81e3a..48e1eca 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheDetailed.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheDetailed.java
@@ -1,29 +1,26 @@
 package net.artelnatif.nicko.gui.items.admin.cache;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import net.artelnatif.nicko.gui.admin.cache.CacheDetailledGUI;
 import org.bukkit.Material;
-import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
 
-public class CacheDetailed extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.PAPER);
-        builder.setDisplayName("§6Invalidate specific skin...");
-        builder.addLoreLines("§7Select a specific skin to invalidate.");
-        return builder;
-    }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        if (clickType.isLeftClick() || clickType.isRightClick()) {
-            event.getView().close();
-            new CacheDetailledGUI(player).open();
-        }
+public class CacheDetailed extends SuppliedItem {
+    public CacheDetailed() {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.PAPER);
+            builder.setDisplayName("§6Invalidate specific skin...");
+            builder.addLoreLines("§7Select a specific skin to invalidate.");
+            return builder;
+        }, (click) -> {
+            final ClickType clickType = click.getClickType();
+            if (clickType.isLeftClick() || clickType.isRightClick()) {
+                click.getEvent().getView().close();
+                new CacheDetailledGUI(click.getPlayer()).open();
+                return true;
+            }
+            return false;
+        });
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheInvalidate.java b/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheInvalidate.java
index b448484..f454e92 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheInvalidate.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheInvalidate.java
@@ -1,37 +1,36 @@
 package net.artelnatif.nicko.gui.items.admin.cache;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.i18n.I18N;
 import net.artelnatif.nicko.i18n.I18NDict;
 import org.bukkit.Material;
 import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
 
-public class CacheInvalidate extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.TNT);
-        builder.setDisplayName("§fInvalidate §6skin cache");
-        builder.addLoreLines(
-                "§c§oNOT RECOMMENDED",
-                "§7Invalidates every skin entry present in the cache.",
-                "§7Does not reset player disguises.",
-                "§7Could be useful if a skin has been updated",
-                "§7recently and the cache is now outdated.");
-        return builder;
-    }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        if (clickType.isLeftClick() || clickType.isRightClick()) {
-            event.getView().close();
-            player.sendMessage(I18N.translate(player, I18NDict.Event.Admin.CACHE_CLEAN));
-            NickoBukkit.getInstance().getMojangAPI().getCache().invalidateAll();
-        }
+public class CacheInvalidate extends SuppliedItem {
+    public CacheInvalidate() {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.TNT);
+            builder.setDisplayName("§fInvalidate §6skin cache");
+            builder.addLoreLines(
+                    "§c§oNOT RECOMMENDED",
+                    "§7Invalidates every skin entry present in the cache.",
+                    "§7Does not reset player disguises.",
+                    "§7Could be useful if a skin has been updated",
+                    "§7recently and the cache is now outdated.");
+            return builder;
+        }, (click) -> {
+            final ClickType clickType = click.getClickType();
+            if (clickType.isLeftClick() || clickType.isRightClick()) {
+                final Player player = click.getPlayer();
+                click.getEvent().getView().close();
+                player.sendMessage(I18N.translate(player, I18NDict.Event.Admin.CACHE_CLEAN));
+                NickoBukkit.getInstance().getMojangAPI().getCache().invalidateAll();
+                return true;
+            }
+            return false;
+        });
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheOverview.java b/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheOverview.java
index e09b64d..b916b95 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheOverview.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/CacheOverview.java
@@ -2,38 +2,27 @@ package net.artelnatif.nicko.gui.items.admin.cache;
 
 import com.google.common.cache.CacheStats;
 import com.google.common.cache.LoadingCache;
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.mojang.MojangSkin;
 import org.bukkit.Material;
-import org.bukkit.entity.Player;
-import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
 
 import java.util.Optional;
 
-public class CacheOverview extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.OAK_SIGN);
-        final LoadingCache<String, Optional<MojangSkin>> cache = NickoBukkit.getInstance().getMojangAPI().getCache();
-        final CacheStats stats = cache.stats();
-        builder.setDisplayName("§6Skin cache §foverview:");
-        builder.addLoreLines(
-                "Request Count: §2" + stats.requestCount(),
-                "Skin Cached: §2" + Math.round(cache.size()),
-                "§7§oCache is cleared every 24 hours.",
-                "§7§o(Click to refresh)");
-        return builder;
-    }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        if (clickType.isLeftClick() || clickType.isRightClick()) {
-            notifyWindows();
-        }
+public class CacheOverview extends SuppliedItem {
+    public CacheOverview() {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.OAK_SIGN);
+            final LoadingCache<String, Optional<MojangSkin>> cache = NickoBukkit.getInstance().getMojangAPI().getCache();
+            final CacheStats stats = cache.stats();
+            builder.setDisplayName("§6Skin cache §foverview:");
+            builder.addLoreLines(
+                    "Request Count: §2" + stats.requestCount(),
+                    "Skin Cached: §2" + Math.round(cache.size()),
+                    "§7§oCache is cleared every 24 hours.",
+                    "§7§o(Click to refresh)");
+            return builder;
+        }, (event) -> true);
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/SkinPlaceholder.java b/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/SkinPlaceholder.java
index ae227a1..2984c53 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/SkinPlaceholder.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/admin/cache/SkinPlaceholder.java
@@ -1,9 +1,9 @@
 package net.artelnatif.nicko.gui.items.admin.cache;
 
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.builder.SkullBuilder;
-import de.studiocode.invui.item.impl.AsyncItem;
 import org.bukkit.Material;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.builder.SkullBuilder;
+import xyz.xenondevs.invui.item.impl.AsyncItem;
 
 import java.util.UUID;
 
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/common/GoBack.java b/core/src/main/java/net/artelnatif/nicko/gui/items/common/GoBack.java
index 73609d2..9b966ce 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/common/GoBack.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/common/GoBack.java
@@ -1,34 +1,22 @@
 package net.artelnatif.nicko.gui.items.common;
 
-import de.studiocode.invui.gui.GUI;
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
-import de.studiocode.invui.window.impl.single.SimpleWindow;
 import org.bukkit.Material;
-import org.bukkit.entity.Player;
-import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.gui.Gui;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
+import xyz.xenondevs.invui.window.Window;
 
-public class GoBack extends BaseItem {
-    private final GUI gui;
-
-    public GoBack(GUI gui) {
-        this.gui = gui;
-    }
-
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.ARROW);
-        builder.setDisplayName("Go back");
-        builder.addLoreLines("§7Return to the previous window.");
-        return builder;
-    }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        event.getView().close();
-        new SimpleWindow(player, "Nicko", gui).show();
+public class GoBack extends SuppliedItem {
+    public GoBack(Gui gui) {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.ARROW);
+            builder.setDisplayName("Go back");
+            builder.addLoreLines("§7Return to the previous window.");
+            return builder;
+        }, click -> {
+            click.getEvent().getView().close();
+            Window.single().setGui(gui).setTitle("Nicko").open(click.getPlayer());
+            return true;
+        });
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/common/ScrollDown.java b/core/src/main/java/net/artelnatif/nicko/gui/items/common/ScrollDown.java
index 3050dda..8cc8536 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/common/ScrollDown.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/common/ScrollDown.java
@@ -1,10 +1,10 @@
 package net.artelnatif.nicko.gui.items.common;
 
-import de.studiocode.invui.gui.impl.ScrollGUI;
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.controlitem.ScrollItem;
 import org.bukkit.Material;
+import xyz.xenondevs.invui.gui.ScrollGui;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.controlitem.ScrollItem;
 
 public class ScrollDown extends ScrollItem {
 
@@ -13,7 +13,7 @@ public class ScrollDown extends ScrollItem {
     }
 
     @Override
-    public ItemProvider getItemProvider(ScrollGUI gui) {
+    public ItemProvider getItemProvider(ScrollGui gui) {
         ItemBuilder builder = new ItemBuilder(Material.GREEN_STAINED_GLASS_PANE);
         builder.setDisplayName("§7Scroll down");
         if (!gui.canScroll(1))
@@ -21,6 +21,5 @@ public class ScrollDown extends ScrollItem {
 
         return builder;
     }
-
 }
 
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/common/ScrollUp.java b/core/src/main/java/net/artelnatif/nicko/gui/items/common/ScrollUp.java
index 0be6e71..cd30663 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/common/ScrollUp.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/common/ScrollUp.java
@@ -1,10 +1,10 @@
 package net.artelnatif.nicko.gui.items.common;
 
-import de.studiocode.invui.gui.impl.ScrollGUI;
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.controlitem.ScrollItem;
 import org.bukkit.Material;
+import xyz.xenondevs.invui.gui.ScrollGui;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.controlitem.ScrollItem;
 
 public class ScrollUp extends ScrollItem {
 
@@ -13,7 +13,7 @@ public class ScrollUp extends ScrollItem {
     }
 
     @Override
-    public ItemProvider getItemProvider(ScrollGUI gui) {
+    public ItemProvider getItemProvider(ScrollGui gui) {
         ItemBuilder builder = new ItemBuilder(Material.RED_STAINED_GLASS_PANE);
         builder.setDisplayName("§7Scroll up");
         if (!gui.canScroll(-1))
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/main/AdminSubGUI.java b/core/src/main/java/net/artelnatif/nicko/gui/items/main/AdminSubGUI.java
index b2e4d47..0ad8982 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/main/AdminSubGUI.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/main/AdminSubGUI.java
@@ -1,33 +1,30 @@
 package net.artelnatif.nicko.gui.items.main;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import net.artelnatif.nicko.gui.AdminGUI;
 import org.bukkit.Material;
 import org.bukkit.enchantments.Enchantment;
-import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
 import org.bukkit.inventory.ItemFlag;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
 
-public class AdminSubGUI extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.COMMAND_BLOCK);
-        builder.addEnchantment(Enchantment.DAMAGE_ALL, 1, false);
-        builder.addItemFlags(ItemFlag.HIDE_ENCHANTS);
-        builder.setDisplayName("§cAdministration panel...");
-        builder.addLoreLines("§7Access the administration panel.");
-        return builder;
-    }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        if (clickType.isLeftClick() || clickType.isRightClick()) {
-            event.getView().close();
-            new AdminGUI(player).open();
-        }
+public class AdminSubGUI extends SuppliedItem {
+    public AdminSubGUI() {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.COMMAND_BLOCK);
+            builder.addEnchantment(Enchantment.DAMAGE_ALL, 1, false);
+            builder.addItemFlags(ItemFlag.HIDE_ENCHANTS);
+            builder.setDisplayName("§cAdministration panel...");
+            builder.addLoreLines("§7Access the administration panel.");
+            return builder;
+        }, click -> {
+            final ClickType clickType = click.getClickType();
+            if (clickType.isLeftClick() || clickType.isRightClick()) {
+                click.getEvent().getView().close();
+                new AdminGUI(click.getPlayer()).open();
+                return true;
+            }
+            return false;
+        });
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/main/AppearanceManagerSubGUI.java b/core/src/main/java/net/artelnatif/nicko/gui/items/main/AppearanceManagerSubGUI.java
index 68091f5..6529667 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/main/AppearanceManagerSubGUI.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/main/AppearanceManagerSubGUI.java
@@ -1,29 +1,26 @@
 package net.artelnatif.nicko.gui.items.main;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import net.artelnatif.nicko.gui.AppearanceManagerGUI;
 import org.bukkit.Material;
-import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
 
-public class AppearanceManagerSubGUI extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.ENDER_EYE);
-        builder.setDisplayName("§fManage §6appearance§f...");
-        builder.addLoreLines("§7Access the appearance manager.");
-        return builder;
-    }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        if (clickType.isLeftClick() || clickType.isRightClick()) {
-            event.getView().close();
-            new AppearanceManagerGUI(player).open();
-        }
+public class AppearanceManagerSubGUI extends SuppliedItem {
+    public AppearanceManagerSubGUI() {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.ENDER_EYE);
+            builder.setDisplayName("§fManage §6appearance§f...");
+            builder.addLoreLines("§7Access the appearance manager.");
+            return builder;
+        }, (click) -> {
+            final ClickType clickType = click.getClickType();
+            if (clickType.isLeftClick() || clickType.isRightClick()) {
+                click.getEvent().getView().close();
+                new AppearanceManagerGUI(click.getPlayer()).open();
+                return true;
+            }
+            return false;
+        });
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/main/ExitGUI.java b/core/src/main/java/net/artelnatif/nicko/gui/items/main/ExitGUI.java
index ac313fb..3992b2a 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/main/ExitGUI.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/main/ExitGUI.java
@@ -1,24 +1,17 @@
 package net.artelnatif.nicko.gui.items.main;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import org.bukkit.Material;
-import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SimpleItem;
 
-public class ExitGUI extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        return new ItemBuilder(Material.OAK_DOOR).setDisplayName("§fExit");
-    }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        if (clickType.isLeftClick() || clickType.isRightClick()) {
-            event.getView().close();
-        }
+public class ExitGUI extends SimpleItem {
+    public ExitGUI() {
+        super(new ItemBuilder(Material.OAK_DOOR).setDisplayName("§fExit"), click -> {
+            final ClickType clickType = click.getClickType();
+            if (clickType.isLeftClick() || clickType.isRightClick()) {
+                click.getEvent().getView().close();
+            }
+        });
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/main/ResetAppearance.java b/core/src/main/java/net/artelnatif/nicko/gui/items/main/ResetAppearance.java
index 5be5493..48fa0d6 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/main/ResetAppearance.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/main/ResetAppearance.java
@@ -1,42 +1,42 @@
 package net.artelnatif.nicko.gui.items.main;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import net.artelnatif.nicko.appearance.AppearanceManager;
 import net.artelnatif.nicko.i18n.I18N;
 import net.artelnatif.nicko.i18n.I18NDict;
 import org.bukkit.Material;
 import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
 
-public class ResetAppearance extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.TNT);
-        builder.setDisplayName("§fReset");
-        builder.addLoreLines("§7Get rid of your disguise.");
-        return builder;
-    }
+public class ResetAppearance extends SuppliedItem {
+    public ResetAppearance() {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.TNT);
+            builder.setDisplayName("§fReset");
+            builder.addLoreLines("§7Get rid of your disguise.");
+            return builder;
+        }, (event) -> {
+            final Player player = event.getPlayer();
+            final ClickType clickType = event.getClickType();
+            if (clickType.isLeftClick() || clickType.isRightClick()) {
+                final AppearanceManager appearanceManager = AppearanceManager.get(player);
 
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        if (clickType.isLeftClick() || clickType.isRightClick()) {
-            final AppearanceManager appearanceManager = AppearanceManager.get(player);
+                if (!appearanceManager.hasData()) {
+                    player.sendMessage(I18N.translate(player, I18NDict.Event.Undisguise.NONE));
+                    event.getEvent().getView().close();
+                    return true;
+                }
 
-            if (!appearanceManager.hasData()) {
-                player.sendMessage(I18N.translate(player, I18NDict.Event.Undisguise.NONE));
-                event.getView().close();
-                return;
+                if (!appearanceManager.reset().isError()) {
+                    player.sendMessage(I18N.translate(player, I18NDict.Event.Undisguise.SUCCESS));
+                    return true;
+                } else {
+                    player.sendMessage(I18N.translate(player, I18NDict.Event.Undisguise.FAIL));
+                    return false;
+                }
             }
-
-            if (!appearanceManager.reset().isError()) {
-                player.sendMessage(I18N.translate(player, I18NDict.Event.Undisguise.SUCCESS));
-            } else {
-                player.sendMessage(I18N.translate(player, I18NDict.Event.Undisguise.FAIL));
-            }
-        }
+            return false;
+        });
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/main/SettingsSubGUI.java b/core/src/main/java/net/artelnatif/nicko/gui/items/main/SettingsSubGUI.java
index f8a2b33..52f9c28 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/main/SettingsSubGUI.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/main/SettingsSubGUI.java
@@ -1,29 +1,26 @@
 package net.artelnatif.nicko.gui.items.main;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import net.artelnatif.nicko.gui.SettingsGUI;
 import org.bukkit.Material;
-import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
 
-public class SettingsSubGUI extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.COMPARATOR);
-        builder.setDisplayName("§fSettings...");
-        builder.addLoreLines("§7Adjust your preferences.");
-        return builder;
-    }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        if (clickType.isLeftClick() || clickType.isRightClick()) {
-            event.getView().close();
-            new SettingsGUI(player).open();
-        }
+public class SettingsSubGUI extends SuppliedItem {
+    public SettingsSubGUI() {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.COMPARATOR);
+            builder.setDisplayName("§fSettings...");
+            builder.addLoreLines("§7Adjust your preferences.");
+            return builder;
+        }, click -> {
+            final ClickType clickType = click.getClickType();
+            if (clickType.isLeftClick() || clickType.isRightClick()) {
+                click.getEvent().getView().close();
+                new SettingsGUI(click.getPlayer()).open();
+                return true;
+            }
+            return false;
+        });
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/settings/BungeeCordCycling.java b/core/src/main/java/net/artelnatif/nicko/gui/items/settings/BungeeCordCycling.java
index 02068d4..61a389b 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/settings/BungeeCordCycling.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/settings/BungeeCordCycling.java
@@ -1,15 +1,15 @@
 package net.artelnatif.nicko.gui.items.settings;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
-import de.studiocode.invui.item.impl.CycleItem;
-import de.studiocode.invui.item.impl.SimpleItem;
 import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.disguise.NickoProfile;
 import org.bukkit.Material;
 import org.bukkit.Sound;
 import org.bukkit.entity.Player;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.AbstractItem;
+import xyz.xenondevs.invui.item.impl.CycleItem;
+import xyz.xenondevs.invui.item.impl.SimpleItem;
 
 import java.util.Optional;
 
@@ -19,7 +19,7 @@ public class BungeeCordCycling {
             getItemProviderForValue(false)
     };
 
-    public BaseItem get(Player player) {
+    public AbstractItem get(Player player) {
         final Optional<NickoProfile> profile = NickoBukkit.getInstance().getDataStore().getData(player.getUniqueId());
         if (profile.isPresent()) {
             final NickoProfile nickoProfile = profile.get();
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/settings/LanguageCycling.java b/core/src/main/java/net/artelnatif/nicko/gui/items/settings/LanguageCycling.java
index b34ad7b..abe1399 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/settings/LanguageCycling.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/settings/LanguageCycling.java
@@ -1,23 +1,26 @@
 package net.artelnatif.nicko.gui.items.settings;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
-import de.studiocode.invui.item.impl.CycleItem;
-import de.studiocode.invui.item.impl.SimpleItem;
 import net.artelnatif.nicko.NickoBukkit;
 import net.artelnatif.nicko.disguise.NickoProfile;
 import net.artelnatif.nicko.i18n.Locale;
 import org.bukkit.Material;
 import org.bukkit.Sound;
 import org.bukkit.entity.Player;
+import xyz.xenondevs.invui.item.ItemProvider;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.AbstractItem;
+import xyz.xenondevs.invui.item.impl.CycleItem;
+import xyz.xenondevs.invui.item.impl.SimpleItem;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
 
 public class LanguageCycling {
     private final ItemProvider[] providers = getItems();
 
-    public BaseItem get(Player player) {
+    public AbstractItem get(Player player) {
         final Optional<NickoProfile> profile = NickoBukkit.getInstance().getDataStore().getData(player.getUniqueId());
         if (profile.isPresent()) {
             final NickoProfile nickoProfile = profile.get();
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/settings/OptionUnavailable.java b/core/src/main/java/net/artelnatif/nicko/gui/items/settings/OptionUnavailable.java
index 78ec0ac..aaa9417 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/settings/OptionUnavailable.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/settings/OptionUnavailable.java
@@ -1,24 +1,17 @@
 package net.artelnatif.nicko.gui.items.settings;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import org.bukkit.Material;
-import org.bukkit.entity.Player;
-import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
 
-public class OptionUnavailable extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.RED_TERRACOTTA);
-        builder.setDisplayName("§cOption unavailable :(");
-        builder.addLoreLines("§7This option is disabled due to the",
-                "§7feature it controls being disabled.");
-        return builder;
+public class OptionUnavailable extends SuppliedItem {
+    public OptionUnavailable() {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.RED_TERRACOTTA);
+            builder.setDisplayName("§cOption unavailable :(");
+            builder.addLoreLines("§7This option is disabled due to the",
+                    "§7feature it controls being disabled.");
+            return builder;
+        }, click -> true);
     }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent inventoryClickEvent) { }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeName.java b/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeName.java
index 7d4cd6b..a5b7a02 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeName.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeName.java
@@ -1,30 +1,26 @@
 package net.artelnatif.nicko.gui.items.skin;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import net.artelnatif.nicko.anvil.AnvilManager;
 import org.bukkit.Material;
-import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
 
-public class ChangeName extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.NAME_TAG);
-        builder.setDisplayName("§6Name §fchange");
-        builder.addLoreLines("§7Only change your name.");
-        return builder;
-    }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        if (clickType.isLeftClick() || clickType.isRightClick()) {
-            event.getView().close();
-            final AnvilManager manager = new AnvilManager(player);
-            manager.openNameAnvil();
-        }
+public class ChangeName extends SuppliedItem {
+    public ChangeName() {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.NAME_TAG);
+            builder.setDisplayName("§6Name §fchange");
+            builder.addLoreLines("§7Only change your name.");
+            return builder;
+        }, click -> {
+            final ClickType clickType = click.getClickType();
+            if (clickType.isLeftClick() || clickType.isRightClick()) {
+                click.getEvent().getView().close();
+                final AnvilManager manager = new AnvilManager(click.getPlayer());
+                manager.openNameAnvil();
+            }
+            return true;
+        });
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeNameAndSkin.java b/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeNameAndSkin.java
index d404ec3..cd8cbc2 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeNameAndSkin.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeNameAndSkin.java
@@ -1,30 +1,26 @@
 package net.artelnatif.nicko.gui.items.skin;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import net.artelnatif.nicko.anvil.AnvilManager;
 import org.bukkit.Material;
-import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
 
-public class ChangeNameAndSkin extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.ENDER_PEARL);
-        builder.setDisplayName("§6Skin §fand §6name §fchange");
-        builder.addLoreLines("§7Change both your skin and name.");
-        return builder;
-    }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        if (clickType.isLeftClick() || clickType.isRightClick()) {
-            event.getView().close();
-            final AnvilManager manager = new AnvilManager(player);
-            manager.openNameThenSkinAnvil();
-        }
+public class ChangeNameAndSkin extends SuppliedItem {
+    public ChangeNameAndSkin() {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.ENDER_PEARL);
+            builder.setDisplayName("§6Skin §fand §6name §fchange");
+            builder.addLoreLines("§7Change both your skin and name.");
+            return builder;
+        }, click -> {
+            final ClickType clickType = click.getClickType();
+            if (clickType.isLeftClick() || clickType.isRightClick()) {
+                click.getEvent().getView().close();
+                final AnvilManager manager = new AnvilManager(click.getPlayer());
+                manager.openNameThenSkinAnvil();
+            }
+            return true;
+        });
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeSkin.java b/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeSkin.java
index e94bb70..746fe2c 100644
--- a/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeSkin.java
+++ b/core/src/main/java/net/artelnatif/nicko/gui/items/skin/ChangeSkin.java
@@ -1,30 +1,26 @@
 package net.artelnatif.nicko.gui.items.skin;
 
-import de.studiocode.invui.item.ItemProvider;
-import de.studiocode.invui.item.builder.ItemBuilder;
-import de.studiocode.invui.item.impl.BaseItem;
 import net.artelnatif.nicko.anvil.AnvilManager;
 import org.bukkit.Material;
-import org.bukkit.entity.Player;
 import org.bukkit.event.inventory.ClickType;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.jetbrains.annotations.NotNull;
+import xyz.xenondevs.invui.item.builder.ItemBuilder;
+import xyz.xenondevs.invui.item.impl.SuppliedItem;
 
-public class ChangeSkin extends BaseItem {
-    @Override
-    public ItemProvider getItemProvider() {
-        final ItemBuilder builder = new ItemBuilder(Material.PAINTING);
-        builder.setDisplayName("§6Skin §fchange");
-        builder.addLoreLines("§7Only change your skin.");
-        return builder;
-    }
-
-    @Override
-    public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
-        if(clickType.isLeftClick() || clickType.isRightClick()) {
-            event.getView().close();
-            final AnvilManager manager = new AnvilManager(player);
-            manager.openSkinAnvil();
-        }
+public class ChangeSkin extends SuppliedItem {
+    public ChangeSkin() {
+        super(() -> {
+            final ItemBuilder builder = new ItemBuilder(Material.ENDER_PEARL);
+            builder.setDisplayName("§6Skin §fchange");
+            builder.addLoreLines("§7Only change your skin.");
+            return builder;
+        }, click -> {
+            final ClickType clickType = click.getClickType();
+            if (clickType.isLeftClick() || clickType.isRightClick()) {
+                click.getEvent().getView().close();
+                final AnvilManager manager = new AnvilManager(click.getPlayer());
+                manager.openSkinAnvil();
+            }
+            return true;
+        });
     }
 }
diff --git a/core/src/main/java/net/artelnatif/nicko/i18n/LocaleFileManager.java b/core/src/main/java/net/artelnatif/nicko/i18n/LocaleFileManager.java
index d77480d..90d56de 100644
--- a/core/src/main/java/net/artelnatif/nicko/i18n/LocaleFileManager.java
+++ b/core/src/main/java/net/artelnatif/nicko/i18n/LocaleFileManager.java
@@ -1,7 +1,7 @@
 package net.artelnatif.nicko.i18n;
 
 import com.github.jsixface.YamlConfig;
-import de.studiocode.invui.util.IOUtils;
+import xyz.xenondevs.invui.util.IOUtils;
 import net.artelnatif.nicko.NickoBukkit;
 
 import java.io.*;
diff --git a/core/src/main/java/net/artelnatif/nicko/impl/InternalsProvider.java b/core/src/main/java/net/artelnatif/nicko/impl/InternalsProvider.java
index 627c307..d0ebd0d 100644
--- a/core/src/main/java/net/artelnatif/nicko/impl/InternalsProvider.java
+++ b/core/src/main/java/net/artelnatif/nicko/impl/InternalsProvider.java
@@ -3,8 +3,10 @@ package net.artelnatif.nicko.impl;
 import org.bukkit.Bukkit;
 
 import java.lang.reflect.InvocationTargetException;
+import java.util.logging.Logger;
 
 public class InternalsProvider {
+    private static final Logger logger = Logger.getLogger("Internals");
     private static Internals internals;
 
     static {
@@ -14,6 +16,7 @@ public class InternalsProvider {
             final String fullClassName = packageName + "." + bukkitVersion;
             final Class<?> clazz = Class.forName(fullClassName);
             internals = (Internals) clazz.getConstructors()[0].newInstance();
+            logger.info("Loaded support for " + bukkitVersion);
         } catch (InvocationTargetException | ClassNotFoundException | InstantiationException | IllegalAccessException |
                  ClassCastException exception) {
             internals = null;
diff --git a/pom.xml b/pom.xml
index d62ed02..e9f92dc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,7 +29,7 @@
     </modules>
 
     <properties>
-        <maven.compiler.source>1.8</maven.compiler.source>
-        <maven.compiler.target>1.8</maven.compiler.target>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
     </properties>
 </project>
\ No newline at end of file
diff --git a/v1_19_R3/src/main/java/net/artelnatif/nicko/impl/v1_19_R3.java b/v1_19_R3/src/main/java/net/artelnatif/nicko/impl/v1_19_R3.java
index 130d207..d0ef0eb 100644
--- a/v1_19_R3/src/main/java/net/artelnatif/nicko/impl/v1_19_R3.java
+++ b/v1_19_R3/src/main/java/net/artelnatif/nicko/impl/v1_19_R3.java
@@ -89,6 +89,7 @@ public class v1_19_R3 implements Internals {
                 final PropertyMap properties = gameProfile.getProperties();
                 properties.removeAll("textures");
                 properties.put("textures", new Property("textures", skin.getValue(), skin.getSignature()));
+                updateSelf(player);
             }
         }
 
@@ -122,7 +123,6 @@ public class v1_19_R3 implements Internals {
             onlinePlayer.connection.send(remove);
             onlinePlayer.connection.send(init);
         });
-        updateSelf(player);
         // TODO: 3/17/23 Update signature to avoid duplicate for loop
         updateOthers(player);
         return new ActionResult<>();