--- ../src-base/minecraft/net/minecraft/command/CommandHandler.java
+++ ../src-work/minecraft/net/minecraft/command/CommandHandler.java
@@ -16,6 +16,11 @@
 
 import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.event.CommandEvent;
+// Cauldron start
+import org.bukkit.craftbukkit.command.CraftSimpleCommandMap;
+import org.bukkit.craftbukkit.command.ModCustomCommand;
+import cpw.mods.fml.common.FMLCommonHandler;
+// Cauldron end
 
 public class CommandHandler implements ICommandManager
 {
@@ -48,7 +53,7 @@
                 throw new CommandNotFoundException();
             }
 
-            if (icommand.canCommandSenderUseCommand(p_71556_1_))
+            if (true || icommand.canCommandSenderUseCommand(p_71556_1_)) // Cauldron start - disable check for permissions since we handle it on Bukkit side
             {
                 CommandEvent event = new CommandEvent(icommand, p_71556_1_, astring);
                 if (MinecraftForge.EVENT_BUS.post(event))
@@ -134,11 +139,30 @@
 
     public ICommand registerCommand(ICommand p_71560_1_)
     {
-        List list = p_71560_1_.getCommandAliases();
-        this.commandMap.put(p_71560_1_.getCommandName(), p_71560_1_);
-        this.commandSet.add(p_71560_1_);
+    // Cauldron start - register commands with permission nodes, defaulting to class name
+        return registerCommand(p_71560_1_, p_71560_1_.getClass().getName());
+    }
 
+    public ICommand registerCommand(String permissionGroup, ICommand par1ICommand)
+    {
+        return registerCommand(par1ICommand, permissionGroup + "." + par1ICommand.getCommandName());
+    }
+
+    public ICommand registerCommand(ICommand par1ICommand, String permissionNode)
+    {
+        List list = par1ICommand.getCommandAliases();
+        this.commandMap.put(par1ICommand.getCommandName(), par1ICommand);
+        this.commandSet.add(par1ICommand);
+        // register vanilla commands with Bukkit to support permissions.
+        CraftSimpleCommandMap commandMap = FMLCommonHandler.instance().getMinecraftServerInstance().server.getCraftCommandMap();
+        ModCustomCommand customCommand = new ModCustomCommand(par1ICommand.getCommandName());
+        customCommand.setPermission(permissionNode);
         if (list != null)
+            customCommand.setAliases(list);
+        commandMap.register(par1ICommand.getCommandName(), customCommand);
+        LogManager.getLogger().info("Registered command " + par1ICommand.getCommandName() + " with permission node " + permissionNode);
+
+        if (list != null)
         {
             Iterator iterator = list.iterator();
 
@@ -149,13 +173,14 @@
 
                 if (icommand1 == null || !icommand1.getCommandName().equals(s))
                 {
-                    this.commandMap.put(s, p_71560_1_);
+                    this.commandMap.put(s, par1ICommand);
                 }
             }
         }
 
-        return p_71560_1_;
+        return par1ICommand;
     }
+    // Cauldron end
 
     private static String[] dropFirstString(String[] p_71559_0_)
     {