diff --git a/src/d_player.h b/src/d_player.h
index 90370c79687539faf4df84c4ed47bb9171fcc72d..7b542d7abb642f1c173683bc980ddbcb6a70823b 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -370,6 +370,7 @@ typedef struct player_s
 	//fixed_t bob;
 
 	angle_t viewrollangle;
+	angle_t tilt;
 
 	// Mouse aiming, where the guy is looking at!
 	// It is updated with cmd->aiming.
diff --git a/src/p_user.c b/src/p_user.c
index 94c5e5cd5cf35d92922ba3fc6a56d6a6e8213f0a..c222fed7fccab9ab6622f30c618c20c8705d96a0 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -8303,12 +8303,26 @@ DoABarrelRoll (player_t *player)
 
 	slope -= Quaketilt(player);
 
-	delta = (INT32)( slope - player->viewrollangle )/ 32;
+	delta = (INT32)( slope - player->tilt )/ 32;
 
 	if (delta)
-		player->viewrollangle += delta;
+		player->tilt += delta;
 	else
-		player->viewrollangle  = slope;
+		player->tilt  = slope;
+
+	if (cv_tilting.value)
+	{
+		player->viewrollangle = player->tilt;
+
+		if (cv_actionmovie.value)
+		{
+			player->viewrollangle += quake.roll;
+		}
+	}
+	else
+	{
+		player->viewrollangle = 0;
+	}
 }
 
 //
@@ -8860,14 +8874,7 @@ void P_PlayerThink(player_t *player)
 
 	K_KartPlayerThink(player, cmd); // SRB2kart
 
-	if (cv_tilting.value)
-	{
-		DoABarrelRoll(player);
-	}
-	else
-	{
-		player->viewrollangle = 0;
-	}
+	DoABarrelRoll(player);
 
 /*
 //	Colormap verification
diff --git a/src/r_main.c b/src/r_main.c
index c764d5d43e915bdda844c351c48900f314471daf..eee1be27fda422a5f31ec6829e08953ebbdcf3b2 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -671,9 +671,6 @@ void R_CheckViewMorph(void)
 	fixed_t fisheye = cv_cam2_turnmultiplier.value; // temporary test value
 #endif
 
-	if (cv_actionmovie.value)
-		rollangle += quake.roll;
-
 	rollangle >>= ANGLETOFINESHIFT;
 	rollangle = ((rollangle+2) & ~3) & FINEMASK; // Limit the distinct number of angles to reduce recalcs from angles changing a lot.