diff --git a/patches/server/Add-Lifecycle-Event-system.patch b/patches/server/Add-Lifecycle-Event-system.patch
index e975dc169a..49bec4bff0 100644
--- a/patches/server/Add-Lifecycle-Event-system.patch
+++ b/patches/server/Add-Lifecycle-Event-system.patch
@@ -60,9 +60,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@
 +package io.papermc.paper.plugin.lifecycle.event;
 +
-+import com.google.common.base.Suppliers;
-+import com.mojang.logging.LogUtils;
-+import io.papermc.paper.plugin.bootstrap.BootstrapContext;
 +import io.papermc.paper.plugin.lifecycle.event.registrar.PaperRegistrar;
 +import io.papermc.paper.plugin.lifecycle.event.registrar.RegistrarEvent;
 +import io.papermc.paper.plugin.lifecycle.event.registrar.RegistrarEventImpl;
@@ -72,33 +69,27 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +import io.papermc.paper.plugin.lifecycle.event.types.OwnerAwareLifecycleEvent;
 +import java.util.ArrayList;
 +import java.util.List;
-+import java.util.Set;
 +import java.util.function.Predicate;
-+import java.util.function.Supplier;
 +import org.bukkit.plugin.Plugin;
 +import org.checkerframework.checker.nullness.qual.NonNull;
 +import org.checkerframework.checker.nullness.qual.Nullable;
 +import org.checkerframework.framework.qual.DefaultQualifier;
-+import org.slf4j.Logger;
 +
 +@DefaultQualifier(NonNull.class)
 +public class LifecycleEventRunner {
 +
-+    private static final Logger LOGGER = LogUtils.getClassLogger();
-+    private static final Supplier<Set<LifecycleEventType<?, ?, ?>>> BLOCKS_RELOADING = Suppliers.memoize(() -> Set.of( // lazy due to cyclic initialization
-+    ));
 +    public static final LifecycleEventRunner INSTANCE = new LifecycleEventRunner();
 +
 +    private final List<LifecycleEventType<?, ?, ?>> lifecycleEventTypes = new ArrayList<>();
 +    private boolean blockPluginReloading = false;
 +
-+    public void checkRegisteredHandler(final LifecycleEventOwner owner, final LifecycleEventType<?, ?, ?> eventType) {
++    public <O extends LifecycleEventOwner> void checkRegisteredHandler(final O owner, final AbstractLifecycleEventType<O, ?, ?> eventType) {
 +        /*
 +        Lifecycle event handlers for reloadable events that are registered from the BootstrapContext prevent
 +        the server from reloading plugins. This is because reloading plugins requires disabling all the plugins,
 +        running the reload logic (which would include places where these events should fire) and then re-enabling plugins.
 +         */
-+        if (owner instanceof BootstrapContext && BLOCKS_RELOADING.get().contains(eventType)) {
++        if (eventType.blocksReloading(owner)) {
 +            this.blockPluginReloading = true;
 +        }
 +    }
@@ -107,9 +98,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        return this.blockPluginReloading;
 +    }
 +
-+    public <O extends LifecycleEventOwner, E extends LifecycleEvent, ET extends LifecycleEventType<O, E, ?>> ET addEventType(final ET eventType) {
++    public <O extends LifecycleEventOwner, E extends LifecycleEvent, ET extends LifecycleEventType<O, E, ?>> void addEventType(final ET eventType) {
 +        this.lifecycleEventTypes.add(eventType);
-+        return eventType;
 +    }
 +
 +    public <O extends LifecycleEventOwner, E extends PaperLifecycleEvent> void callEvent(final LifecycleEventType<O, ? super E, ?> eventType, final E event) {
@@ -435,6 +425,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 @@ -0,0 +0,0 @@
 +package io.papermc.paper.plugin.lifecycle.event.types;
 +
++import io.papermc.paper.plugin.bootstrap.BootstrapContext;
 +import io.papermc.paper.plugin.lifecycle.event.LifecycleEvent;
 +import io.papermc.paper.plugin.lifecycle.event.LifecycleEventOwner;
 +import io.papermc.paper.plugin.lifecycle.event.LifecycleEventRunner;
@@ -455,6 +446,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    protected AbstractLifecycleEventType(final String name, final Class<? extends O> ownerType) {
 +        this.name = name;
 +        this.ownerType = ownerType;
++        LifecycleEventRunner.INSTANCE.addEventType(this);
 +    }
 +
 +    @Override
@@ -468,6 +460,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +        }
 +    }
 +
++    public boolean blocksReloading(final O eventOwner) {
++        return eventOwner instanceof BootstrapContext;
++    }
++
 +    public abstract boolean hasHandlers();
 +
 +    public abstract void forEachHandler(E event, Consumer<RegisteredHandler<O, E>> consumer, Predicate<RegisteredHandler<O, E>> predicate);
@@ -512,12 +508,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +
 +    @Override
 +    public <O extends LifecycleEventOwner, E extends LifecycleEvent> LifecycleEventType.Monitorable<O, E> monitor(final String name, final Class<? extends O> ownerType) {
-+        return LifecycleEventRunner.INSTANCE.addEventType(new MonitorableLifecycleEventType<>(name, ownerType));
++        return new MonitorableLifecycleEventType<>(name, ownerType);
 +    }
 +
 +    @Override
 +    public <O extends LifecycleEventOwner, E extends LifecycleEvent> LifecycleEventType.Prioritizable<O, E> prioritized(final String name, final Class<? extends O> ownerType) {
-+        return LifecycleEventRunner.INSTANCE.addEventType(new PrioritizableLifecycleEventType.Simple<>(name, ownerType));
++        return new PrioritizableLifecycleEventType.Simple<>(name, ownerType);
 +    }
 +}
 diff --git a/src/main/java/io/papermc/paper/plugin/lifecycle/event/types/MonitorableLifecycleEventType.java b/src/main/java/io/papermc/paper/plugin/lifecycle/event/types/MonitorableLifecycleEventType.java
diff --git a/patches/server/Brigadier-based-command-API.patch b/patches/server/Brigadier-based-command-API.patch
index ae0b5bf5ba..6064cef2c0 100644
--- a/patches/server/Brigadier-based-command-API.patch
+++ b/patches/server/Brigadier-based-command-API.patch
@@ -2010,26 +2010,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
 +
 +}
