--- a/net/minecraft/commands/CommandListenerWrapper.java
+++ b/net/minecraft/commands/CommandListenerWrapper.java
@@ -42,6 +42,8 @@
 import net.minecraft.world.phys.Vec2F;
 import net.minecraft.world.phys.Vec3D;
 
+import com.mojang.brigadier.tree.CommandNode; // CraftBukkit
+
 public class CommandListenerWrapper implements ICompletionProvider {
 
     public static final SimpleCommandExceptionType ERROR_NOT_PLAYER = new SimpleCommandExceptionType(IChatBaseComponent.translatable("permissions.requires.player"));
@@ -63,6 +65,7 @@
     private final CommandSigningContext signingContext;
     private final TaskChainer chatMessageChainer;
     private final IntConsumer returnValueConsumer;
+    public volatile CommandNode currentCommand; // CraftBukkit
 
     public CommandListenerWrapper(ICommandListener icommandlistener, Vec3D vec3d, Vec2F vec2f, WorldServer worldserver, int i, String s, IChatBaseComponent ichatbasecomponent, MinecraftServer minecraftserver, @Nullable Entity entity) {
         this(icommandlistener, vec3d, vec2f, worldserver, i, s, ichatbasecomponent, minecraftserver, entity, false, (commandcontext, flag, j) -> {
@@ -179,9 +182,23 @@
 
     @Override
     public boolean hasPermission(int i) {
+        // CraftBukkit start
+        CommandNode currentCommand = this.currentCommand;
+        if (currentCommand != null) {
+            return hasPermission(i, org.bukkit.craftbukkit.command.VanillaCommandWrapper.getPermission(currentCommand));
+        }
+        // CraftBukkit end
+
         return this.permissionLevel >= i;
     }
 
+    // CraftBukkit start
+    public boolean hasPermission(int i, String bukkitPermission) {
+        // World is null when loading functions
+        return ((getLevel() == null || !getLevel().getCraftServer().ignoreVanillaPermissions) && this.permissionLevel >= i) || getBukkitSender().hasPermission(bukkitPermission);
+    }
+    // CraftBukkit end
+
     public Vec3D getPosition() {
         return this.worldPosition;
     }
@@ -318,7 +335,7 @@
             while (iterator.hasNext()) {
                 EntityPlayer entityplayer = (EntityPlayer) iterator.next();
 
-                if (entityplayer != this.source && this.server.getPlayerList().isOp(entityplayer.getGameProfile())) {
+                if (entityplayer != this.source && entityplayer.getBukkitEntity().hasPermission("minecraft.admin.command_feedback")) { // CraftBukkit
                     entityplayer.sendSystemMessage(ichatmutablecomponent);
                 }
             }
@@ -391,4 +408,10 @@
     public FeatureFlagSet enabledFeatures() {
         return this.level.enabledFeatures();
     }
+
+    // CraftBukkit start
+    public org.bukkit.command.CommandSender getBukkitSender() {
+        return source.getBukkitSender(this);
+    }
+    // CraftBukkit end
 }
