diff --git a/src/f_finale.h b/src/f_finale.h
index 024b183b247f5dfa3e497a52cf7afcf46abb8e6f..0002cb3cfa64e0b5ad523edc657ea96ef088276c 100644
--- a/src/f_finale.h
+++ b/src/f_finale.h
@@ -152,9 +152,10 @@ extern wipestyle_t wipestyle;
 
 typedef enum
 {
-	WSF_FADEOUT = 1,
-	WSF_FADEIN  = 1<<1,
-	WSF_TOWHITE = 1<<2,
+	WSF_FADEOUT   = 1,
+	WSF_FADEIN    = 1<<1,
+	WSF_TOWHITE   = 1<<2,
+	WSF_CROSSFADE = 1<<3,
 } wipestyleflags_t;
 extern wipestyleflags_t wipestyleflags;
 
diff --git a/src/f_wipe.c b/src/f_wipe.c
index 20651cb1dfe49dbce326ead4c0bf7c1aa53d5559..b88b39ef00986404cdc487f6454509c16b95dd54 100644
--- a/src/f_wipe.c
+++ b/src/f_wipe.c
@@ -95,7 +95,7 @@ boolean WipeStageTitle = false;
 INT32 lastwipetic = 0;
 
 wipestyle_t wipestyle = WIPESTYLE_NORMAL;
-wipestyleflags_t wipestyleflags = 0;
+wipestyleflags_t wipestyleflags = WSF_CROSSFADE;
 
 #ifndef NOWIPE
 static UINT8 *wipe_scr_start; //screen 3
@@ -404,7 +404,9 @@ void F_RunWipe(UINT8 wipetype, boolean drawMenu)
 
 	// don't know where else to put this.
 	// this any good?
-	if (gamestate == GS_LEVEL || gamestate == GS_TITLESCREEN)
+	if ((gamestate == GS_LEVEL || gamestate == GS_TITLESCREEN)
+	&& (wipestyleflags & (WSF_FADEIN|WSF_FADEOUT)) // only if one of those wipestyleflags are actually set
+	&& !(wipestyleflags & WSF_CROSSFADE)) // and if not crossfading
 		wipestyle = WIPESTYLE_LEVEL;
 	else
 		wipestyle = WIPESTYLE_NORMAL;
diff --git a/src/g_game.c b/src/g_game.c
index 2fa70353edce5045b1dd8b91851be3efc75e73dd..963fc00f008cb2c77a6cc63d08de19b4c14921d7 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -1803,6 +1803,9 @@ void G_DoLoadLevel(boolean resetplayer)
 //
 void G_StartTitleCard(void)
 {
+	wipestyleflags |= WSF_FADEIN;
+	wipestyleflags &= ~WSF_FADEOUT;
+
 	// The title card has been disabled for this map.
 	// Oh well.
 	if (mapheaderinfo[gamemap-1]->levelflags & LF_NOTITLECARD)
@@ -1819,8 +1822,6 @@ void G_StartTitleCard(void)
 
 	// start the title card
 	WipeStageTitle = (!titlemapinaction);
-	wipestyleflags |= WSF_FADEIN;
-	wipestyleflags &= ~WSF_FADEOUT;
 }
 
 //
@@ -2855,6 +2856,7 @@ void G_DoReborn(INT32 playernum)
 
 			// Do a wipe
 			wipegamestate = -1;
+			wipestyleflags = WSF_CROSSFADE;
 
 			if (camera.chase)
 				P_ResetCamera(&players[displayplayer], &camera);
diff --git a/src/p_setup.c b/src/p_setup.c
index e87a088d8c45d743d5b88ae07c6c0c276df5bad6..b729177aab9d9442b6469fe2503cb1c714edb6b1 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -2725,7 +2725,7 @@ boolean P_SetupLevel(boolean skipprecip)
 			S_FadeOutStopMusic(MUSICRATE/4); //FixedMul(FixedDiv(F_GetWipeLength(wipedefs[wipe_speclevel_towhite])*NEWTICRATERATIO, NEWTICRATE), MUSICRATE)
 
 		F_WipeStartScreen();
-		wipestyleflags |= WSF_FADEOUT|WSF_TOWHITE;
+		wipestyleflags |= (WSF_FADEOUT|WSF_TOWHITE);
 
 #ifdef HWRENDER
 		// uh..........