-diff --git a/src/main/java/io/papermc/paper/plugin/lifecycle/event/LifecycleEventRunner.java b/src/main/java/io/papermc/paper/plugin/lifecycle/event/LifecycleEventRunner.java
-index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
---- a/src/main/java/io/papermc/paper/plugin/lifecycle/event/LifecycleEventRunner.java
-+++ b/src/main/java/io/papermc/paper/plugin/lifecycle/event/LifecycleEventRunner.java
-@@ -0,0 +0,0 @@ import io.papermc.paper.plugin.lifecycle.event.registrar.RegistrarEventImpl;
- import io.papermc.paper.plugin.lifecycle.event.registrar.ReloadableRegistrarEvent;
- import io.papermc.paper.plugin.lifecycle.event.types.AbstractLifecycleEventType;
- import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEventType;
-+import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
- import io.papermc.paper.plugin.lifecycle.event.types.OwnerAwareLifecycleEvent;
- import java.util.ArrayList;
- import java.util.List;
-@@ -0,0 +0,0 @@ public class LifecycleEventRunner {
- 
-     private static final Logger LOGGER = LogUtils.getClassLogger();
-     private static final Supplier<Set<LifecycleEventType<?, ?, ?>>> BLOCKS_RELOADING = Suppliers.memoize(() -> Set.of( // lazy due to cyclic initialization
-+        LifecycleEvents.COMMANDS
-     ));
-     public static final LifecycleEventRunner INSTANCE = new LifecycleEventRunner();
- 
 diff --git a/src/main/java/net/minecraft/commands/CommandSource.java b/src/main/java/net/minecraft/commands/CommandSource.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/net/minecraft/commands/CommandSource.java
diff --git a/patches/server/Registry-Modification-API.patch b/patches/server/Registry-Modification-API.patch
index 300c4c5717..de743d23fe 100644
--- a/patches/server/Registry-Modification-API.patch
+++ b/patches/server/Registry-Modification-API.patch
@@ -728,7 +728,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +            eventType = (ET) this.eventTypes.get(registryKey);
 +        } else {
 +            eventType = eventTypeCreator.apply(registryKey, this.name);
-+            LifecycleEventRunner.INSTANCE.addEventType(eventType);
 +            this.eventTypes.put(registryKey, eventType);
 +        }
 +        return eventType;
@@ -844,6 +843,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    }
 +
 +    @Override
++    public boolean blocksReloading(final BootstrapContext eventOwner) {
++        return false; // only runs once
++    }
++
++    @Override
 +    public RegistryEntryAddConfiguration<T> newHandler(final LifecycleEventHandler<? super RegistryEntryAddEvent<T, B>> handler) {
 +        return new RegistryEntryAddHandlerConfiguration<>(handler, this);
 +    }
@@ -924,6 +928,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +    public RegistryLifecycleEventType(final RegistryKey<T> registryKey, final String eventName) {
 +        super(registryKey + " / " + eventName, BootstrapContext.class);
 +    }
++
++    @Override
++    public boolean blocksReloading(final BootstrapContext eventOwner) {
++        return false; // only runs once
++    }
 +}
 diff --git a/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java b/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
diff --git a/patches/server/Tag-Lifecycle-Events.patch b/patches/server/Tag-Lifecycle-Events.patch
index 1e786da93e..945b166a2b 100644
--- a/patches/server/Tag-Lifecycle-Events.patch
+++ b/patches/server/Tag-Lifecycle-Events.patch
@@ -20,10 +20,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
 +
      @Override
      public <O extends LifecycleEventOwner, E extends LifecycleEvent> LifecycleEventType.Monitorable<O, E> monitor(final String name, final Class<? extends O> ownerType) {
-         return LifecycleEventRunner.INSTANCE.addEventType(new MonitorableLifecycleEventType<>(name, ownerType));
+         return new MonitorableLifecycleEventType<>(name, ownerType);
 @@ -0,0 +0,0 @@ public final class LifecycleEventTypeProviderImpl implements LifecycleEventTypeP
      public <O extends LifecycleEventOwner, E extends LifecycleEvent> LifecycleEventType.Prioritizable<O, E> prioritized(final String name, final Class<? extends O> ownerType) {
-         return LifecycleEventRunner.INSTANCE.addEventType(new PrioritizableLifecycleEventType.Simple<>(name, ownerType));
+         return new PrioritizableLifecycleEventType.Simple<>(name, ownerType);
      }
 +
 +    @Override