diff --git a/src/d_main.c b/src/d_main.c
index 98e16a27722ce6784e60905cde4249ea1f619b3e..a68f9c09c0e3b782b85c8d2655ce4dc6d5b41f01 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -291,8 +291,11 @@ static void D_Display(void)
 	switch (gamestate)
 	{
 		case GS_TITLESCREEN:
-			F_TitleScreenDrawer();
-			break;
+			if (!titlemapinaction || !curbghide) {
+				F_TitleScreenDrawer();
+				break;
+			}
+			/* FALLTHRU */
 		case GS_LEVEL:
 			if (!gametic)
 				break;
@@ -363,11 +366,56 @@ static void D_Display(void)
 
 		// clean up border stuff
 		// see if the border needs to be initially drawn
-		if (gamestate == GS_LEVEL)
+		if (gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction && curbghide && (!hidetitlemap)))
 		{
 			// draw the view directly
 
-			D_Render();
+			if (!automapactive && !dedicated && cv_renderview.value)
+			{
+				if (players[displayplayer].mo || players[displayplayer].playerstate == PST_DEAD)
+				{
+					topleft = screens[0] + viewwindowy*vid.width + viewwindowx;
+					objectsdrawn = 0;
+	#ifdef HWRENDER
+					if (rendermode != render_soft)
+						HWR_RenderPlayerView(0, &players[displayplayer]);
+					else
+	#endif
+					if (rendermode != render_none)
+						R_RenderPlayerView(&players[displayplayer]);
+				}
+
+				// render the second screen
+				if (splitscreen && players[secondarydisplayplayer].mo)
+				{
+	#ifdef HWRENDER
+					if (rendermode != render_soft)
+						HWR_RenderPlayerView(1, &players[secondarydisplayplayer]);
+					else
+	#endif
+					if (rendermode != render_none)
+					{
+						viewwindowy = vid.height / 2;
+						M_Memcpy(ylookup, ylookup2, viewheight*sizeof (ylookup[0]));
+
+						topleft = screens[0] + viewwindowy*vid.width + viewwindowx;
+
+						R_RenderPlayerView(&players[secondarydisplayplayer]);
+
+						viewwindowy = 0;
+						M_Memcpy(ylookup, ylookup1, viewheight*sizeof (ylookup[0]));
+					}
+				}
+
+				// Image postprocessing effect
+				if (rendermode == render_soft)
+				{
+					if (postimgtype)
+						V_DoPostProcessor(0, postimgtype, postimgparam);
+					if (postimgtype2)
+						V_DoPostProcessor(1, postimgtype2, postimgparam2);
+				}
+			}
 
 			if (lastdraw)
 			{
@@ -380,9 +428,14 @@ static void D_Display(void)
 				lastdraw = false;
 			}
 
-			ST_Drawer();
-			F_TextPromptDrawer();
-			HU_Drawer();
+			if (gamestate == GS_LEVEL)
+			{
+				ST_Drawer();
+				F_TextPromptDrawer();
+				HU_Drawer();
+			}
+			else
+				F_TitleScreenDrawer();
 		}
 	}
 
@@ -494,56 +547,6 @@ static void D_Display(void)
 	}
 }
 
-void D_Render(void)
-{
-	if (!automapactive && !dedicated && cv_renderview.value)
-	{
-		if (players[displayplayer].mo || players[displayplayer].playerstate == PST_DEAD)
-		{
-			topleft = screens[0] + viewwindowy*vid.width + viewwindowx;
-			objectsdrawn = 0;
-#ifdef HWRENDER
-			if (rendermode != render_soft)
-				HWR_RenderPlayerView(0, &players[displayplayer]);
-			else
-#endif
-			if (rendermode != render_none)
-				R_RenderPlayerView(&players[displayplayer]);
-		}
-
-		// render the second screen
-		if (splitscreen && players[secondarydisplayplayer].mo)
-		{
-#ifdef HWRENDER
-			if (rendermode != render_soft)
-				HWR_RenderPlayerView(1, &players[secondarydisplayplayer]);
-			else
-#endif
-			if (rendermode != render_none)
-			{
-				viewwindowy = vid.height / 2;
-				M_Memcpy(ylookup, ylookup2, viewheight*sizeof (ylookup[0]));
-
-				topleft = screens[0] + viewwindowy*vid.width + viewwindowx;
-
-				R_RenderPlayerView(&players[secondarydisplayplayer]);
-
-				viewwindowy = 0;
-				M_Memcpy(ylookup, ylookup1, viewheight*sizeof (ylookup[0]));
-			}
-		}
-
-		// Image postprocessing effect
-		if (rendermode == render_soft)
-		{
-			if (postimgtype)
-				V_DoPostProcessor(0, postimgtype, postimgparam);
-			if (postimgtype2)
-				V_DoPostProcessor(1, postimgtype2, postimgparam2);
-		}
-	}
-}
-
 // =========================================================================
 // D_SRB2Loop
 // =========================================================================
diff --git a/src/d_main.h b/src/d_main.h
index 65c51802a7c644c871b862ef0ff28182204d0d6b..d67a5bb498ba0f45d37b2be8c6bd15fde96cc78a 100644
--- a/src/d_main.h
+++ b/src/d_main.h
@@ -54,7 +54,4 @@ const char *D_Home(void);
 void D_AdvanceDemo(void);
 void D_StartTitle(void);
 
-/* Here for title maps */
-void D_Render(void);
-
 #endif //__D_MAIN__
diff --git a/src/f_finale.c b/src/f_finale.c
index 2d20eb7f41face5c65cdff0edeae7e3955c5ea9b..4a0b0826f158595d5b5808a881f06a7145e0a803 100644
--- a/src/f_finale.c
+++ b/src/f_finale.c
@@ -2588,9 +2588,7 @@ void F_TitleScreenDrawer(void)
 	// Draw that sky!
 	if (curbgcolor >= 0)
 		V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, curbgcolor);
-	else if (titlemapinaction && curbghide && ! hidetitlemap)
-		D_Render();
-	else
+	else if (!curbghide || !titlemapinaction || gamestate == GS_WAITINGPLAYERS)
 		F_SkyScroll(curbgxspeed, curbgyspeed, curbgname);
 
 	// Don't draw outside of the title screen, or if the patch isn't there.
@@ -3350,6 +3348,10 @@ void F_TitleScreenTicker(boolean run)
 	if (run)
 		finalecount++;
 
+	// don't trigger if doing anything besides idling on title
+	if (gameaction != ga_nothing || gamestate != GS_TITLESCREEN)
+		return;
+
 	// Execute the titlemap camera settings
 	if (titlemapinaction)
 	{
@@ -3396,10 +3398,6 @@ void F_TitleScreenTicker(boolean run)
 		}
 	}
 
-	// don't trigger if doing anything besides idling on title
-	if (gameaction != ga_nothing || gamestate != GS_TITLESCREEN)
-		return;
-
 	// no demos to play? or, are they disabled?
 	if (!cv_rollingdemos.value || !numDemos)
 		return;