diff --git a/src/main/java/chylex/bettercontrols/Mixins.java b/src/main/java/chylex/bettercontrols/Mixins.java
new file mode 100644
index 0000000..f905a6c
--- /dev/null
+++ b/src/main/java/chylex/bettercontrols/Mixins.java
@@ -0,0 +1,42 @@
+package chylex.bettercontrols;
+
+import chylex.bettercontrols.mixin.AccessCameraFields;
+import chylex.bettercontrols.mixin.AccessClientPlayerFields;
+import chylex.bettercontrols.mixin.AccessKeyMappingFields;
+import chylex.bettercontrols.mixin.AccessPlayerFields;
+import chylex.bettercontrols.mixin.AccessToggleKeyMappingFields;
+import net.minecraft.client.Camera;
+import net.minecraft.client.KeyMapping;
+import net.minecraft.client.ToggleKeyMapping;
+import net.minecraft.client.player.LocalPlayer;
+import net.minecraft.world.entity.player.Player;
+
+@SuppressWarnings("CastToIncompatibleInterface")
+public final class Mixins {
+	private Mixins() {}
+	
+	@SuppressWarnings("unchecked")
+	public static <T> T me(Object object) {
+		return (T) object;
+	}
+	
+	public static AccessCameraFields cameraFields(Camera camera) {
+		return (AccessCameraFields) camera;
+	}
+	
+	public static AccessClientPlayerFields clientPlayerFields(LocalPlayer localPlayer) {
+		return (AccessClientPlayerFields) localPlayer;
+	}
+	
+	public static AccessKeyMappingFields keyMappingFields(KeyMapping keyMapping) {
+		return (AccessKeyMappingFields) keyMapping;
+	}
+	
+	public static AccessPlayerFields playerFields(Player player) {
+		return (AccessPlayerFields) player;
+	}
+	
+	public static AccessToggleKeyMappingFields toggleKeyMappingFields(ToggleKeyMapping toggleKeyMapping) {
+		return (AccessToggleKeyMappingFields) toggleKeyMapping;
+	}
+}
diff --git a/src/main/java/chylex/bettercontrols/input/ToggleTrackerForStickyKey.java b/src/main/java/chylex/bettercontrols/input/ToggleTrackerForStickyKey.java
index 2446fed..c920700 100644
--- a/src/main/java/chylex/bettercontrols/input/ToggleTrackerForStickyKey.java
+++ b/src/main/java/chylex/bettercontrols/input/ToggleTrackerForStickyKey.java
@@ -1,6 +1,6 @@
 package chylex.bettercontrols.input;
 
-import chylex.bettercontrols.mixin.AccessKeyBindingFields;
+import chylex.bettercontrols.Mixins;
 import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
 import net.minecraft.client.KeyMapping;
 import java.util.HashSet;
@@ -31,6 +31,6 @@ public final class ToggleTrackerForStickyKey extends ToggleTracker {
 	
 	@Override
 	protected boolean isResetKeyPressed() {
-		return ((AccessKeyBindingFields)bindingReset).isPressedField();
+		return Mixins.keyMappingFields(bindingReset).isPressedField();
 	}
 }
diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessKeyBindingFields.java b/src/main/java/chylex/bettercontrols/mixin/AccessKeyMappingFields.java
similarity index 82%
rename from src/main/java/chylex/bettercontrols/mixin/AccessKeyBindingFields.java
rename to src/main/java/chylex/bettercontrols/mixin/AccessKeyMappingFields.java
index 61a7471..634782f 100644
--- a/src/main/java/chylex/bettercontrols/mixin/AccessKeyBindingFields.java
+++ b/src/main/java/chylex/bettercontrols/mixin/AccessKeyMappingFields.java
@@ -6,7 +6,8 @@ import org.spongepowered.asm.mixin.gen.Accessor;
 import java.util.Map;
 
 @Mixin(KeyMapping.class)
