--- a/com/mojang/brigadier/tree/CommandNode.java
+++ b/com/mojang/brigadier/tree/CommandNode.java
@@ -27,11 +_,22 @@
     private final Map<String, CommandNode<S>> children = new LinkedHashMap<>();
     private final Map<String, LiteralCommandNode<S>> literals = new LinkedHashMap<>();
     private final Map<String, ArgumentCommandNode<S, ?>> arguments = new LinkedHashMap<>();
-    private final Predicate<S> requirement;
+    public Predicate<S> requirement; // Paper - public-f
     private final CommandNode<S> redirect;
     private final RedirectModifier<S> modifier;
     private final boolean forks;
     private Command<S> command;
+    public CommandNode<S> clientNode; // Paper - Brigadier API
+    public CommandNode<io.papermc.paper.command.brigadier.CommandSourceStack> unwrappedCached = null; // Paper - Brigadier Command API
+    public CommandNode<io.papermc.paper.command.brigadier.CommandSourceStack> wrappedCached = null; // Paper - Brigadier Command API
+    public io.papermc.paper.command.brigadier.APICommandMeta apiCommandMeta; // Paper - Brigadier Command API
+    // CraftBukkit start
+    public void removeCommand(String name) {
+        this.children.remove(name);
+        this.literals.remove(name);
+        this.arguments.remove(name);
+    }
+    // CraftBukkit end
 
     protected CommandNode(final Command<S> command, final Predicate<S> requirement, final CommandNode<S> redirect, final RedirectModifier<S> modifier, final boolean forks) {
         this.command = command;
@@ -151,6 +_,12 @@
     protected abstract String getSortedKey();
 
     public Collection<? extends CommandNode<S>> getRelevantNodes(final StringReader input) {
+    // Paper start - prioritize mc commands in function parsing
+        return this.getRelevantNodes(input, null);
+    }
+    @org.jetbrains.annotations.ApiStatus.Internal
+    public Collection<? extends CommandNode<S>> getRelevantNodes(final StringReader input, final Object source) {
+     // Paper end - prioritize mc commands in function parsing
         if (literals.size() > 0) {
             final int cursor = input.getCursor();
             while (input.canRead() && input.peek() != ' ') {
@@ -158,7 +_,21 @@
             }
             final String text = input.getString().substring(cursor, input.getCursor());
             input.setCursor(cursor);
-            final LiteralCommandNode<S> literal = literals.get(text);
+            // Paper start - prioritize mc commands in function parsing
+            LiteralCommandNode<S> literal = null;
+            if (source instanceof net.minecraft.commands.CommandSourceStack css && css.source == net.minecraft.commands.CommandSource.NULL) {
+                if (!text.contains(":")) {
+                    literal = this.literals.get("minecraft:" + text);
+                }
+            } else if (source instanceof net.minecraft.commands.CommandSourceStack css && css.source instanceof net.minecraft.world.level.BaseCommandBlock) {
+                if (css.getServer().server.getCommandBlockOverride(text) && !text.contains(":")) {
+                    literal = this.literals.get("minecraft:" + text);
+                }
+            }
+            if (literal == null) {
+                literal = this.literals.get(text);
+            }
+            // Paper end - prioritize mc commands in function parsing
             if (literal != null) {
                 return Collections.singleton(literal);
             } else {
@@ -183,4 +_,11 @@
     }
 
     public abstract Collection<String> getExamples();
+    // Paper start - Brigadier Command API
+    public void clearAll() {
+        this.children.clear();
+        this.literals.clear();
+        this.arguments.clear();
+    }
+    // Paper end - Brigadier Command API
 }
