diff --git a/src/d_player.h b/src/d_player.h
index 755926480ae9c2b2b90383659ec079230e48a881..0111083d0461bb8ca72bef21b7d6e20e05aef35c 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -382,6 +382,7 @@ typedef struct player_s
 
 	// fun thing for player sprite
 	angle_t drawangle;
+	angle_t old_drawangle;
 
 	// player's ring count
 	INT16 rings;
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 8c4c18b8226e8017f27ae808db1361c3eb1fe075..9f69af57c6f9ae6f37991e4a6f01d118d46860da 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -902,6 +902,12 @@ void P_ResetInterpolationState(mobj_t *mobj)
 	mobj->old_x = mobj->x;
 	mobj->old_y = mobj->y;
 	mobj->old_z = mobj->z;
+	mobj->old_angle = mobj->angle;
+
+	if (mobj->player)
+	{
+		mobj->player->old_drawangle = mobj->player->drawangle;
+	}
 }
 
 //
@@ -914,6 +920,7 @@ void P_ResetPrecipitationInterpolationState(precipmobj_t *mobj)
 	mobj->old_x = mobj->x;
 	mobj->old_y = mobj->y;
 	mobj->old_z = mobj->z;
+	mobj->old_angle = mobj->angle;
 }
 
 //
diff --git a/src/p_mobj.h b/src/p_mobj.h
index 7f2736801f4a5c3599a6dc874928bce7c70606ad..9975075a1c21ae1862b2c9d43239107f845efb67 100644
--- a/src/p_mobj.h
+++ b/src/p_mobj.h
@@ -287,6 +287,7 @@ typedef struct mobj_s
 
 	// More drawing info: to determine current sprite.
 	angle_t angle, pitch, roll; // orientation
+	angle_t old_angle;
 	angle_t rollangle;
 	spritenum_t sprite; // used to find patch_t and flip value
 	UINT32 frame; // frame number, plus bits see p_pspr.h
@@ -415,6 +416,7 @@ typedef struct precipmobj_s
 
 	// More drawing info: to determine current sprite.
 	angle_t angle, pitch, roll; // orientation
+	angle_t old_angle;
 	angle_t rollangle;
 	spritenum_t sprite; // used to find patch_t and flip value
 	UINT32 frame; // frame number, plus bits see p_pspr.h
diff --git a/src/r_fps.c b/src/r_fps.c
index 559520c5df574643aaf1baccddcd602d85a5c642..819df0325833fd3b9a424f08dc8841f90f8b5454 100644
--- a/src/r_fps.c
+++ b/src/r_fps.c
@@ -185,11 +185,11 @@ void R_InterpolateMobjState(mobj_t *mobj, fixed_t frac, interpmobjstate_t *out)
 
 	if (mobj->player)
 	{
-		out->angle = mobj->player->drawangle;
+		out->angle = R_LerpAngle(mobj->player->old_drawangle, mobj->player->drawangle, frac);
 	}
 	else
 	{
-		out->angle = mobj->angle;
+		out->angle = R_LerpAngle(mobj->old_angle, mobj->angle, frac);
 	}
 }
 
@@ -198,7 +198,7 @@ void R_InterpolatePrecipMobjState(precipmobj_t *mobj, fixed_t frac, interpmobjst
 	out->x = R_LerpFixed(mobj->old_x, mobj->x, frac);
 	out->y = R_LerpFixed(mobj->old_y, mobj->y, frac);
 	out->z = R_LerpFixed(mobj->old_z, mobj->z, frac);
-	out->angle = mobj->angle;
+	out->angle = R_LerpAngle(mobj->old_angle, mobj->angle, frac);
 }
 
 static void AddInterpolator(levelinterpolator_t* interpolator)