-public interface AccessKeyBindingFields {
+@SuppressWarnings("StaticMethodOnlyUsedInOneClass")
+public interface AccessKeyMappingFields {
 	@Accessor("CATEGORY_SORT_ORDER")
 	static Map<String, Integer> getCategoryOrderMap() {
 		throw new AssertionError();
diff --git a/src/main/java/chylex/bettercontrols/mixin/AccessStickyKeyBindingStateGetter.java b/src/main/java/chylex/bettercontrols/mixin/AccessToggleKeyMappingFields.java
similarity index 88%
rename from src/main/java/chylex/bettercontrols/mixin/AccessStickyKeyBindingStateGetter.java
rename to src/main/java/chylex/bettercontrols/mixin/AccessToggleKeyMappingFields.java
index 8383aaf..f11ac9b 100644
--- a/src/main/java/chylex/bettercontrols/mixin/AccessStickyKeyBindingStateGetter.java
+++ b/src/main/java/chylex/bettercontrols/mixin/AccessToggleKeyMappingFields.java
@@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.gen.Accessor;
 import java.util.function.BooleanSupplier;
 
 @Mixin(ToggleKeyMapping.class)
-public interface AccessStickyKeyBindingStateGetter {
+public interface AccessToggleKeyMappingFields {
 	@Accessor
 	BooleanSupplier getNeedsToggle();
 	
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java
index a93d825..53437fd 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerFOV.java
@@ -1,5 +1,6 @@
 package chylex.bettercontrols.mixin;
 
+import chylex.bettercontrols.Mixins;
 import chylex.bettercontrols.player.PlayerTicker;
 import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
 import net.minecraft.client.player.AbstractClientPlayer;
@@ -14,9 +15,9 @@ public abstract class HookClientPlayerFOV {
 		at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getWalkingSpeed()F")
 	)
 	private float overrideWalkingSpeed(float walkingSpeed) {
-		AbstractClientPlayer me = (AbstractClientPlayer)(Object)this;
+		AbstractClientPlayer me = Mixins.me(this);
 		
-		if (me instanceof LocalPlayer localPlayer && PlayerTicker.get(localPlayer).shouldResetFOV(localPlayer)) {
+		if (me instanceof LocalPlayer localPlayer && PlayerTicker.shouldResetFOV(localPlayer)) {
 			return 0F;
 		}
 		else {
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java
index bdbf1de..c6a007a 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerInputTick.java
@@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
 
 @Mixin(KeyboardInput.class)
-@SuppressWarnings({ "MethodMayBeStatic", "UnreachableCode" })
+@SuppressWarnings("MethodMayBeStatic")
 public abstract class HookClientPlayerInputTick {
 	@Inject(
 		method = "tick",
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java
index d856fd1..f2a1d1b 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerTick.java
@@ -1,5 +1,6 @@
 package chylex.bettercontrols.mixin;
 
+import chylex.bettercontrols.Mixins;
 import chylex.bettercontrols.player.PlayerTicker;
 import com.mojang.authlib.GameProfile;
 import net.minecraft.client.multiplayer.ClientLevel;
@@ -12,7 +13,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import static org.spongepowered.asm.mixin.injection.At.Shift.AFTER;
 
 @Mixin(LocalPlayer.class)
-@SuppressWarnings("UnreachableCode")
 public abstract class HookClientPlayerTick extends AbstractClientPlayer {
 	protected HookClientPlayerTick(ClientLevel world, GameProfile profile) {
 		super(world, profile);
@@ -20,22 +20,19 @@ public abstract class HookClientPlayerTick extends AbstractClientPlayer {
 	
 	@Inject(method = "aiStep()V", at = @At("HEAD"))
 	private void atHead(CallbackInfo info) {
-		@SuppressWarnings("ConstantConditions")
-		LocalPlayer player = (LocalPlayer)(Object)this;
+		LocalPlayer player = Mixins.me(this);
 		PlayerTicker.get(player).atHead(player);
 	}
 	
 	@Inject(method = "aiStep()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/ClientInput;tick()V", ordinal = 0, shift = AFTER))
 	private void afterInputTick(CallbackInfo info) {
-		@SuppressWarnings("ConstantConditions")
-		LocalPlayer player = (LocalPlayer)(Object)this;
+		LocalPlayer player = Mixins.me(this);
 		PlayerTicker.get(player).afterInputTick(player);
 	}
 	
 	@Inject(method = "aiStep()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/AbstractClientPlayer;aiStep()V", ordinal = 0, shift = AFTER))
 	private void afterSuperCall(CallbackInfo info) {
-		@SuppressWarnings("ConstantConditions")
-		LocalPlayer player = (LocalPlayer)(Object)this;
+		LocalPlayer player = Mixins.me(this);
 		PlayerTicker.get(player).afterSuperCall(player);
 	}
 }
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java
index 3f32b34..707cfd5 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java
@@ -1,5 +1,6 @@
 package chylex.bettercontrols.mixin;
 
+import chylex.bettercontrols.Mixins;
 import chylex.bettercontrols.player.FlightHelper;
 import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
 import net.minecraft.client.player.LocalPlayer;
@@ -11,7 +12,6 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Slice;
 
 @Mixin(LocalPlayer.class)
-@SuppressWarnings({ "SameReturnValue", "UnreachableCode" })
 public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity {
 	protected HookClientPlayerVerticalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) {
 		super(type, world);
@@ -26,8 +26,7 @@ public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity {
 		)
 	)
 	private float modifyVerticalFlightSpeed(float flyingSpeed) {
-		@SuppressWarnings("ConstantConditions")
-		LocalPlayer me = (LocalPlayer)(Object)this;
+		LocalPlayer me = Mixins.me(this);
 		return flyingSpeed * FlightHelper.getVerticalSpeedMultiplier(me);
 	}
 }
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java b/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java
index 1ad5890..ce664c4 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookControlsScreen.java
@@ -1,5 +1,6 @@
 package chylex.bettercontrols.mixin;
 
+import chylex.bettercontrols.Mixins;
 import chylex.bettercontrols.gui.BetterControlsScreen;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.Options;
@@ -17,7 +18,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 import java.util.List;
 
 @Mixin(ControlsScreen.class)
-@SuppressWarnings("UnreachableCode")
 public abstract class HookControlsScreen extends OptionsSubScreen {
 	public HookControlsScreen(Screen parentScreen, Options options, Component title) {
 		super(parentScreen, options, title);
@@ -26,8 +26,7 @@ public abstract class HookControlsScreen extends OptionsSubScreen {
 	@Inject(method = "addOptions", at = @At("RETURN"))
 	public void afterAddOptions(CallbackInfo ci) {
 		if (list != null) {
-			@SuppressWarnings("ConstantConditions")
-			ControlsScreen screen = (ControlsScreen)(Object)this;
+			ControlsScreen screen = Mixins.me(this);
 			MutableComponent buttonTitle = BetterControlsScreen.TITLE.plainCopy().append("...");
 			list.addSmall(List.of(Button.builder(buttonTitle, btn -> showOptionsScreen(screen)).build()));
 		}
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookLoadGameOptions.java b/src/main/java/chylex/bettercontrols/mixin/HookLoadGameOptions.java
index 13fb5ce..4851ce3 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookLoadGameOptions.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookLoadGameOptions.java
@@ -38,6 +38,6 @@ public abstract class HookLoadGameOptions {
 		
 		hasLoaded = true;
 		keyMappings = ArrayUtils.addAll(keyMappings, config.getAllKeyBindings());
-		AccessKeyBindingFields.getCategoryOrderMap().put(KeyBindingWithModifier.CATEGORY, Integer.valueOf(Integer.MAX_VALUE));
+		AccessKeyMappingFields.getCategoryOrderMap().put(KeyBindingWithModifier.CATEGORY, Integer.valueOf(Integer.MAX_VALUE));
 	}
 }
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java
index f64cc7b..d548964 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java
@@ -1,5 +1,6 @@
 package chylex.bettercontrols.mixin;
 
+import chylex.bettercontrols.Mixins;
 import chylex.bettercontrols.player.FlightHelper;
 import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
 import com.llamalad7.mixinextras.injector.ModifyReturnValue;
@@ -13,7 +14,6 @@ import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Slice;
 
 @Mixin(Player.class)
-@SuppressWarnings({ "SameReturnValue", "UnreachableCode" })
 public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
 	protected HookPlayerHorizontalFlightSpeed(EntityType<? extends LivingEntity> type, Level world) {
 		super(type, world);
@@ -29,8 +29,7 @@ public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
 		)
 	)
 	private boolean disableVanillaSprintBoost(boolean isSprinting) {
-		@SuppressWarnings("ConstantConditions")
-		Player me = (Player)(Object)this;
+		Player me = Mixins.me(this);
 		
 		if (me instanceof LocalPlayer localPlayer && FlightHelper.isFlyingCreativeOrSpectator(localPlayer)) {
 			return false;
@@ -42,8 +41,7 @@ public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
 	
 	@ModifyReturnValue(method = "getFlyingSpeed", at = @At("RETURN"))
 	private float modifyHorizontalFlyingSpeed(float flyingSpeed) {
-		@SuppressWarnings("ConstantConditions")
-		Player me = (Player)(Object)this;
+		Player me = Mixins.me(this);
 		
 		if (me instanceof LocalPlayer localPlayer && localPlayer.getAbilities().flying) {
 			return flyingSpeed * FlightHelper.getHorizontalSpeedMultiplier(localPlayer);
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookStickyKeyBindingState.java b/src/main/java/chylex/bettercontrols/mixin/HookStickyKeyBindingState.java
index 7974ef5..7302d9a 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookStickyKeyBindingState.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookStickyKeyBindingState.java
@@ -1,5 +1,6 @@
 package chylex.bettercontrols.mixin;
 
+import chylex.bettercontrols.Mixins;
 import chylex.bettercontrols.input.ToggleTrackerForStickyKey;
 import net.minecraft.client.KeyMapping;
 import net.minecraft.client.ToggleKeyMapping;
@@ -24,7 +25,7 @@ public abstract class HookStickyKeyBindingState extends KeyMapping {
 	@Inject(method = "setDown", at = @At("HEAD"), cancellable = true)
 	public void setPressed(boolean pressed, CallbackInfo info) {
 		if (ToggleTrackerForStickyKey.isOverrideEnabled(this)) {
-			((AccessKeyBindingFields)this).setPressedField(pressed);
+			Mixins.keyMappingFields(this).setPressedField(pressed);
 			info.cancel();
 		}
 	}
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java b/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java
index ea07bd5..ae78579 100644
--- a/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java
+++ b/src/main/java/chylex/bettercontrols/mixin/HookToggleOptionButtons.java
@@ -1,5 +1,6 @@
 package chylex.bettercontrols.mixin;
 
+import chylex.bettercontrols.Mixins;
 import net.minecraft.client.OptionInstance;
 import net.minecraft.client.Options;
 import net.minecraft.client.gui.components.AbstractWidget;
@@ -10,12 +11,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 import java.util.function.Consumer;
 
 @Mixin(OptionInstance.class)
-@SuppressWarnings("UnreachableCode")
 public abstract class HookToggleOptionButtons {
 	@Inject(method = "createButton(Lnet/minecraft/client/Options;IIILjava/util/function/Consumer;)Lnet/minecraft/client/gui/components/AbstractWidget;", at = @At("RETURN"))
 	private <T> void disableToggleOptions(Options options, int x, int y, int width, Consumer<T> callback, CallbackInfoReturnable<AbstractWidget> cir) {
-		@SuppressWarnings("ConstantConditions")
-		OptionInstance<?> me = (OptionInstance<?>)(Object)this;
+		OptionInstance<?> me = Mixins.me(this);
 		
 		if (me == options.toggleCrouch() || me == options.toggleSprint()) {
 			cir.getReturnValue().active = false;
diff --git a/src/main/java/chylex/bettercontrols/player/FlightHelper.java b/src/main/java/chylex/bettercontrols/player/FlightHelper.java
index 081fca9..ae7a8fc 100644
--- a/src/main/java/chylex/bettercontrols/player/FlightHelper.java
+++ b/src/main/java/chylex/bettercontrols/player/FlightHelper.java
@@ -1,10 +1,9 @@
 package chylex.bettercontrols.player;
 
-import chylex.bettercontrols.BetterControlsCommon;
-import chylex.bettercontrols.config.BetterControlsConfig;
 import net.minecraft.client.KeyMapping;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.player.LocalPlayer;
+import static chylex.bettercontrols.BetterControlsCommon.getConfig;
 
 public final class FlightHelper {
 	private FlightHelper() {}
@@ -15,12 +14,8 @@ public final class FlightHelper {
 		return KEY_SPRINT.isDown();
 	}
 	
-	private static BetterControlsConfig cfg() {
-		return BetterControlsCommon.getConfig();
-	}
-	
 	public static boolean shouldStartGliding(boolean isHoldingJump) {
-		return cfg().keyStartGlide.isDown() || (cfg().doubleTapJumpToGlide && isHoldingJump);
+		return getConfig().keyStartGlide.isDown() || (getConfig().doubleTapJumpToGlide && isHoldingJump);
 	}
 	
 	public static boolean isFlyingCreativeOrSpectator(LocalPlayer player) {
@@ -28,15 +23,15 @@ public final class FlightHelper {
 	}
 	
 	static boolean shouldFlyOnGround(LocalPlayer player) {
-		return cfg().flyOnGroundInCreative && player.isCreative() && player.getAbilities().flying;
+		return getConfig().flyOnGroundInCreative && player.isCreative() && player.getAbilities().flying;
 	}
 	
 	public static float getHorizontalSpeedMultiplier(LocalPlayer player) {
 		if (player.isCreative()) {
-			return isSprinting() ? cfg().flightHorizontalSpeedMpCreativeSprinting : cfg().flightHorizontalSpeedMpCreativeDefault;
+			return isSprinting() ? getConfig().flightHorizontalSpeedMpCreativeSprinting : getConfig().flightHorizontalSpeedMpCreativeDefault;
 		}
 		else if (player.isSpectator()) {
-			return isSprinting() ? cfg().flightHorizontalSpeedMpSpectatorSprinting : cfg().flightHorizontalSpeedMpSpectatorDefault;
+			return isSprinting() ? getConfig().flightHorizontalSpeedMpSpectatorSprinting : getConfig().flightHorizontalSpeedMpSpectatorDefault;
 		}
 		else {
 			return 1F;
@@ -45,10 +40,10 @@ public final class FlightHelper {
 	
 	public static float getVerticalSpeedMultiplier(LocalPlayer player) {
 		if (player.isCreative()) {
-			return isSprinting() ? cfg().flightVerticalSpeedMpCreativeSprinting : cfg().flightVerticalSpeedMpCreativeDefault;
+			return isSprinting() ? getConfig().flightVerticalSpeedMpCreativeSprinting : getConfig().flightVerticalSpeedMpCreativeDefault;
 		}
 		else if (player.isSpectator()) {
-			return isSprinting() ? cfg().flightVerticalSpeedMpSpectatorSprinting : cfg().flightVerticalSpeedMpSpectatorDefault;
+			return isSprinting() ? getConfig().flightVerticalSpeedMpSpectatorSprinting : getConfig().flightVerticalSpeedMpSpectatorDefault;
 		}
 		else {
 			return 1F;
diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
index 40838c2..b9adcfa 100644
--- a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
+++ b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
@@ -1,30 +1,28 @@
 package chylex.bettercontrols.player;
 
-import chylex.bettercontrols.BetterControlsCommon;
-import chylex.bettercontrols.config.BetterControlsConfig;
+import chylex.bettercontrols.Mixins;
 import chylex.bettercontrols.gui.BetterControlsScreen;
 import chylex.bettercontrols.input.SprintMode;
 import chylex.bettercontrols.input.ToggleTracker;
 import chylex.bettercontrols.input.ToggleTrackerForStickyKey;
-import chylex.bettercontrols.mixin.AccessCameraFields;
-import chylex.bettercontrols.mixin.AccessClientPlayerFields;
-import chylex.bettercontrols.mixin.AccessPlayerFields;
-import chylex.bettercontrols.mixin.AccessStickyKeyBindingStateGetter;
+import chylex.bettercontrols.mixin.AccessToggleKeyMappingFields;
 import net.minecraft.client.Camera;
 import net.minecraft.client.KeyMapping;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.Options;
+import net.minecraft.client.ToggleKeyMapping;
 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;
+import static chylex.bettercontrols.BetterControlsCommon.getConfig;
 
 public final class PlayerTicker {
 	private static final Minecraft MINECRAFT = Minecraft.getInstance();
 	private static final Options OPTIONS = MINECRAFT.options;
 	
-	private static final KeyMapping KEY_SPRINT = OPTIONS.keySprint;
+	private static final ToggleKeyMapping KEY_SPRINT = (ToggleKeyMapping) OPTIONS.keySprint;
 	private static final KeyMapping KEY_SNEAK = OPTIONS.keyShift;
 	private static final KeyMapping KEY_FORWARD = OPTIONS.keyUp;
 	private static final KeyMapping KEY_JUMP = OPTIONS.keyJump;
@@ -39,10 +37,6 @@ public final class PlayerTicker {
 		return ticker;
 	}
 	
-	private static BetterControlsConfig cfg() {
-		return BetterControlsCommon.getConfig();
-	}
-	
 	private final WeakReference<LocalPlayer> ref;
 	
 	private PlayerTicker(LocalPlayer player) {
@@ -52,10 +46,10 @@ public final class PlayerTicker {
 	
 	// Logic
 	
-	private final ToggleTracker toggleSprint = new ToggleTrackerForStickyKey(cfg().keyToggleSprint, KEY_SPRINT, OPTIONS.toggleSprint()::set);
-	private final ToggleTracker toggleSneak = new ToggleTrackerForStickyKey(cfg().keyToggleSneak, KEY_SNEAK, OPTIONS.toggleCrouch()::set);
-	private final ToggleTracker toggleWalkForward = new ToggleTracker(cfg().keyToggleWalkForward, KEY_FORWARD);
-	private final ToggleTracker toggleJump = new ToggleTracker(cfg().keyToggleJump, KEY_JUMP);
+	private final ToggleTracker toggleSprint = new ToggleTrackerForStickyKey(getConfig().keyToggleSprint, KEY_SPRINT, OPTIONS.toggleSprint()::set);
+	private final ToggleTracker toggleSneak = new ToggleTrackerForStickyKey(getConfig().keyToggleSneak, KEY_SNEAK, OPTIONS.toggleCrouch()::set);
+	private final ToggleTracker toggleWalkForward = new ToggleTracker(getConfig().keyToggleWalkForward, KEY_FORWARD);
+	private final ToggleTracker toggleJump = new ToggleTracker(getConfig().keyToggleJump, KEY_JUMP);
 	
 	private boolean waitingForSprintKeyRelease = false;
 	private boolean stopSprintingAfterReleasingSprintKey = false;
@@ -69,7 +63,7 @@ public final class PlayerTicker {
 	private int temporaryFlyOnGroundTimer = 0;
 	
 	private void setup() {
-		AccessStickyKeyBindingStateGetter sprint = (AccessStickyKeyBindingStateGetter)KEY_SPRINT;
+		AccessToggleKeyMappingFields sprint = Mixins.toggleKeyMappingFields(KEY_SPRINT);
 		BooleanSupplier getter = sprint.getNeedsToggle();
 		
 		if (getter instanceof SprintPressGetter g) {
@@ -84,15 +78,15 @@ public final class PlayerTicker {
 			player.setOnGround(false);
 		}
 		
-		if (!cfg().doubleTapForwardToSprint) {
-			((AccessClientPlayerFields)player).setSprintTriggerTime(0);
+		if (!getConfig().doubleTapForwardToSprint) {
+			Mixins.clientPlayerFields(player).setSprintTriggerTime(0);
 		}
 		
-		if (!cfg().doubleTapJumpToToggleFlight) {
-			((AccessPlayerFields)player).setJumpTriggerTime(0);
+		if (!getConfig().doubleTapJumpToToggleFlight) {
+			Mixins.playerFields(player).setJumpTriggerTime(0);
 		}
 		
-		SprintMode sprintMode = cfg().sprintMode;
+		SprintMode sprintMode = getConfig().sprintMode;
 		boolean wasSprintToggled = Boolean.TRUE.equals(OPTIONS.toggleSprint().get());
 		boolean isSprintToggled = toggleSprint.tick();
 		
@@ -170,7 +164,7 @@ public final class PlayerTicker {
 			player.input.makeJump();
 		}
 		
-		if (cfg().resumeSprintingAfterHittingObstacle) {
+		if (getConfig().resumeSprintingAfterHittingObstacle) {
 			if (wasHittingObstacle != player.horizontalCollision) {
 				if (!wasHittingObstacle) {
 					wasSprintingBeforeHittingObstacle = player.isSprinting() || KEY_SPRINT.isDown();
@@ -229,7 +223,7 @@ public final class PlayerTicker {
 			holdingSneakWhileTouchingGround = false;
 		}
 		
-		if (FlightHelper.isFlyingCreativeOrSpectator(player) && cfg().disableFlightInertia) {
+		if (FlightHelper.isFlyingCreativeOrSpectator(player) && getConfig().disableFlightInertia) {
 			ClientInput input = player.input;
 			
 			if (input.forwardImpulse == 0F && input.leftImpulse == 0F) {
@@ -242,7 +236,7 @@ public final class PlayerTicker {
 		}
 		
 		if (player.isCreative()) {
-			if (cfg().keyToggleFlight.consumeClick()) {
+			if (getConfig().keyToggleFlight.consumeClick()) {
 				boolean isFlying = !player.getAbilities().flying;
 				
 				player.getAbilities().flying = isFlying;
@@ -267,27 +261,27 @@ public final class PlayerTicker {
 			temporaryFlyOnGroundTimer = 0;
 		}
 		
-		if (!cfg().sneakingMovesCameraSmoothly) {
+		if (!getConfig().sneakingMovesCameraSmoothly) {
 			Camera camera = MINECRAFT.gameRenderer.getMainCamera();
 			
 			if (camera.getEntity() == player) {
-				((AccessCameraFields)camera).setEyeHeight(player.getEyeHeight());
+				Mixins.cameraFields(camera).setEyeHeight(player.getEyeHeight());
 			}
 		}
 		
-		if (cfg().keyResetAllToggles.consumeClick()) {
+		if (getConfig().keyResetAllToggles.consumeClick()) {
 			toggleSprint.reset();
 			toggleSneak.reset();
 			toggleWalkForward.reset();
 			toggleJump.reset();
 		}
 		
-		if (cfg().keyOpenMenu.isDown()) {
+		if (getConfig().keyOpenMenu.isDown()) {
 			MINECRAFT.setScreen(new BetterControlsScreen(null));
 		}
 	}
 	
-	public boolean shouldResetFOV(LocalPlayer player) {
-		return cfg().disableChangingFovWhileFlying && FlightHelper.isFlyingCreativeOrSpectator(player);
+	public static boolean shouldResetFOV(LocalPlayer player) {
+		return getConfig().disableChangingFovWhileFlying && FlightHelper.isFlyingCreativeOrSpectator(player);
 	}
 }
diff --git a/src/main/resources/bettercontrols.mixins.json b/src/main/resources/bettercontrols.mixins.json
index 42e43fb..db0b3e6 100644
--- a/src/main/resources/bettercontrols.mixins.json
+++ b/src/main/resources/bettercontrols.mixins.json
@@ -7,9 +7,9 @@
   "client": [
     "AccessCameraFields",
     "AccessClientPlayerFields",
-    "AccessKeyBindingFields",
+    "AccessKeyMappingFields",
     "AccessPlayerFields",
-    "AccessStickyKeyBindingStateGetter",
+    "AccessToggleKeyMappingFields",
     "HookClientPlayerFOV",
     "HookClientPlayerInputTick",
     "HookClientPlayerTick",