diff --git a/src/d_main.c b/src/d_main.c
index b61ec41435f08f991d1d5bcaf82f0bbfadb2a620..fcec1726f913327f059fa7cdea1a1c3d8c6619a7 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -446,8 +446,24 @@ static void D_Display(void)
 
 		if (rendermode != render_none)
 		{
-			F_WipeEndScreen();
-			F_RunWipe(wipedefs[wipedefindex], gamestate != GS_TIMEATTACK);
+			// miru: we can use the mapheaderinfo to change the forced wipe the instant the map loads
+            if (!mapheaderinfo[gamemap-1]->postlevelwipe)
+            {
+                F_WipeEndScreen();
+                F_RunWipe(wipedefs[wipedefindex], gamestate != GS_TIMEATTACK);
+            }
+            else
+            {
+                if (mapheaderinfo[gamemap-1]->postlevelwipe < 100)
+                {
+                    F_WipeStartScreen();
+                    V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, mapheaderinfo[gamemap-1]->wipecolor);
+                    F_WipeEndScreen();
+                    F_RunWipe(mapheaderinfo[gamemap-1]->postlevelwipe,  gamestate != GS_TIMEATTACK);
+                }
+            }
+            //F_WipeEndScreen();
+            //F_RunWipe(wipedefs[wipedefindex], gamestate != GS_TIMEATTACK);
 		}
 	}
 
diff --git a/src/dehacked.c b/src/dehacked.c
index c31c2264308562c8d4a32f91f757ea1f9728a711..dde986a47e65f982699a3ce8b981caeeb7fc393a 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -1321,6 +1321,20 @@ static void readlevelheader(MYFILE *f, INT32 num)
 				else
 					mapheaderinfo[num-1]->menuflags &= ~LF2_NOVISITNEEDED;
 			}
+
+			// miru: we can build custom map header words here
+			else if (fastcmp(word, "LEVELWIPE"))
+			{
+				mapheaderinfo[num-1]->levelwipe = (INT16)i;
+			}
+			else if (fastcmp(word, "POSTLEVELWIPE"))
+			{
+				mapheaderinfo[num-1]->postlevelwipe = (INT16)i;
+			}
+			else if (fastcmp(word, "WIPECOLOR"))
+			{
+				mapheaderinfo[num-1]->wipecolor = (INT16)i;
+			}
 			else
 				deh_warning("Level header %d: unknown word '%s'", num, word);
 		}
diff --git a/src/doomstat.h b/src/doomstat.h
index 8072a15528f56a23727da9a6d7b32bcf86db4166..4aa7984b7469a7390433c6838ac78beb5935dccd 100644
--- a/src/doomstat.h
+++ b/src/doomstat.h
@@ -245,6 +245,11 @@ typedef struct
 	UINT8 numGradedMares;   ///< Internal. For grade support.
 	nightsgrades_t *grades; ///< NiGHTS grades. Allocated dynamically for space reasons. Be careful.
 
+    // miru: to use custom mapheaderinfo options, we need to add them to the struct first
+    INT16 levelwipe;
+    INT16 postlevelwipe;
+    INT16 wipecolor;
+
 	// Lua stuff.
 	// (This is not ifdeffed so the map header structure can stay identical, just in case.)
 	UINT8 numCustomOptions;     ///< Internal. For Lua custom value support.
diff --git a/src/g_game.c b/src/g_game.c
index 6effd9f09d87cb55dbea0591e1f9e3976d682d1d..196ef98f36395e995cddd3e928ba049059d2b4ef 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -1620,8 +1620,17 @@ void G_DoLoadLevel(boolean resetplayer)
 
 	levelstarttic = gametic; // for time calculation
 
-	if (wipegamestate == GS_LEVEL)
-		wipegamestate = -1; // force a wipe
+    // miru: postlevelwipe - just in case
+    if (!mapheaderinfo[gamemap-1]->postlevelwipe)
+    {
+        if (wipegamestate == GS_LEVEL)
+            wipegamestate = -1; // force a wipe
+    }
+    else
+    {
+        if (wipegamestate == GS_LEVEL)
+            wipegamestate = -1; // force a wipe
+    }
 
 	if (gamestate == GS_INTERMISSION)
 		Y_EndIntermission();
diff --git a/src/p_setup.c b/src/p_setup.c
index e56c44c70616814a2f6f216864f07aaa0e2e8b8f..76a3c5bf0e864b8217395e08936641ca3fe057b6 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -223,6 +223,15 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
 	mapheaderinfo[num]->levelflags = 0;
 	DEH_WriteUndoline("MENUFLAGS", va("%d", mapheaderinfo[num]->menuflags), UNDO_NONE);
 	mapheaderinfo[num]->menuflags = 0;
+
+	// miru: in order for the custom mapheaderinfo values to work properly, we need to do this
+	DEH_WriteUndoline("LEVELWIPE", va("%d", mapheaderinfo[num]->levelwipe), UNDO_NONE);
+	mapheaderinfo[num]->levelwipe = 0;
+	DEH_WriteUndoline("POSTLEVELWIPE", va("%d", mapheaderinfo[num]->postlevelwipe), UNDO_NONE);
+	mapheaderinfo[num]->postlevelwipe = 0;
+    DEH_WriteUndoline("WIPECOLOR", va("%d", mapheaderinfo[num]->wipecolor), UNDO_NONE);
+	mapheaderinfo[num]->wipecolor = 31;
+
 	// TODO grades support for delfile (pfft yeah right)
 	P_DeleteGrades(num);
 	// an even further impossibility, delfile custom opts support
@@ -2529,11 +2538,30 @@ boolean P_SetupLevel(boolean skipprecip)
 	// But only if we didn't do the special stage wipe
 	if (rendermode != render_none && !ranspecialwipe)
 	{
-		F_WipeStartScreen();
-		V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31);
+	    // miru: we could add the option to render different wipes here
 
-		F_WipeEndScreen();
-		F_RunWipe(wipedefs[wipe_level_toblack], false);
+	    // if the map header doesn't even call the option
+	    // then don't bother turning off
+		if (!mapheaderinfo[gamemap-1]->levelwipe)
+		{
+            F_WipeStartScreen();
+            V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31);
+
+            F_WipeEndScreen();
+            F_RunWipe(wipedefs[wipe_level_toblack], false);
+		}
+		// if it does then we can load custom fades from the fadingmask
+		else
+        {
+            if (mapheaderinfo[gamemap-1]->levelwipe < 100)
+            {
+                F_WipeStartScreen();
+                V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, mapheaderinfo[gamemap-1]->wipecolor);
+
+                F_WipeEndScreen();
+                F_RunWipe(mapheaderinfo[gamemap-1]->levelwipe, false);
+            }
+        }
 	}
 
 	// Print "SPEEDING OFF TO [ZONE] [ACT 1]..."