--- a/net/minecraft/server/commands/ScheduleCommand.java
+++ b/net/minecraft/server/commands/ScheduleCommand.java
@@ -3,6 +3,8 @@
 import com.mojang.brigadier.CommandDispatcher;
 import com.mojang.brigadier.arguments.IntegerArgumentType;
 import com.mojang.brigadier.arguments.StringArgumentType;
+import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+import com.mojang.brigadier.builder.RequiredArgumentBuilder;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
@@ -11,11 +13,9 @@
 import com.mojang.datafixers.util.Pair;
 import java.util.Collection;
 import net.minecraft.commands.CommandSourceStack;
-import net.minecraft.commands.Commands;
 import net.minecraft.commands.SharedSuggestionProvider;
 import net.minecraft.commands.arguments.TimeArgument;
 import net.minecraft.commands.arguments.item.FunctionArgument;
-import net.minecraft.commands.functions.CommandFunction;
 import net.minecraft.network.chat.Component;
 import net.minecraft.resources.ResourceLocation;
 import net.minecraft.server.MinecraftServer;
@@ -24,114 +24,75 @@
 import net.minecraft.world.level.timers.TimerQueue;
 
 public class ScheduleCommand {
+
     private static final SimpleCommandExceptionType ERROR_SAME_TICK = new SimpleCommandExceptionType(Component.translatable("commands.schedule.same_tick"));
-    private static final DynamicCommandExceptionType ERROR_CANT_REMOVE = new DynamicCommandExceptionType(
-        eventName -> Component.translatableEscape("commands.schedule.cleared.failure", eventName)
-    );
-    private static final SuggestionProvider<CommandSourceStack> SUGGEST_SCHEDULE = (context, builder) -> SharedSuggestionProvider.suggest(
-            context.getSource().getServer().getWorldData().overworldData().getScheduledEvents().getEventsIds(), builder
-        );
+    private static final DynamicCommandExceptionType ERROR_CANT_REMOVE = new DynamicCommandExceptionType((object) -> {
+        return Component.translatableEscape("commands.schedule.cleared.failure", object);
+    });
+    private static final SuggestionProvider<CommandSourceStack> SUGGEST_SCHEDULE = (commandcontext, suggestionsbuilder) -> {
+        return SharedSuggestionProvider.suggest((Iterable) ((net.minecraft.commands.CommandSourceStack) commandcontext.getSource()).getLevel().serverLevelData.getScheduledEvents().getEventsIds(), suggestionsbuilder); // Paper - Make schedule command per-world
+    };
+
+    public ScheduleCommand() {}
 
     public static void register(CommandDispatcher<CommandSourceStack> dispatcher) {
-        dispatcher.register(
-            Commands.literal("schedule")
-                .requires(source -> source.hasPermission(2))
-                .then(
-                    Commands.literal("function")
-                        .then(
-                            Commands.argument("function", FunctionArgument.functions())
-                                .suggests(FunctionCommand.SUGGEST_FUNCTION)
-                                .then(
-                                    Commands.argument("time", TimeArgument.time())
-                                        .executes(
-                                            context -> schedule(
-                                                    context.getSource(),
-                                                    FunctionArgument.getFunctionOrTag(context, "function"),
-                                                    IntegerArgumentType.getInteger(context, "time"),
-                                                    true
-                                                )
-                                        )
-                                        .then(
-                                            Commands.literal("append")
-                                                .executes(
-                                                    context -> schedule(
-                                                            context.getSource(),
-                                                            FunctionArgument.getFunctionOrTag(context, "function"),
-                                                            IntegerArgumentType.getInteger(context, "time"),
-                                                            false
-                                                        )
-                                                )
-                                        )
-                                        .then(
-                                            Commands.literal("replace")
-                                                .executes(
-                                                    context -> schedule(
-                                                            context.getSource(),
-                                                            FunctionArgument.getFunctionOrTag(context, "function"),
-                                                            IntegerArgumentType.getInteger(context, "time"),
-                                                            true
-                                                        )
-                                                )
-                                        )
-                                )
-                        )
-                )
-                .then(
-                    Commands.literal("clear")
-                        .then(
-                            Commands.argument("function", StringArgumentType.greedyString())
-                                .suggests(SUGGEST_SCHEDULE)
-                                .executes(context -> remove(context.getSource(), StringArgumentType.getString(context, "function")))
-                        )
-                )
-        );
+        dispatcher.register((LiteralArgumentBuilder) ((LiteralArgumentBuilder) ((LiteralArgumentBuilder) net.minecraft.commands.Commands.literal("schedule").requires((commandlistenerwrapper) -> {
+            return commandlistenerwrapper.hasPermission(2);
+        })).then(net.minecraft.commands.Commands.literal("function").then(net.minecraft.commands.Commands.argument("function", FunctionArgument.functions()).suggests(FunctionCommand.SUGGEST_FUNCTION).then(((RequiredArgumentBuilder) ((RequiredArgumentBuilder) net.minecraft.commands.Commands.argument("time", TimeArgument.time()).executes((commandcontext) -> {
+            return ScheduleCommand.schedule((CommandSourceStack) commandcontext.getSource(), FunctionArgument.getFunctionOrTag(commandcontext, "function"), IntegerArgumentType.getInteger(commandcontext, "time"), true);
+        })).then(net.minecraft.commands.Commands.literal("append").executes((commandcontext) -> {
+            return ScheduleCommand.schedule((CommandSourceStack) commandcontext.getSource(), FunctionArgument.getFunctionOrTag(commandcontext, "function"), IntegerArgumentType.getInteger(commandcontext, "time"), false);
+        }))).then(net.minecraft.commands.Commands.literal("replace").executes((commandcontext) -> {
+            return ScheduleCommand.schedule((CommandSourceStack) commandcontext.getSource(), FunctionArgument.getFunctionOrTag(commandcontext, "function"), IntegerArgumentType.getInteger(commandcontext, "time"), true);
+        })))))).then(net.minecraft.commands.Commands.literal("clear").then(net.minecraft.commands.Commands.argument("function", StringArgumentType.greedyString()).suggests(ScheduleCommand.SUGGEST_SCHEDULE).executes((commandcontext) -> {
+            return ScheduleCommand.remove((CommandSourceStack) commandcontext.getSource(), StringArgumentType.getString(commandcontext, "function"));
+        }))));
     }
 
-    private static int schedule(
-        CommandSourceStack source,
-        Pair<ResourceLocation, Either<CommandFunction<CommandSourceStack>, Collection<CommandFunction<CommandSourceStack>>>> function,
-        int time,
-        boolean replace
-    ) throws CommandSyntaxException {
+    private static int schedule(CommandSourceStack source, Pair<ResourceLocation, Either<net.minecraft.commands.functions.CommandFunction<CommandSourceStack>, Collection<net.minecraft.commands.functions.CommandFunction<CommandSourceStack>>>> function, int time, boolean replace) throws CommandSyntaxException {
         if (time == 0) {
-            throw ERROR_SAME_TICK.create();
+            throw ScheduleCommand.ERROR_SAME_TICK.create();
         } else {
-            long l = source.getLevel().getGameTime() + (long)time;
-            ResourceLocation resourceLocation = function.getFirst();
-            TimerQueue<MinecraftServer> timerQueue = source.getServer().getWorldData().overworldData().getScheduledEvents();
-            function.getSecond()
-                .ifLeft(
-                    function2 -> {
-                        String string = resourceLocation.toString();
-                        if (replace) {
-                            timerQueue.remove(string);
-                        }
+            long j = source.getLevel().getGameTime() + (long) time;
+            ResourceLocation minecraftkey = (ResourceLocation) function.getFirst();
+            TimerQueue<MinecraftServer> customfunctioncallbacktimerqueue = source.getLevel().serverLevelData.overworldData().getScheduledEvents(); // CraftBukkit - SPIGOT-6667: Use world specific function timer
 
-                        timerQueue.schedule(string, l, new FunctionCallback(resourceLocation));
-                        source.sendSuccess(
-                            () -> Component.translatable("commands.schedule.created.function", Component.translationArg(resourceLocation), time, l), true
-                        );
-                    }
-                )
-                .ifRight(functions -> {
-                    String string = "#" + resourceLocation;
-                    if (replace) {
-                        timerQueue.remove(string);
-                    }
+            ((Either) function.getSecond()).ifLeft((net_minecraft_commands_functions_commandfunction) -> {
+                String s = minecraftkey.toString();
 
-                    timerQueue.schedule(string, l, new FunctionTagCallback(resourceLocation));
-                    source.sendSuccess(() -> Component.translatable("commands.schedule.created.tag", Component.translationArg(resourceLocation), time, l), true);
-                });
-            return Math.floorMod(l, Integer.MAX_VALUE);
+                if (replace) {
+                    customfunctioncallbacktimerqueue.remove(s);
+                }
+
+                customfunctioncallbacktimerqueue.schedule(s, j, new FunctionCallback(minecraftkey));
+                source.sendSuccess(() -> {
+                    return Component.translatable("commands.schedule.created.function", Component.translationArg(minecraftkey), time, j);
+                }, true);
+            }).ifRight((collection) -> {
+                String s = "#" + String.valueOf(minecraftkey);
+
+                if (replace) {
+                    customfunctioncallbacktimerqueue.remove(s);
+                }
+
+                customfunctioncallbacktimerqueue.schedule(s, j, new FunctionTagCallback(minecraftkey));
+                source.sendSuccess(() -> {
+                    return Component.translatable("commands.schedule.created.tag", Component.translationArg(minecraftkey), time, j);
+                }, true);
+            });
+            return Math.floorMod(j, Integer.MAX_VALUE);
         }
     }
 
     private static int remove(CommandSourceStack source, String eventName) throws CommandSyntaxException {
-        int i = source.getServer().getWorldData().overworldData().getScheduledEvents().remove(eventName);
+        int i = source.getLevel().serverLevelData.getScheduledEvents().remove(eventName); // Paper - Make schedule command per-world
+
         if (i == 0) {
-            throw ERROR_CANT_REMOVE.create(eventName);
+            throw ScheduleCommand.ERROR_CANT_REMOVE.create(eventName);
         } else {
-            source.sendSuccess(() -> Component.translatable("commands.schedule.cleared.success", i, eventName), true);
+            source.sendSuccess(() -> {
+                return Component.translatable("commands.schedule.cleared.success", i, eventName);
+            }, true);
             return i;
         }
     }
