diff --git a/src/p_user.c b/src/p_user.c
index 28646d0caa00e9c9d883aa52b8f62ab283a33d7b..002a6fda0e04f35bc2b20e71c0443f576fa1c47a 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -5028,18 +5028,20 @@ static void P_3dMovement(player_t *player)
 	{
 		movepushforward = cmd->forwardmove * (thrustfactor * acceleration);
 
-		// allow very small movement while in air for gameplay
-		if (!onground)
-			movepushforward >>= 2; // proper air movement
 		// Allow a bit of movement while spinning
-		else if (player->pflags & PF_SPINNING)
+		if (player->pflags & PF_SPINNING)
 		{
 			if ((mforward && cmd->forwardmove > 0) || (mbackward && cmd->forwardmove < 0)
 			|| (player->pflags & PF_STARTDASH))
 				movepushforward = 0;
-			else
+			else if (onground)
 				movepushforward >>= 4;
+			else
+				movepushforward >>= 3;
 		}
+		// allow very small movement while in air for gameplay
+		else if (!onground)
+			movepushforward >>= 2; // proper air movement
 
 		movepushforward = FixedMul(movepushforward, player->mo->scale);
 
@@ -5067,18 +5069,20 @@ static void P_3dMovement(player_t *player)
 
 			movepushforward = max(abs(cmd->sidemove), abs(cmd->forwardmove)) * (thrustfactor * acceleration);
 
-			// allow very small movement while in air for gameplay
-			if (!onground)
-				movepushforward >>= 2; // proper air movement
 			// Allow a bit of movement while spinning
-			else if (player->pflags & PF_SPINNING)
+			if (player->pflags & PF_SPINNING)
 			{
 				if ((mforward && cmd->forwardmove > 0) || (mbackward && cmd->forwardmove < 0)
 				|| (player->pflags & PF_STARTDASH))
 					movepushforward = 0;
-				else
+				else if (onground)
 					movepushforward >>= 4;
+				else
+					movepushforward >>= 3;
 			}
+			// allow very small movement while in air for gameplay
+			else if (!onground)
+				movepushforward >>= 2; // proper air movement
 
 			movepushsideangle = controldirection;
 
@@ -5096,25 +5100,26 @@ static void P_3dMovement(player_t *player)
 	{
 		movepushside = cmd->sidemove * (thrustfactor * acceleration);
 
+		// allow very small movement while in air for gameplay
 		if (!onground)
 		{
-			movepushside >>= 2;
-
+			movepushside >>= 2; // proper air movement
 			// Reduce movepushslide even more if over "max" flight speed
-			if (player->powers[pw_tailsfly] && player->speed > topspeed)
+			if ((player->pflags & PF_SPINNING) || (player->powers[pw_tailsfly] && player->speed > topspeed))
 				movepushside >>= 2;
 		}
-
 		// Allow a bit of movement while spinning
-		if (player->pflags & PF_SPINNING)
+		else if (player->pflags & PF_SPINNING)
 		{
-			if ((player->pflags & PF_STARTDASH))
+			if (player->pflags & PF_STARTDASH)
 				movepushside = 0;
+			else if (onground)
+				movepushside >>= 4;
 			else
-				movepushside = FixedDiv(movepushside,16*FRACUNIT);
+				movepushside >>= 3;
 		}
 
-		// Finally move the player now that his speed/direction has been decided.
+		// Finally move the player now that their speed/direction has been decided.
 		movepushside = FixedMul(movepushside, player->mo->scale);
 
 #ifdef ESLOPE