diff --git a/src/d_main.c b/src/d_main.c
index 4fb55d7284a7eaefb780529b134da3b8e5005f46..e2cb35f329e603abf7e59fa282ce738c5c4bde29 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -302,7 +302,7 @@ static void D_Display(void)
 		if (rendermode != render_none)
 		{
 			// Fade to black first
-			if (gamestate != GS_LEVEL // fades to black on its own timing, always
+			if (!(gamestate == GS_LEVEL || (gamestate == GS_TITLESCREEN && titlemapinaction)) // fades to black on its own timing, always
 			 && wipedefs[wipedefindex] != UINT8_MAX)
 			{
 				F_WipeStartScreen();
diff --git a/src/f_finale.c b/src/f_finale.c
index 9959ce0fc1947e3a5b3a6f7ac88b0c777091ebd4..50c94eec3c72c178d19fb0d5b5c53508df673807 100644
--- a/src/f_finale.c
+++ b/src/f_finale.c
@@ -1429,6 +1429,7 @@ void F_StartTitleScreen(void)
 
 	if (titlemap)
 	{
+		gamestate_t prevwipegamestate = wipegamestate;
 		titlemapinaction = true;
 		gamemap = titlemap;
 
@@ -1439,6 +1440,8 @@ void F_StartTitleScreen(void)
 		players[displayplayer].playerstate = PST_DEAD; // Don't spawn the player in dummy (I'm still a filthy cheater)
 		camera.subsector = NULL; // toast is filthy too
 		//CON_ClearHUD();
+
+		wipegamestate = prevwipegamestate;
 	}
 	else
 	{