diff --git a/src/g_demo.c b/src/g_demo.c
index a7b9098fa53a428d6aca9d245b8f71d489a0d9d3..adb8e891d6de6dfc56fd8219d040939d3069f6eb 100644
--- a/src/g_demo.c
+++ b/src/g_demo.c
@@ -58,6 +58,7 @@ static UINT8 demoflags;
 static UINT16 demoversion;
 boolean singledemo; // quit after playing a demo from cmdline
 boolean demo_start; // don't start playing demo right away
+boolean demo_forwardmove_rng; // old demo backwards compatibility
 boolean demosynced = true; // console warning message
 
 boolean metalrecording; // recording as metal sonic
@@ -2028,6 +2029,7 @@ void G_DoPlayDemo(char *defdemoname)
 	version = READUINT8(demo_p);
 	subversion = READUINT8(demo_p);
 	demoversion = READUINT16(demo_p);
+	demo_forwardmove_rng = (demoversion < 0x0010);
 	switch(demoversion)
 	{
 	case 0x000f:
@@ -2339,6 +2341,7 @@ UINT8 G_CheckDemoForError(char *defdemoname)
 	demo_p++; // version
 	demo_p++; // subversion
 	demoversion = READUINT16(demo_p);
+	demo_forwardmove_rng = (demoversion < 0x0010);
 	switch(demoversion)
 	{
 	case 0x000d:
diff --git a/src/g_demo.h b/src/g_demo.h
index 383d2719b3bb064df3f4575363bacc37041b5db8..379c57428a6db9daeef1b5d6ab6368436224c828 100644
--- a/src/g_demo.h
+++ b/src/g_demo.h
@@ -38,6 +38,7 @@ extern demo_file_override_e demofileoverride;
 // Quit after playing a demo from cmdline.
 extern boolean singledemo;
 extern boolean demo_start;
+extern boolean demo_forwardmove_rng;
 extern boolean demosynced;
 
 extern mobj_t *metalplayback;
diff --git a/src/p_user.c b/src/p_user.c
index 889e887c14ea2e28898896118b951782312965c8..1c2e4f7c9b3633bad5311cff594c1b97e814d070 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -11623,9 +11623,12 @@ void P_PlayerThink(player_t *player)
 
 	cmd = &player->cmd;
 
-	// Add some extra randomization.
-	if (cmd->forwardmove)
-		P_RandomFixed();
+	if (demoplayback && demo_forwardmove_rng)
+	{
+		// Smelly demo backwards compatibility
+		if (cmd->forwardmove)
+			P_RandomFixed();
+	}
 
 #ifdef PARANOIA
 	if (player->playerstate == PST_REBORN)