diff --git a/src/d_player.h b/src/d_player.h
index 0111083d0461bb8ca72bef21b7d6e20e05aef35c..d27627744c6e9bae6633ffdf5821712f462a8edd 100644
--- a/src/d_player.h
+++ b/src/d_player.h
@@ -383,6 +383,7 @@ typedef struct player_s
 	// fun thing for player sprite
 	angle_t drawangle;
 	angle_t old_drawangle;
+	angle_t old_drawangle2;
 
 	// player's ring count
 	INT16 rings;
diff --git a/src/p_mobj.h b/src/p_mobj.h
index e4c57beecb8302984b5e136c37fcb48398d10e36..7e3c30dcda8fc3e4beb92ad7e4c6935cc803e149 100644
--- a/src/p_mobj.h
+++ b/src/p_mobj.h
@@ -280,6 +280,7 @@ typedef struct mobj_s
 	// Info for drawing: position.
 	fixed_t x, y, z;
 	fixed_t old_x, old_y, old_z; // position interpolation
+	fixed_t old_x2, old_y2, old_z2;
 
 	// More list: links in sector (if needed)
 	struct mobj_s *snext;
@@ -288,6 +289,7 @@ typedef struct mobj_s
 	// More drawing info: to determine current sprite.
 	angle_t angle, pitch, roll; // orientation
 	angle_t old_angle, old_pitch, old_roll; // orientation interpolation
+	angle_t old_angle2, old_pitch2, old_roll2;
 	angle_t rollangle;
 	spritenum_t sprite; // used to find patch_t and flip value
 	UINT32 frame; // frame number, plus bits see p_pspr.h
@@ -409,6 +411,7 @@ typedef struct precipmobj_s
 	// Info for drawing: position.
 	fixed_t x, y, z;
 	fixed_t old_x, old_y, old_z; // position interpolation
+	fixed_t old_x2, old_y2, old_z2;
 
 	// More list: links in sector (if needed)
 	struct precipmobj_s *snext;
@@ -417,6 +420,7 @@ typedef struct precipmobj_s
 	// More drawing info: to determine current sprite.
 	angle_t angle, pitch, roll; // orientation
 	angle_t old_angle, old_pitch, old_roll; // orientation interpolation
+	angle_t old_angle2, old_pitch2, old_roll2;
 	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/p_user.c b/src/p_user.c
index aeab40b753908c00df1a86e82eb896c732ee9dbb..d11e83140df9a80e992c85a155ab715605c72c57 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -2074,6 +2074,14 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
 		ghost2->flags2 |= (mobj->player->followmobj->flags2 & MF2_LINKDRAW);
 	}
 
+	// Copy interpolation data :)
+	ghost->old_x = mobj->old_x2;
+	ghost->old_y = mobj->old_y2;
+	ghost->old_z = mobj->old_z2;
+	ghost->old_angle = (mobj->player ? mobj->player->old_drawangle2 : mobj->old_angle2);
+	ghost->old_pitch = mobj->old_pitch2;
+	ghost->old_roll = mobj->old_roll2;
+
 	return ghost;
 }
 
diff --git a/src/r_fps.c b/src/r_fps.c
index c4f69415c1176d366f92f4605369c85b3dd7598e..1bc92c6227f1efcb1097043000495ca5f33e462e 100644
--- a/src/r_fps.c
+++ b/src/r_fps.c
@@ -687,6 +687,12 @@ void R_UpdateMobjInterpolators(void)
 //
 void R_ResetMobjInterpolationState(mobj_t *mobj)
 {
+	mobj->old_x2 = mobj->old_x;
+	mobj->old_y2 = mobj->old_y;
+	mobj->old_z2 = mobj->old_z;
+	mobj->old_angle2 = mobj->old_angle;
+	mobj->old_pitch2 = mobj->old_pitch;
+	mobj->old_roll2 = mobj->old_roll;
 	mobj->old_x = mobj->x;
 	mobj->old_y = mobj->y;
 	mobj->old_z = mobj->z;
@@ -696,6 +702,7 @@ void R_ResetMobjInterpolationState(mobj_t *mobj)
 
 	if (mobj->player)
 	{
+		mobj->player->old_drawangle2 = mobj->player->old_drawangle;
 		mobj->player->old_drawangle = mobj->player->drawangle;
 	}
 }
@@ -707,6 +714,12 @@ void R_ResetMobjInterpolationState(mobj_t *mobj)
 //
 void R_ResetPrecipitationMobjInterpolationState(precipmobj_t *mobj)
 {
+	mobj->old_x2 = mobj->old_x;
+	mobj->old_y2 = mobj->old_y;
+	mobj->old_z2 = mobj->old_z;
+	mobj->old_angle2 = mobj->old_angle;
+	mobj->old_pitch2 = mobj->old_pitch;
+	mobj->old_roll2 = mobj->old_roll;
 	mobj->old_x = mobj->x;
 	mobj->old_y = mobj->y;
 	mobj->old_z = mobj->z;