diff --git a/src/main/java/chylex/bettercontrols/gui/ScreenPatcher.java b/src/main/java/chylex/bettercontrols/gui/ScreenPatcher.java
deleted file mode 100644
index 36e6be1..0000000
--- a/src/main/java/chylex/bettercontrols/gui/ScreenPatcher.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package chylex.bettercontrols.gui;
-import chylex.bettercontrols.mixin.AccessCycleButtonFields;
-import chylex.bettercontrols.mixin.AccessOptionFields;
-import chylex.bettercontrols.mixin.AccessScreenButtons;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.Option;
-import net.minecraft.client.gui.components.Button;
-import net.minecraft.client.gui.components.CycleButton;
-import net.minecraft.client.gui.components.events.ContainerEventHandler;
-import net.minecraft.client.gui.components.events.GuiEventListener;
-import net.minecraft.client.gui.screens.AccessibilityOptionsScreen;
-import net.minecraft.client.gui.screens.controls.ControlsScreen;
-import java.util.List;
-import java.util.Optional;
-import java.util.function.Consumer;
-
-public final class ScreenPatcher {
-	private ScreenPatcher() {}
-	
-	public static void onControlsScreenOpened(final ControlsScreen screen) {
-		final AccessScreenButtons accessor = (AccessScreenButtons)screen;
-		final List<? extends GuiEventListener> children = screen.children();
-		
-		final CycleButton<?> autoJump = children.stream().flatMap(it -> getOptionButton(it, Option.AUTO_JUMP).stream()).findAny().orElse(null);
-		
-		if (autoJump != null) {
-			final Button widget = new Button(autoJump.x, autoJump.y, autoJump.getWidth(), autoJump.getHeight(), BetterControlsScreen.TITLE.plainCopy().append("..."), btn -> {
-				Minecraft.getInstance().setScreen(new BetterControlsScreen(screen));
-			});
-			
-			accessor.callRemoveWidget(autoJump);
-			accessor.callAddRenderableWidget(widget);
-		}
-	}
-	
-	public static void onAccessibilityScreenOpened(final AccessibilityOptionsScreen screen) {
-		walkChildren(screen.children(), it -> {
-			getOptionButton(it, Option.TOGGLE_SPRINT).ifPresent(button -> button.active = false);
-			getOptionButton(it, Option.TOGGLE_CROUCH).ifPresent(button -> button.active = false);
-		});
-	}
-	
-	private static void walkChildren(final List<? extends GuiEventListener> elements, final Consumer<GuiEventListener> callback) {
-		for (final GuiEventListener element : elements) {
-			callback.accept(element);
-			
-			if (element instanceof final ContainerEventHandler container) {
-				walkChildren(container.children(), callback);
-			}
-		}
-	}
-	
-	private static Optional<CycleButton<?>> getOptionButton(final GuiEventListener element, final Option option) {
-		if (element instanceof final CycleButton<?> button && ((AccessOptionFields)option).getCaption().equals(((AccessCycleButtonFields)button).getName())) {
-			return Optional.of(button);
-		}
-		else {
-			return Optional.empty();
-		}
-	}
-}
diff --git a/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java b/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java
index 870ff9e..2cbc1f2 100644
--- a/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java
+++ b/src/main/java/chylex/bettercontrols/input/KeyBindingWithModifier.java
@@ -1,17 +1,11 @@
 package chylex.bettercontrols.input;
 import com.mojang.blaze3d.platform.InputConstants.Type;
 import net.minecraft.client.KeyMapping;
