diff --git a/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java
new file mode 100644
index 0000000..03170d5
--- /dev/null
+++ b/src/main/java/chylex/bettercontrols/mixin/HookClientPlayerVerticalFlightSpeed.java
@@ -0,0 +1,36 @@
+package chylex.bettercontrols.mixin;
+
+import chylex.bettercontrols.player.FlightHelper;
+import net.minecraft.client.player.LocalPlayer;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.LivingEntity;
+import net.minecraft.world.entity.player.Abilities;
+import net.minecraft.world.level.Level;
+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;
+
+@SuppressWarnings("SameReturnValue")
+@Mixin(LocalPlayer.class)
+public abstract class HookClientPlayerVerticalFlightSpeed extends LivingEntity {
+	protected HookClientPlayerVerticalFlightSpeed(final EntityType<? extends LivingEntity> type, final Level world) {
+		super(type, world);
+	}
+	
+	@Redirect(
+		method = "aiStep",
+		at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getFlyingSpeed()F"),
+		slice = @Slice(
+			from = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/player/Abilities;flying:Z"),
+			to = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;setDeltaMovement(Lnet/minecraft/world/phys/Vec3;)V")
+		)
+	)
+	private float modifyVerticalFlightSpeed(final Abilities abilities) {
+		@SuppressWarnings("ConstantConditions")
+		final LocalPlayer me = (LocalPlayer)(Object)this;
+		
+		final float multiplier = 1F + FlightHelper.getVerticalSpeedBoost(me);
+		return abilities.getFlyingSpeed() * multiplier;
+	}
+}
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookPlayerFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookPlayerFlightSpeed.java
deleted file mode 100644
index e8dab90..0000000
--- a/src/main/java/chylex/bettercontrols/mixin/HookPlayerFlightSpeed.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package chylex.bettercontrols.mixin;
-
-import net.minecraft.world.entity.EntityType;
-import net.minecraft.world.entity.LivingEntity;
-import net.minecraft.world.entity.player.Player;
-import net.minecraft.world.level.Level;
-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;
-
-@SuppressWarnings("SameReturnValue")
-@Mixin(Player.class)
-public abstract class HookPlayerFlightSpeed extends LivingEntity {
-	protected HookPlayerFlightSpeed(final EntityType<? extends LivingEntity> type, final Level world) {
-		super(type, world);
-	}
-	
-	@Redirect(
-		method = "getFlyingSpeed",
-		at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;isSprinting()Z"),
-		slice = @Slice(
-			from = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/player/Abilities;flying:Z"),
-			to = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getFlyingSpeed()F")
-		)
-	)
-	private boolean disableVanillaSprintBoost(final Player player) {
-		return false;
-	}
-}
diff --git a/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java b/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java
new file mode 100644
index 0000000..963a6b2
--- /dev/null
+++ b/src/main/java/chylex/bettercontrols/mixin/HookPlayerHorizontalFlightSpeed.java
@@ -0,0 +1,51 @@
+package chylex.bettercontrols.mixin;
+
+import chylex.bettercontrols.player.FlightHelper;
+import net.minecraft.client.player.LocalPlayer;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.LivingEntity;
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.level.Level;
+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.Redirect;
+import org.spongepowered.asm.mixin.injection.Slice;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+@SuppressWarnings("SameReturnValue")
+@Mixin(Player.class)
+public abstract class HookPlayerHorizontalFlightSpeed extends LivingEntity {
+	protected HookPlayerHorizontalFlightSpeed(final EntityType<? extends LivingEntity> type, final Level world) {
+		super(type, world);
+	}
+	
+	@SuppressWarnings("SimplifiableIfStatement")
+	@Redirect(
+		method = "getFlyingSpeed",
+		at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;isSprinting()Z"),
+		slice = @Slice(
+			from = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/player/Abilities;flying:Z"),
+			to = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Abilities;getFlyingSpeed()F")
+		)
+	)
+	private boolean disableVanillaSprintBoost(final Player player) {
+		if (player instanceof LocalPlayer) {
+			return false;
+		}
+		else {
+			return player.isSprinting();
+		}
+	}
+	
+	@Inject(method = "getFlyingSpeed", at = @At("RETURN"), cancellable = true)
+	private void modifyHorizontalFlyingSpeed(final CallbackInfoReturnable<Float> cir) {
+		@SuppressWarnings("ConstantConditions")
+		final Player me = (Player)(Object)this;
+		
+		if (me instanceof final LocalPlayer localPlayer) {
+			final float multiplier = FlightHelper.getHorizontalSpeedMultiplier(localPlayer);
+			cir.setReturnValue(Float.valueOf(cir.getReturnValueF() * multiplier));
+		}
+	}
+}
diff --git a/src/main/java/chylex/bettercontrols/player/FlightHelper.java b/src/main/java/chylex/bettercontrols/player/FlightHelper.java
index 8f9680a..e8e4843 100644
--- a/src/main/java/chylex/bettercontrols/player/FlightHelper.java
+++ b/src/main/java/chylex/bettercontrols/player/FlightHelper.java
@@ -2,13 +2,18 @@ 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;
 
