diff --git a/src/p_mobj.c b/src/p_mobj.c
index 0ec069471c6f0b92341f08ba5ae76e39835b6f44..a20f5e1c3ef1fd0a73223351ea502aee234fb8ad 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -892,6 +892,30 @@ void P_EmeraldManager(void)
 	emeraldspawndelay = 0;
 }
 
+//
+// P_ResetInterpolationState
+//
+// Reset the rendering interpolation state of the mobj.
+//
+void P_ResetInterpolationState(mobj_t *mobj)
+{
+	mobj->old_x = mobj->x;
+	mobj->old_y = mobj->y;
+	mobj->old_z = mobj->z;
+}
+
+//
+// P_ResetPrecipitationInterpolationState
+//
+// Reset the rendering interpolation state of the precipmobj.
+//
+void P_ResetPrecipitationInterpolationState(precipmobj_t *mobj)
+{
+	mobj->old_x = mobj->x;
+	mobj->old_y = mobj->y;
+	mobj->old_z = mobj->z;
+}
+
 //
 // P_ExplodeMissile
 //
@@ -4026,10 +4050,7 @@ void P_NullPrecipThinker(precipmobj_t *mobj)
 
 void P_SnowThinker(precipmobj_t *mobj)
 {
-	// reset old state (for interpolation)
-	mobj->old_x = mobj->x;
-	mobj->old_y = mobj->y;
-	mobj->old_z = mobj->z;
+	P_ResetPrecipitationInterpolationState(mobj);
 
 	P_CycleStateAnimation((mobj_t *)mobj);
 
@@ -4040,10 +4061,7 @@ void P_SnowThinker(precipmobj_t *mobj)
 
 void P_RainThinker(precipmobj_t *mobj)
 {
-	// reset old state (for interpolation)
-	mobj->old_x = mobj->x;
-	mobj->old_y = mobj->y;
-	mobj->old_z = mobj->z;
+	P_ResetPrecipitationInterpolationState(mobj);
 
 	P_CycleStateAnimation((mobj_t *)mobj);
 
@@ -10041,10 +10059,7 @@ void P_MobjThinker(mobj_t *mobj)
 	I_Assert(mobj != NULL);
 	I_Assert(!P_MobjWasRemoved(mobj));
 
-	// Set old position (for interpolation)
-	mobj->old_x = mobj->x;
-	mobj->old_y = mobj->y;
-	mobj->old_z = mobj->z;
+	P_ResetInterpolationState(mobj);
 
 	if (mobj->flags & MF_NOTHINK)
 		return;
@@ -10911,10 +10926,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
 	if (CheckForReverseGravity && !(mobj->flags & MF_NOBLOCKMAP))
 		P_CheckGravity(mobj, false);
 
-	// set old state too (for interpolation)
-	mobj->old_x = mobj->x;
-	mobj->old_y = mobj->y;
-	mobj->old_z = mobj->z;
+	P_ResetInterpolationState(mobj);
 
 	return mobj;
 }
@@ -10963,10 +10975,7 @@ static precipmobj_t *P_SpawnPrecipMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype
 	 || mobj->subsector->sector->floorpic == skyflatnum)
 		mobj->precipflags |= PCF_PIT;
 
-	// set initial old positions (for interpolation)
-	mobj->old_x = mobj->x;
-	mobj->old_y = mobj->y;
-	mobj->old_z = mobj->z;
+	P_ResetPrecipitationInterpolationState(mobj);
 
 	return mobj;
 }
diff --git a/src/p_mobj.h b/src/p_mobj.h
index 702fd40474411cd7fe8e0dc0523d532918d99f0a..7f2736801f4a5c3599a6dc874928bce7c70606ad 100644
--- a/src/p_mobj.h
+++ b/src/p_mobj.h
@@ -501,6 +501,8 @@ void P_RingZMovement(mobj_t *mo);
 boolean P_SceneryZMovement(mobj_t *mo);
 void P_PlayerZMovement(mobj_t *mo);
 void P_EmeraldManager(void);
+void P_ResetInterpolationState(mobj_t *mobj);
+void P_ResetPrecipitationInterpolationState(precipmobj_t *mobj);
 
 extern INT32 modulothing;