-import net.minecraft.network.chat.Component;
-import net.minecraft.network.chat.TranslatableComponent;
 import org.jetbrains.annotations.Nullable;
 
 public class KeyBindingWithModifier extends KeyMapping {
 	public static final String CATEGORY = "key.categories.bettercontrols";
 	
-	public static boolean checkCategoryMatches(final Component text) {
-		return text instanceof final TranslatableComponent t && CATEGORY.equals(t.getKey());
-	}
-	
 	@Nullable
 	private ModifierKey modifier = null;
 	
diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessControlsListCategory.java b/src/main/java/chylex/bettercontrols/mixin/AccessControlsListCategory.java
deleted file mode 100644
index aab2dfd..0000000
--- a/src/main/java/chylex/bettercontrols/mixin/AccessControlsListCategory.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package chylex.bettercontrols.mixin;
-import net.minecraft.client.gui.screens.controls.ControlList.CategoryEntry;
-import net.minecraft.network.chat.Component;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-@Mixin(CategoryEntry.class)
-public interface AccessControlsListCategory {
-	@Accessor
-	Component getName();
-}
diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessControlsListKeyBinding.java b/src/main/java/chylex/bettercontrols/mixin/AccessControlsListKeyBinding.java
deleted file mode 100644
index c641ec6..0000000
--- a/src/main/java/chylex/bettercontrols/mixin/AccessControlsListKeyBinding.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package chylex.bettercontrols.mixin;
-import net.minecraft.client.KeyMapping;
-import net.minecraft.client.gui.screens.controls.ControlList.KeyEntry;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-@Mixin(KeyEntry.class)
-public interface AccessControlsListKeyBinding {
-	@Accessor
-	KeyMapping getKey();
-}
diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessCycleButtonFields.java b/src/main/java/chylex/bettercontrols/mixin/AccessCycleButtonFields.java
deleted file mode 100644
index b06df98..0000000
--- a/src/main/java/chylex/bettercontrols/mixin/AccessCycleButtonFields.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package chylex.bettercontrols.mixin;
-
-import net.minecraft.client.gui.components.CycleButton;
-import net.minecraft.network.chat.Component;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-@Mixin(CycleButton.class)
-public interface AccessCycleButtonFields {
-	@Accessor
-	Component getName();
-}
diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessOptionFields.java b/src/main/java/chylex/bettercontrols/mixin/AccessOptionFields.java
deleted file mode 100644
index a0056f7..0000000
--- a/src/main/java/chylex/bettercontrols/mixin/AccessOptionFields.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package chylex.bettercontrols.mixin;
-
-import net.minecraft.client.Option;
-import net.minecraft.network.chat.Component;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-@Mixin(Option.class)
-public interface AccessOptionFields {
-	@Accessor
-	Component getCaption();
-}
diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessScreenButtons.java b/src/main/java/chylex/bettercontrols/mixin/AccessScreenButtons.java
deleted file mode 100644
index 24f3543..0000000
--- a/src/main/java/chylex/bettercontrols/mixin/AccessScreenButtons.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package chylex.bettercontrols.mixin;
-import net.minecraft.client.gui.components.Widget;
-import net.minecraft.client.gui.components.events.GuiEventListener;
-import net.minecraft.client.gui.narration.NarratableEntry;
-import net.minecraft.client.gui.screens.Screen;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Invoker;
-
-@SuppressWarnings("UnusedReturnValue")
-@Mixin(Screen.class)
-public interface AccessScreenButtons {
-	@Invoker
-	<T extends GuiEventListener & Widget & NarratableEntry> T callAddRenderableWidget(T widget);
-	
-	@Invoker
-	void callRemoveWidget(GuiEventListener widget);
-}
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java b/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java
index 4dc61c1..1b06c7b 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookControlsListWidget.java
@@ -1,18 +1,15 @@
 package chylex.bettercontrols.mixin;
 import chylex.bettercontrols.BetterControlsCommon;
-import chylex.bettercontrols.input.KeyBindingWithModifier;
+import net.minecraft.client.KeyMapping;
 import net.minecraft.client.Minecraft;
+import net.minecraft.client.Options;
 import net.minecraft.client.gui.components.ContainerObjectSelectionList;
 import net.minecraft.client.gui.screens.controls.ControlList;
-import net.minecraft.client.gui.screens.controls.ControlList.CategoryEntry;
 import net.minecraft.client.gui.screens.controls.ControlList.Entry;
-import net.minecraft.client.gui.screens.controls.ControlList.KeyEntry;
-import net.minecraft.client.gui.screens.controls.ControlsScreen;
 import org.apache.commons.lang3.ArrayUtils;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.Redirect;
 
 @Mixin(ControlList.class)
 public abstract class HookControlsListWidget extends ContainerObjectSelectionList<Entry> {
@@ -20,18 +17,8 @@ public abstract class HookControlsListWidget extends ContainerObjectSelectionLis
 		super(client, width, height, top, bottom, itemHeight);
 	}
 	
-	@Inject(method = "<init>", at = @At("TAIL"))
-	public void init(final ControlsScreen parent, final Minecraft client, final CallbackInfo ci) {
-		children().removeIf(it -> {
-			if (it instanceof final CategoryEntry entry && KeyBindingWithModifier.checkCategoryMatches(((AccessControlsListCategory)entry).getName())) {
-				return true;
-			}
-			
-			if (it instanceof final KeyEntry entry && ArrayUtils.contains(BetterControlsCommon.getConfig().getAllKeyBindings(), ((AccessControlsListKeyBinding)entry).getKey())) {
-				return true;
-			}
-			
-			return false;
-		});
+	@Redirect(method = "<init>", at = @At(value = "FIELD", target = "Lnet/minecraft/client/Options;keyMappings:[Lnet/minecraft/client/KeyMapping;"))
+	private KeyMapping[] excludeOwnKeyBindings(final Options options) {
+		return ArrayUtils.removeElements(options.keyMappings, BetterControlsCommon.getConfig().getAllKeyBindings());
 	}
 }
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java b/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java
new file mode 100644
index 0000000..0e17282
--- /dev/null
+++ b/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java
@@ -0,0 +1,28 @@
+package chylex.bettercontrols.mixin;
+
+import chylex.bettercontrols.gui.BetterControlsScreen;
+import net.minecraft.client.CycleOption;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.Option;
+import net.minecraft.client.Options;
+import net.minecraft.client.gui.components.AbstractWidget;
+import net.minecraft.client.gui.components.Button;
+import net.minecraft.client.gui.screens.Screen;
+import net.minecraft.client.gui.screens.controls.ControlsScreen;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Redirect;
+
+@Mixin(ControlsScreen.class)
+public abstract class HookControlsScreen {
+	@Redirect(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/CycleOption;createButton(Lnet/minecraft/client/Options;III)Lnet/minecraft/client/gui/components/AbstractWidget;"))
+	private AbstractWidget replaceAutoJumpButton(final CycleOption<?> option, final Options options, final int x, final int y, final int width) {
+		if (option == Option.AUTO_JUMP && !Screen.hasAltDown()) {
+			@SuppressWarnings("ConstantConditions")
+			final ControlsScreen screen = (ControlsScreen)(Object)this;
+			return new Button(x, y, width, 20, BetterControlsScreen.TITLE.plainCopy().append("..."), btn -> Minecraft.getInstance().setScreen(new BetterControlsScreen(screen)));
+		}
+		
+		return option.createButton(options, x, y, width);
+	}
+}
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookOpenScreen.java b/src/main/java/chylex/bettercontrols/mixin/HookOpenScreen.java
deleted file mode 100644
index 7a12845..0000000
--- a/src/main/java/chylex/bettercontrols/mixin/HookOpenScreen.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package chylex.bettercontrols.mixin;
-import chylex.bettercontrols.gui.ScreenPatcher;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.gui.screens.AccessibilityOptionsScreen;
-import net.minecraft.client.gui.screens.Screen;
-import net.minecraft.client.gui.screens.controls.ControlsScreen;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(value = Minecraft.class, priority = 100)
-public abstract class HookOpenScreen {
-	@Inject(method = "setScreen", at = @At("TAIL"))
-	private void openScreen(final Screen ignore, final CallbackInfo ci) {
-		final Screen screen = Minecraft.getInstance().screen;
-		
-		if (screen != null && !Screen.hasAltDown()) {
-			if (screen.getClass() == ControlsScreen.class) {
-				ScreenPatcher.onControlsScreenOpened((ControlsScreen)screen);
-			}
-			else if (screen.getClass() == AccessibilityOptionsScreen.class) {
-				ScreenPatcher.onAccessibilityScreenOpened((AccessibilityOptionsScreen)screen);
-			}
-		}
-	}
-}
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java b/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java
new file mode 100644
index 0000000..ee18a4c
--- /dev/null
+++ b/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java
@@ -0,0 +1,23 @@
+package chylex.bettercontrols.mixin;
+
+import net.minecraft.client.CycleOption;
+import net.minecraft.client.Option;
+import net.minecraft.client.Options;
+import net.minecraft.client.gui.components.AbstractWidget;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+@Mixin(CycleOption.class)
+public abstract class HookToggleOptionButtons {
+	@Inject(method = "createButton", at = @At("RETURN"))
+	private void disableToggleOptions(final Options options, final int x, final int y, final int width, final CallbackInfoReturnable<AbstractWidget> ci) {
+		@SuppressWarnings("ConstantConditions")
+		final CycleOption<?> me = (CycleOption<?>)(Object)this;
+		
+		if (me == Option.TOGGLE_CROUCH || me == Option.TOGGLE_SPRINT) {
+			ci.getReturnValue().active = false;
+		}
+	}
+}
diff --git a/src/main/resources/bettercontrols.mixins.json b/src/main/resources/bettercontrols.mixins.json
index 466efa4..b429c51 100644
--- a/src/main/resources/bettercontrols.mixins.json
+++ b/src/main/resources/bettercontrols.mixins.json
@@ -6,22 +6,18 @@
   "client": [
     "AccessCameraFields",
     "AccessClientPlayerFields",
-    "AccessControlsListCategory",
-    "AccessControlsListKeyBinding",
-    "AccessCycleButtonFields",
     "AccessKeyBindingFields",
-    "AccessOptionFields",
     "AccessPlayerFields",
-    "AccessScreenButtons",
     "AccessStickyKeyBindingStateGetter",
     "HookClientPlayerFOV",
     "HookClientPlayerInputTick",
     "HookClientPlayerTick",
     "HookControlsListWidget",
+    "HookControlsScreen",
     "HookLoadGameOptions",
-    "HookOpenScreen",
     "HookPlayerFlightSpeed",
-    "HookStickyKeyBindingState"
+    "HookStickyKeyBindingState",
+    "HookToggleOptionButtons"
   ],
   "injectors": {
     "defaultRequire": 1