-final class FlightHelper {
+public final class FlightHelper {
 	private FlightHelper() {}
 	
-	private static final float BASE_FLIGHT_SPEED = 0.05F;
-	private static final float BASE_VERTICAL_VELOCITY = 3F;
+	private static final KeyMapping KEY_SPRINT = Minecraft.getInstance().options.keySprint;
+	
+	private static boolean isSprinting() {
+		return KEY_SPRINT.isDown();
+	}
 	
 	private static BetterControlsConfig cfg() {
 		return BetterControlsCommon.getConfig();
@@ -22,44 +27,24 @@ final class FlightHelper {
 		return cfg().flyOnGroundInCreative && player.isCreative() && player.getAbilities().flying;
 	}
 	
-	static float getFlightSpeed(final LocalPlayer player, final boolean boost) {
+	public static float getHorizontalSpeedMultiplier(final LocalPlayer player) {
 		if (player.isCreative()) {
-			if (boost) {
-				return BASE_FLIGHT_SPEED * cfg().flightSpeedMpCreativeSprinting;
-			}
-			else {
-				return BASE_FLIGHT_SPEED * cfg().flightSpeedMpCreativeDefault;
-			}
+			return isSprinting() ? cfg().flightSpeedMpCreativeSprinting : cfg().flightSpeedMpCreativeDefault;
 		}
 		else if (player.isSpectator()) {
-			if (boost) {
-				return BASE_FLIGHT_SPEED * cfg().flightSpeedMpSpectatorSprinting;
-			}
-			else {
-				return BASE_FLIGHT_SPEED * cfg().flightSpeedMpSpectatorDefault;
-			}
+			return isSprinting() ? cfg().flightSpeedMpSpectatorSprinting : cfg().flightSpeedMpSpectatorDefault;
 		}
 		else {
-			return 0F;
+			return 1F;
 		}
 	}
 	
-	static float getExtraVerticalVelocity(final LocalPlayer player, final boolean isSprinting) {
+	public static float getVerticalSpeedBoost(final LocalPlayer player) {
 		if (player.isCreative()) {
-			if (isSprinting) {
-				return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostCreativeSprinting;
-			}
-			else {
-				return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostCreativeDefault;
-			}
+			return isSprinting() ? cfg().flightVerticalBoostCreativeSprinting : cfg().flightVerticalBoostCreativeDefault;
 		}
 		else if (player.isSpectator()) {
-			if (isSprinting) {
-				return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostSpectatorSprinting;
-			}
-			else {
-				return BASE_VERTICAL_VELOCITY * cfg().flightVerticalBoostSpectatorDefault;
-			}
+			return isSprinting() ? cfg().flightVerticalBoostSpectatorSprinting : cfg().flightVerticalBoostSpectatorDefault;
 		}
 		else {
 			return 0F;
diff --git a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
index 359f1a5..05e5bd8 100644
--- a/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
+++ b/src/main/java/chylex/bettercontrols/player/PlayerTicker.java
@@ -163,32 +163,6 @@ public final class PlayerTicker {
 			input.jumping |= toggleJump.tick();
 		}
 		
-		if (FlightHelper.isFlyingCreativeOrSpectator(player)) {
-			final boolean boost = KEY_SPRINT.isDown();
-			final float flightSpeed = FlightHelper.getFlightSpeed(player, boost);
-			final float verticalVelocity = FlightHelper.getExtraVerticalVelocity(player, boost);
-			
-			if (flightSpeed > 0F) {
-				player.getAbilities().setFlyingSpeed(flightSpeed);
-			}
-			
-			if (Math.abs(verticalVelocity) > 1E-5F && player == MINECRAFT.getCameraEntity()) {
-				int direction = 0;
-				
-				if (input.shiftKeyDown) {
-					--direction;
-				}
-				
-				if (input.jumping) {
-					++direction;
-				}
-				
-				if (direction != 0) {
-					player.setDeltaMovement(player.getDeltaMovement().add(0D, flightSpeed * verticalVelocity * direction, 0D));
-				}
-			}
-		}
-		
 		if (cfg().resumeSprintingAfterHittingObstacle) {
 			if (wasHittingObstacle != player.horizontalCollision) {
 				if (!wasHittingObstacle) {
diff --git a/src/main/resources/bettercontrols.mixins.json b/src/main/resources/bettercontrols.mixins.json
index c0ec713..3ee539c 100644
--- a/src/main/resources/bettercontrols.mixins.json
+++ b/src/main/resources/bettercontrols.mixins.json
@@ -13,10 +13,11 @@
     "HookClientPlayerFOV",
     "HookClientPlayerInputTick",
     "HookClientPlayerTick",
+    "HookClientPlayerVerticalFlightSpeed",
     "HookControlsListWidget",
     "HookControlsScreen",
     "HookLoadGameOptions",
-    "HookPlayerFlightSpeed",
+    "HookPlayerHorizontalFlightSpeed",
     "HookStickyKeyBindingState",
     "HookToggleOptionButtons"
   ],