diff --git a/src/utils/commandRegistration/register.ts b/src/utils/commandRegistration/register.ts
index d1b58f1..1f2241c 100644
--- a/src/utils/commandRegistration/register.ts
+++ b/src/utils/commandRegistration/register.ts
@@ -1,5 +1,4 @@
-import { typeSlashCommandSubcommandBuilder } from '@discordjs/builders';
-import { Interaction, SlashCommandBuilder, ApplicationCommandType } from 'discord.js';
+import Discord, { Interaction, SlashCommandBuilder, ApplicationCommandType } from 'discord.js';
 // @ts-expect-error
 import config from "../../config/main.json" assert { type: "json" };
 import client from "../client.js";
@@ -16,7 +15,6 @@
 }
 
 async function registerCommands() {
-    const developmentMode = config.enableDevelopment;
     const commands = [];
 
     const files = fs.readdirSync(config.commandsFolder, { withFileTypes: true }).filter(
@@ -49,17 +47,8 @@
         }
     }
 
-    console.log(`Processed ${commands.length} commands, registering...`)
-
-    const updateCommands = process.argv.includes("--update-commands");
-    if (developmentMode) {
-        const guild = await client.guilds.fetch(config.developmentGuildID);
-        if (updateCommands) guild.commands.set(processed);
-        console.log(`${colours.purple}Commands registered in ${guild.name}${colours.none}`)
-    } else {
-        if (updateCommands) client.application!.commands.set(processed);
-        console.log(`${colours.blue}Commands registered globally${colours.none}`)
-    }
+    console.log(`Processed ${processed.length} commands`)
+    return processed;
 
 };
 
@@ -100,31 +89,35 @@
     console.log(`Registering ${messageFiles.length} message context menus and ${userFiles.length} user context menus`)
     let i = 0;
     let errors = 0;
+    const commands: (Discord.ContextMenuCommandBuilder)[] = []
+    const totalFiles = messageFiles.length + userFiles.length;
     for (const file of messageFiles) {
-        const last = i === messageFiles.length - 1 ? "└" : "├";
+        const last = i === totalFiles - 1 ? "└" : "├";
         i++;
         try {
             console.log(`${last}─ ${colours.yellow}Loading message context menu ${file.name}${colours.none}`)
             const context = (await import(`../../../${config.messageContextFolder}/${file.name}`));
             context.command.setType(ApplicationCommandType.Message);
+            commands.push(context.command);
 
-            client.commands["contextCommands/message/" + file.name.replace(".js", "")] = context;
+            client.commands["contextCommands/message/" + context.command.name] = context;
 
-            console.log(`${last.replace("└", " ").replace("├", "│")}  └─ ${colours.green}Loaded ${file.name} [${i} / ${messageFiles.length}]${colours.none}`)
+            console.log(`${last.replace("└", " ").replace("├", "│")}  └─ ${colours.green}Loaded ${file.name} [${i} / ${totalFiles}]${colours.none}`)
         } catch (e) {
             errors++;
-            console.log(`${last.replace("└", " ").replace("├", "│")}  └─ ${colours.red}Failed to load ${file.name} [${i} / ${messageFiles.length}]${colours.none}`)
+            console.log(`${last.replace("└", " ").replace("├", "│")}  └─ ${colours.red}Failed to load ${file.name} [${i} / ${totalFiles}] | ${e}${colours.none}`)
         }
     }
     for (const file of userFiles) {
-        const last = i === userFiles.length - 1 ? "└" : "├";
+        const last = i === totalFiles - 1 ? "└" : "├";
         i++;
         try {
             console.log(`${last}─ ${colours.yellow}Loading user context menu ${file.name}${colours.none}`)
             const context = (await import(`../../../${config.userContextFolder}/${file.name}`));
             context.command.setType(ApplicationCommandType.User);
+            commands.push(context.command);
 
-            client.commands["contextCommands/user/" + file.name.replace(".js", "")] = context;
+            client.commands["contextCommands/user/" + context.command.name] = context;
 
             console.log(`${last.replace("└", " ").replace("├", "│")}  └─ ${colours.green}Loaded ${file.name} [${i} / ${userFiles.length}]${colours.none}`)
         } catch (e) {
@@ -134,17 +127,18 @@
     }
 
     console.log(`Loaded ${messageFiles.length + userFiles.length - errors} context menus (${errors} failed)`)
+    return commands;
 };
 
 async function registerCommandHandler() {
     client.on("interactionCreate", async (interaction: Interaction) => {
         if (interaction.isUserContextMenuCommand()) {;
-            const commandName = interaction.commandName;
-            console.log(commandName);
+            const commandName = "contextCommands/user/" + interaction.commandName;
+            execute(client.commands[commandName]?.check, client.commands[commandName]?.callback, interaction)
             return;
         } else if (interaction.isMessageContextMenuCommand()) {
-            const commandName = interaction.commandName;
-            console.log(commandName);
+            const commandName = "contextCommands/message/" + interaction.commandName;
+            execute(client.commands[commandName]?.check, client.commands[commandName]?.callback, interaction)
             return;
         }
         if (!interaction.isChatInputCommand()) return;
@@ -158,25 +152,39 @@
         const command = client.commands[fullCommandName];
         const callback = command?.callback;
         const check = command?.check;
-
-        if (!callback) return;
-        if (check) {
-            let result;
-            try {
-                result = await check(interaction);
-            } catch (e) {
-                console.log(e);
-                result = false;
-            }
-            if (!result) return;
-        }
-        callback(interaction);
+        execute(check, callback, interaction);
     });
 }
 
+async function execute(check: Function | undefined, callback: Function | undefined, data: Interaction) {
+    if (!callback) return;
+    if (check) {
+        let result;
+        try {
+            result = await check(data);
+        } catch (e) {
+            console.log(e);
+            result = false;
+        }
+        if (!result) return;
+    }
+    callback(data);
+}
+
 export default async function register() {
-    let commandList: (SlashCommandBuilder | SlashCommandSubcommandBuilder)[] = []
-    commandList.concat(await registerCommands());
+    let commandList: ( Discord.SlashCommandBuilder | Discord.ContextMenuCommandBuilder )[] = [];
+    commandList = commandList.concat(await registerCommands());
+    commandList = commandList.concat(await registerContextMenus());
+    if (process.argv.includes("--update-commands")) {
+        if (config.enableDevelopment) {
+            const guild = await client.guilds.fetch(config.developmentGuildID);
+            console.log(`${colours.purple}Registering commands in ${guild!.name}${colours.none}`)
+            await guild.commands.set(commandList);
+        } else {
+            console.log(`${colours.blue}Registering commands in production mode${colours.none}`)
+            await client.application?.commands.set(commandList);
+        }
+    }
     await registerCommandHandler();
     await registerEvents();
     console.log(`${colours.green}Registered commands and events${colours.none}`)
