diff --git a/src/doom/d_main.c b/src/doom/d_main.c
index 65a39a10..3f799b0f 100644
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -483,6 +483,8 @@ void D_DoomLoop (void)
 //  DEMO LOOP
 //
 int             demosequence;
+int             demoloopi;
+char            demoloopname[9];
 int             pagetic;
 char                    *pagename;
 
@@ -524,6 +526,8 @@ void D_AdvanceDemo (void)
 //
 void D_DoAdvanceDemo (void)
 {
+    int havedemo4;
+
     players[consoleplayer].playerstate = PST_LIVE;  // not reborn
     advancedemo = false;
     usergame = false;               // no save / end game here
@@ -539,10 +543,14 @@ void D_DoAdvanceDemo (void)
     // However! There is an alternate version of Final Doom that
     // includes a fixed executable.
 
-    if (gameversion == exe_ultimate || gameversion == exe_final)
+    havedemo4 = gameversion == exe_ultimate || gameversion == exe_final;
+    if (havedemo4)
       demosequence = (demosequence+1)%7;
     else
       demosequence = (demosequence+1)%6;
+
+    if (demoloopi < 0 || demoloopi > (havedemo4 ? 3 : 2))
+      I_Error("Invalid demo loop start %d", demoloopi);
     
     switch (demosequence)
     {
@@ -558,17 +566,11 @@ void D_DoAdvanceDemo (void)
 	else
 	  S_StartMusic (mus_intro);
 	break;
-      case 1:
-	G_DeferedPlayDemo(DEH_String("demo1"));
-	break;
       case 2:
 	pagetic = 200;
 	gamestate = GS_DEMOSCREEN;
 	pagename = DEH_String("CREDIT");
 	break;
-      case 3:
-	G_DeferedPlayDemo(DEH_String("demo2"));
-	break;
       case 4:
 	gamestate = GS_DEMOSCREEN;
 	if ( gamemode == commercial)
@@ -587,12 +589,14 @@ void D_DoAdvanceDemo (void)
 	      pagename = DEH_String("HELP2");
 	}
 	break;
+      case 1:
+      case 3:
       case 5:
-	G_DeferedPlayDemo(DEH_String("demo3"));
-	break;
         // THE DEFINITIVE DOOM Special Edition demo
       case 6:
-	G_DeferedPlayDemo(DEH_String("demo4"));
+	DEH_snprintf(demoloopname, 9, "demo%d", demoloopi + 1);
+	G_DeferedPlayDemo(demoloopname);
+	demoloopi = (demoloopi+1) % (havedemo4 ? 4 : 3);
 	break;
     }
 
@@ -1891,7 +1895,15 @@ void D_DoomMain (void)
 	G_TimeDemo (demolumpname);
 	D_DoomLoop ();  // never returns
     }
-	
+
+    p = M_CheckParmWithArgs("-demoloopi", 1);
+    if (p)
+    {
+        demoloopi = atoi(myargv[p+1]);
+    } else {
+        demoloopi = 0;
+    }
+
     if (startloadgame >= 0)
     {
         M_StringCopy(file, P_SaveGameFile(startloadgame), sizeof(file));