diff --git a/src/p_tick.c b/src/p_tick.c
index 16fb069bf419d55702ee995f2279f4b0c9301735..fcc09ea6ef5830fd6aa0d69d5d13d08b64e6cc46 100644
--- a/src/p_tick.c
+++ b/src/p_tick.c
@@ -23,6 +23,7 @@
 #include "lua_script.h"
 #include "lua_hook.h"
 #include "k_kart.h"
+#include "r_main.h"
 #include "r_fps.h"
 
 // Object place
@@ -813,6 +814,20 @@ void P_Ticker(boolean run)
 	{
 		R_UpdateLevelInterpolators();
 		R_UpdateViewInterpolation();
+
+		// Hack: ensure newview is assigned every tic.
+		// Ensures view interpolation is T-1 to T in poor network conditions
+		// We need a better way to assign view state decoupled from game logic
+		for (i = 0; i <= splitscreen; i++)
+		{
+			player_t *player = &players[displayplayers[i]];
+			BOOL skyVisible = skyVisiblePerPlayer[i];
+			if (skyVisible && skyboxmo[0] && cv_skybox.value)
+			{
+				R_SkyboxFrame(player);
+			}
+			R_SetupFrame(player, (skyboxmo[0] && cv_skybox.value));
+		}
 	}
 
 	P_MapEnd();