diff --git a/Fabric/src/main/java/chylex/bettercontrols/compatibility/ModMenuSupport.java b/Fabric/src/main/java/chylex/bettercontrols/compatibility/ModMenuSupport.java
index b507286..cb116dc 100644
--- a/Fabric/src/main/java/chylex/bettercontrols/compatibility/ModMenuSupport.java
+++ b/Fabric/src/main/java/chylex/bettercontrols/compatibility/ModMenuSupport.java
@@ -3,11 +3,10 @@ package chylex.bettercontrols.compatibility;
 import chylex.bettercontrols.gui.BetterControlsScreen;
 import com.terraformersmc.modmenu.api.ConfigScreenFactory;
 import com.terraformersmc.modmenu.api.ModMenuApi;
-import net.minecraft.client.Minecraft;
 
 public class ModMenuSupport implements ModMenuApi {
 	@Override
 	public ConfigScreenFactory<?> getModConfigScreenFactory() {
-		return parentScreen -> new BetterControlsScreen(Minecraft.getInstance(), parentScreen);
+		return BetterControlsScreen::new;
 	}
 }
diff --git a/NeoForge/src/main/java/chylex/bettercontrols/BetterControlsMod.java b/NeoForge/src/main/java/chylex/bettercontrols/BetterControlsMod.java
index c889c36..d8a1114 100644
--- a/NeoForge/src/main/java/chylex/bettercontrols/BetterControlsMod.java
+++ b/NeoForge/src/main/java/chylex/bettercontrols/BetterControlsMod.java
@@ -2,19 +2,26 @@ package chylex.bettercontrols;
 
 import chylex.bettercontrols.config.BetterControlsConfig;
 import chylex.bettercontrols.gui.BetterControlsScreen;
+import net.minecraft.client.gui.screens.Screen;
 import net.neoforged.api.distmarker.Dist;
+import net.neoforged.fml.ModContainer;
 import net.neoforged.fml.ModLoadingContext;
 import net.neoforged.fml.common.Mod;
 import net.neoforged.fml.loading.FMLEnvironment;
 import net.neoforged.fml.loading.FMLPaths;
 import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
+import javax.annotation.Nullable;
 
 @Mod("bettercontrols")
 public final class BetterControlsMod {
 	public BetterControlsMod() {
 		if (FMLEnvironment.dist == Dist.CLIENT) {
 			BetterControlsCommon.setConfig(BetterControlsConfig.load(FMLPaths.CONFIGDIR.get().resolve("BetterControls.json")));
-			ModLoadingContext.get().registerExtensionPoint(IConfigScreenFactory.class, () -> BetterControlsScreen::new);
+			ModLoadingContext.get().registerExtensionPoint(IConfigScreenFactory.class, () -> BetterControlsMod::createOptionsScreen);
 		}
 	}
+	
+	private static BetterControlsScreen createOptionsScreen(final ModContainer modContainer, @Nullable final Screen parentScreen) {
+		return new BetterControlsScreen(parentScreen);
+	}
 }
