diff --git a/src/g_game.c b/src/g_game.c
index 963fc00f008cb2c77a6cc63d08de19b4c14921d7..faaed13c732929d643908ea1f2e3f495ce3b940a 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -172,6 +172,7 @@ mapheader_t* mapheaderinfo[NUMMAPS] = {NULL};
 
 static boolean exitgame = false;
 static boolean retrying = false;
+static boolean retryingmodeattack = false;
 
 UINT8 stagefailed; // Used for GEMS BONUS? Also to see if you beat the stage.
 
@@ -2015,7 +2016,7 @@ boolean G_Responder(event_t *ev)
 						pausedelay = 1+(NEWTICRATE/2);
 					else if (++pausedelay > 1+(NEWTICRATE/2)+(NEWTICRATE/3))
 					{
-						G_SetRetryFlag();
+						G_SetModeAttackRetryFlag();
 						return true;
 					}
 					pausedelay++; // counteract subsequent subtraction this frame
@@ -6925,6 +6926,22 @@ boolean G_GetRetryFlag(void)
 	return retrying;
 }
 
+void G_SetModeAttackRetryFlag(void)
+{
+	retryingmodeattack = true;
+	G_SetRetryFlag();
+}
+
+void G_ClearModeAttackRetryFlag(void)
+{
+	retryingmodeattack = false;
+}
+
+boolean G_GetModeAttackRetryFlag(void)
+{
+	return retryingmodeattack;
+}
+
 // Time utility functions
 INT32 G_TicsToHours(tic_t tics)
 {
diff --git a/src/g_game.h b/src/g_game.h
index 87232c823ee1f56b9ba3dfd2cccd9094e905102d..0a575c099c6badee900584b9851eadf1dfeed3ef 100644
--- a/src/g_game.h
+++ b/src/g_game.h
@@ -225,10 +225,14 @@ void G_AddPlayer(INT32 playernum);
 void G_SetExitGameFlag(void);
 void G_ClearExitGameFlag(void);
 boolean G_GetExitGameFlag(void);
+
 void G_SetRetryFlag(void);
 void G_ClearRetryFlag(void);
 boolean G_GetRetryFlag(void);
 
+void G_SetModeAttackRetryFlag(void);
+void G_ClearModeAttackRetryFlag(void);
+boolean G_GetModeAttackRetryFlag(void);
 
 void G_LoadGameData(void);
 void G_LoadGameSettings(void);
diff --git a/src/m_menu.c b/src/m_menu.c
index 27fa81bb177b055db3849bc9796de16a4bcc74c4..7d62514e66273082a2f08e2917e6bc554b634aec 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -3527,6 +3527,7 @@ void M_StartControlPanel(void)
 
 void M_EndModeAttackRun(void)
 {
+	G_ClearModeAttackRetryFlag();
 	M_ModeAttackEndGame(0);
 }
 
diff --git a/src/p_setup.c b/src/p_setup.c
index 83f1d475bfbe8f6b8d6b83b70fdaaeb5b08da99f..5c792c73cec89ae2c928cf2eddc75eded1bb072d 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -2757,6 +2757,13 @@ boolean P_SetupLevel(boolean skipprecip)
 		ranspecialwipe = 1;
 	}
 
+	if (G_GetModeAttackRetryFlag())
+	{
+		if (modeattacking)
+			wipestyleflags |= (WSF_FADEOUT|WSF_TOWHITE);
+		G_ClearModeAttackRetryFlag();
+	}
+
 	// Make sure all sounds are stopped before Z_FreeTags.
 	S_StopSounds();
 	S_ClearSfx();
diff --git a/src/v_video.c b/src/v_video.c
index 58244531e401490f4bd8ae5b6930921b7a8eb23b..e9237563072df7f8917dd59b446dee57cdacae97 100644
--- a/src/v_video.c
+++ b/src/v_video.c
@@ -20,6 +20,7 @@
 #include "v_video.h"
 #include "st_stuff.h"
 #include "hu_stuff.h"
+#include "f_finale.h"
 #include "r_draw.h"
 #include "console.h"
 
@@ -1861,7 +1862,9 @@ void V_DrawFadeScreen(UINT16 color, UINT8 strength)
 
 	{
 		const UINT8 *fadetable = ((color & 0xFF00) // Color is not palette index?
-		? ((UINT8 *)colormaps + strength*256) // Do COLORMAP fade.
+		? ((UINT8 *)(((color & 0x0F00) == 0x0A00) ? fadecolormap // Do fadecolormap fade.
+		: (((color & 0x0F00) == 0x0B00) ? fadecolormap + (256 * FADECOLORMAPROWS) // Do white fadecolormap fade.
+		: colormaps)) + strength*256) // Do COLORMAP fade.
 		: ((UINT8 *)transtables + ((9-strength)<<FF_TRANSSHIFT) + color*256)); // Else, do TRANSMAP** fade.
 		const UINT8 *deststop = screens[0] + vid.rowbytes * vid.height;
 		UINT8 *buf = screens[0];