diff --git a/src/d_clisrv.c b/src/d_clisrv.c
index ac8bba608288063b7b34dff533f9d2ef0e9c84e2..2972502a7b7b273003ec3efda9a7ee5bf1296893 100644
--- a/src/d_clisrv.c
+++ b/src/d_clisrv.c
@@ -5206,8 +5206,10 @@ static void SV_Maketic(void)
 	maketic++;
 }
 
-void TryRunTics(tic_t realtics)
+boolean TryRunTics(tic_t realtics)
 {
+	boolean ticking;
+
 	// the machine has lagged but it is not so bad
 	if (realtics > TICRATE/7) // FIXME: consistency failure!!
 	{
@@ -5251,10 +5253,14 @@ void TryRunTics(tic_t realtics)
 	}
 #endif
 
+	ticking = neededtic > gametic;
+
 	if (player_joining)
-		return;
+	{
+		return false;
+	}
 
-	if (neededtic > gametic)
+	if (ticking)
 	{
 		if (advancedemo)
 		{
@@ -5290,6 +5296,8 @@ void TryRunTics(tic_t realtics)
 					break;
 			}
 	}
+
+	return ticking;
 }
 
 /*
diff --git a/src/d_clisrv.h b/src/d_clisrv.h
index bf3f0b64f5126eca92510a07686e10afbd07cba7..c75f7f0bf4007cbfbd3859c1517303cd06c2d7dd 100644
--- a/src/d_clisrv.h
+++ b/src/d_clisrv.h
@@ -430,7 +430,7 @@ boolean Playing(void);
 void D_QuitNetGame(void);
 
 //? How many ticks to run?
-void TryRunTics(tic_t realtic);
+boolean TryRunTics(tic_t realtic);
 
 // extra data for lmps
 // these functions scare me. they contain magic.
diff --git a/src/d_main.c b/src/d_main.c
index 963439d663398b33ad2f5984e549fc545439feb5..1559133208c606f1d6664e1a43f345739fd12db9 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -697,6 +697,7 @@ void D_SRB2Loop(void)
 {
 	tic_t oldentertics = 0, entertic = 0, realtics = 0, rendertimeout = INFTICS;
 	static lumpnum_t gstartuplumpnum;
+	boolean ticked;
 
 	if (dedicated)
 		server = true;
@@ -783,11 +784,20 @@ void D_SRB2Loop(void)
 			realtics = 1;
 
 		// process tics (but maybe not if realtic == 0)
-		TryRunTics(realtics);
+		ticked = TryRunTics(realtics);
 
-		if (cv_frameinterpolation.value == 1)
+		if (cv_frameinterpolation.value == 1 && !(paused || P_AutoPause()))
 		{
-			fixed_t entertimefrac = I_GetTimeFrac();
+			static float tictime;
+			float entertime = I_GetTimeFrac();
+
+			fixed_t entertimefrac;
+
+			if (ticked)
+				tictime = entertime;
+
+			entertimefrac = FLOAT_TO_FIXED(entertime - tictime);
+
 			// renderdeltatics is a bit awkard to evaluate, since the system time interface is whole tic-based
 			renderdeltatics = realtics * FRACUNIT;
 			if (entertimefrac > rendertimefrac)
diff --git a/src/i_system.h b/src/i_system.h
index 0cdc7db855688c919816a907e718a5bc81e15b2c..93bb34a2155ab06df407e3d336ec69c99b2971d5 100644
--- a/src/i_system.h
+++ b/src/i_system.h
@@ -46,9 +46,9 @@ UINT32 I_GetFreeMem(UINT32 *total);
 */
 tic_t I_GetTime(void);
 
-/** \brief  Get the current time as a fraction of a tic since the last tic.
+/** \brief  Get the current time in tics including fractions.
 */
-fixed_t I_GetTimeFrac(void);
+float I_GetTimeFrac(void);
 
 /**	\brief	Returns precise time value for performance measurement.
   */
diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c
index 2d99f5c1fcbecb8dc15225dbbec935fd5a71cd1d..bf2e42cfd83a00a8822a710628081c4d609d9e7f 100644
--- a/src/sdl/i_system.c
+++ b/src/sdl/i_system.c
@@ -2160,11 +2160,10 @@ tic_t I_GetTime(void)
 	return (tic_t) floor(elapsed_tics);
 }
 
-fixed_t I_GetTimeFrac(void)
+float I_GetTimeFrac(void)
 {
 	UpdateElapsedTics();
-	
-	return FLOAT_TO_FIXED((float) (elapsed_tics - floor(elapsed_tics)));
+	return elapsed_tics;
 }
 
 precise_t I_GetPreciseTime(void)