diff --git a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
index d4212e7..7ff6b97 100644
--- a/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
+++ b/src/main/java/chylex/bettercontrols/gui/BetterControlsScreen.java
@@ -206,8 +206,8 @@ public class BetterControlsScreen extends OptionsSubScreen {
 	private final List<KeyBindingWidget> allKeyBindings = new ArrayList<>();
 	
 	@SuppressWarnings("DataFlowIssue")
-	public BetterControlsScreen(final Minecraft mc, @Nullable final Screen parentScreen) {
-		super(parentScreen, mc.options, TITLE);
+	public BetterControlsScreen(@Nullable final Screen parentScreen) {
+		super(parentScreen, Minecraft.getInstance().options, TITLE);
 	}
 	
 	@Override
diff --git a/src/main/java/chylex/bettercontrols/gui/OptionListWidget.java b/src/main/java/chylex/bettercontrols/gui/OptionListWidget.java
index 6f450b5..7d605c0 100644
--- a/src/main/java/chylex/bettercontrols/gui/OptionListWidget.java
+++ b/src/main/java/chylex/bettercontrols/gui/OptionListWidget.java
@@ -70,13 +70,13 @@ public final class OptionListWidget extends ContainerObjectSelectionList<Entry>
 	}
 	
 	@Override
-	protected int getScrollbarPosition() {
+	protected int scrollBarX() {
 		return (width + ROW_WIDTH) / 2 + 4;
 	}
 	
 	@Override
 	public boolean mouseScrolled(final double x, final double y, final double xAmount, final double yAmount) {
-		setScrollAmount(getScrollAmount() - yAmount * SCROLL_MULTIPLIER);
+		setScrollAmount(scrollAmount() - yAmount * SCROLL_MULTIPLIER);
 		return true;
 	}
 	
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java
index ae83eeb..7041df4 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java
@@ -4,23 +4,19 @@ import chylex.bettercontrols.player.PlayerTicker;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.player.AbstractClientPlayer;
 import net.minecraft.client.player.LocalPlayer;
+import net.minecraft.world.entity.player.Abilities;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Redirect;
-import org.spongepowered.asm.mixin.injection.Slice;
 
 @Mixin(AbstractClientPlayer.class)
 public abstract class HookClientPlayerFOV {
 	@Redirect(
 		method = "getFieldOfViewModifier",
-		at = @At(value = "INVOKE", target = "Ljava/lang/Float;isNaN(F)Z"),
-		slice = @Slice(
-			from = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getWalkingSpeed()F"),
-			to = @At(value = "INVOKE", target = "Ljava/lang/Float;isInfinite(F)Z")
-		)
+		at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getWalkingSpeed()F")
 	)
-	private boolean resetFOV(final float movementSpeed) {
+	private float overrideWalkingSpeed(final Abilities abilities) {
 		final LocalPlayer player = Minecraft.getInstance().player;
-		return (player != null && PlayerTicker.get(player).shouldResetFOV(player)) || Float.isNaN(movementSpeed);
+		return (player != null && PlayerTicker.get(player).shouldResetFOV(player)) ? 0F : abilities.getWalkingSpeed();
 	}
 }
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java
index 48b3c23..67621a7 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java
@@ -2,7 +2,6 @@ package chylex.bettercontrols.mixin;
 
 import chylex.bettercontrols.player.PlayerTicker;
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.player.Input;
 import net.minecraft.client.player.KeyboardInput;
 import net.minecraft.client.player.LocalPlayer;
 import org.spongepowered.asm.mixin.Mixin;
@@ -14,14 +13,15 @@ import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
 @Mixin(KeyboardInput.class)
 @SuppressWarnings("UnreachableCode")
 public abstract class HookClientPlayerInputTick {
-	@Inject(method = "tick(ZF)V", at = @At(value = "FIELD", target = "Lnet/minecraft/client/player/KeyboardInput;up:Z", ordinal = 0, shift = AFTER))
+	@Inject(
+		method = "tick",
+		at = @At(value = "FIELD", target = "Lnet/minecraft/client/player/KeyboardInput;keyPresses:Lnet/minecraft/world/entity/player/Input;", ordinal = 0, shift = AFTER)
+	)
 	private void afterInputTick(final CallbackInfo info) {
-		@SuppressWarnings("ConstantConditions")
-		final Input input = (Input)(Object)this;
 		final LocalPlayer player = Minecraft.getInstance().player;
 		
 		if (player != null) {
-			PlayerTicker.get(player).afterInputAssignsPressingForward(input);
+			PlayerTicker.get(player).afterKeyboardInputAssigned(player);
 		}
 	}
 }
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java
index 38a07f8..ae7dba6 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java
@@ -25,7 +25,7 @@ public abstract class HookClientPlayerTick extends AbstractClientPlayer {
 		PlayerTicker.get(player).atHead(player);
 	}
 	
-	@Inject(method = "aiStep()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/Input;tick(ZF)V", ordinal = 0, shift = AFTER))
+	@Inject(method = "aiStep()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/ClientInput;tick()V", ordinal = 0, shift = AFTER))
 	private void afterInputTick(final CallbackInfo info) {
 		@SuppressWarnings("ConstantConditions")
 		final LocalPlayer player = (LocalPlayer)(Object)this;
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java b/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java
index 5958589..e0a5922 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java
@@ -25,10 +25,9 @@ public abstract class HookControlsScreen extends OptionsSubScreen {
 	
 	@Inject(method = "addOptions", at = @At("RETURN"))
 	public void afterAddOptions(final CallbackInfo ci) {
-		@SuppressWarnings("ConstantConditions")
-		final ControlsScreen screen = (ControlsScreen)(Object)this;
-		
 		if (list != null) {
+			@SuppressWarnings("ConstantConditions")
+			final ControlsScreen screen = (ControlsScreen)(Object)this;
 			final MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("...");
 			list.addSmall(List.of(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).build()));
 		}
@@ -36,7 +35,6 @@ public abstract class HookControlsScreen extends OptionsSubScreen {
 	
 	@Unique
 	private static void showOptionsScreen(final ControlsScreen screen) {
-		final Minecraft mc = Minecraft.getInstance();
-		mc.setScreen(new BetterControlsScreen(mc, screen));
+		Minecraft.getInstance().setScreen(new BetterControlsScreen(screen));
 	}
 }
diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
index 60416c9..b82999c 100644
--- a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
+++ b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
@@ -14,8 +14,9 @@ import net.minecraft.client.Camera;
 import net.minecraft.client.KeyMapping;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.Options;
-import net.minecraft.client.player.Input;
+import net.minecraft.client.player.ClientInput;
 import net.minecraft.client.player.LocalPlayer;
+import net.minecraft.world.entity.player.Input;
 import java.lang.ref.WeakReference;
 import java.util.function.BooleanSupplier;
 
@@ -148,19 +149,25 @@ public final class PlayerTicker {
 		toggleSneak.tick();
 	}
 	
-	public void afterInputAssignsPressingForward(final Input input) {
-		if (MINECRAFT.screen == null) {
-			//noinspection NonShortCircuitBooleanExpression
-			input.up |= toggleWalkForward.tick();
+	public void afterKeyboardInputAssigned(final LocalPlayer player) {
+		if (MINECRAFT.screen == null && toggleWalkForward.tick()) {
+			final ClientInput input = player.input;
+			
+			input.keyPresses = new Input(
+				true,
+				input.keyPresses.backward(),
+				input.keyPresses.left(),
+				input.keyPresses.right(),
+				input.keyPresses.jump(),
+				input.keyPresses.shift(),
+				input.keyPresses.sprint()
+			);
 		}
 	}
 	
 	public void afterInputTick(final LocalPlayer player) {
-		final Input input = player.input;
-		
-		if (MINECRAFT.screen == null && !player.getAbilities().flying) {
-			//noinspection NonShortCircuitBooleanExpression
-			input.jumping |= toggleJump.tick();
+		if (MINECRAFT.screen == null && !player.getAbilities().flying && toggleJump.tick()) {
+			player.input.makeJump();
 		}
 		
 		if (cfg().resumeSprintingAfterHittingObstacle) {
@@ -223,13 +230,13 @@ public final class PlayerTicker {
 		}
 		
 		if (FlightHelper.isFlyingCreativeOrSpectator(player) && cfg().disableFlightInertia) {
-			final Input input = player.input;
+			final ClientInput input = player.input;
 			
 			if (input.forwardImpulse == 0F && input.leftImpulse == 0F) {
 				player.setDeltaMovement(player.getDeltaMovement().multiply(0.0, 1.0, 0.0));
 			}
 			
-			if (!input.jumping && !input.shiftKeyDown) {
+			if (!input.keyPresses.jump() && !input.keyPresses.shift()) {
 				player.setDeltaMovement(player.getDeltaMovement().multiply(1.0, 0.0, 1.0));
 			}
 		}
@@ -276,7 +283,7 @@ public final class PlayerTicker {
 		}
 		
 		if (cfg().keyOpenMenu.isDown()) {
-			MINECRAFT.setScreen(new BetterControlsScreen(MINECRAFT, null));
+			MINECRAFT.setScreen(new BetterControlsScreen(null));
 		}
 	}