--- a/net/minecraft/world/level/BaseCommandBlock.java
+++ b/net/minecraft/world/level/BaseCommandBlock.java
@@ -37,6 +_,11 @@
     private String command = "";
     @Nullable
     private Component customName;
+    // CraftBukkit start
+    @Override
+    public abstract org.bukkit.command.CommandSender getBukkitSender(CommandSourceStack wrapper);
+    // CraftBukkit end
+
 
     public int getSuccessCount() {
         return this.successCount;
@@ -114,7 +_,7 @@
                             this.successCount++;
                         }
                     });
-                    server.getCommands().performPrefixedCommand(commandSourceStack, this.command);
+                    server.getCommands().dispatchServerCommand(commandSourceStack, this.command); // CraftBukkit
                 } catch (Throwable var6) {
                     CrashReport crashReport = CrashReport.forThrowable(var6, "Executing command block");
                     CrashReportCategory crashReportCategory = crashReport.addCategory("Command to be executed");
@@ -150,6 +_,7 @@
     @Override
     public void sendSystemMessage(Component component) {
         if (this.trackOutput) {
+            org.spigotmc.AsyncCatcher.catchOp("sendSystemMessage to a command block"); // Paper - Don't broadcast messages to command blocks
             this.lastOutput = Component.literal("[" + TIME_FORMAT.format(new Date()) + "] ").append(component);
             this.onUpdated();
         }
@@ -172,7 +_,7 @@
     }
 
     public InteractionResult usedBy(Player player) {
-        if (!player.canUseGameMasterBlocks()) {
+        if (!player.canUseGameMasterBlocks() && (!player.isCreative() || !player.getBukkitEntity().hasPermission("minecraft.commandblock"))) { // Paper - command block permission
             return InteractionResult.PASS;
         } else {
             if (player.getCommandSenderWorld().isClientSide) {
