diff --git a/src/dehacked.c b/src/dehacked.c
index e08c8f63f7537561cc90a59e4ed94582496b9b41..54dfc441efe50095994f726ce89ea0679d9ab841 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -1162,6 +1162,8 @@ static void readlevelheader(MYFILE *f, INT32 num)
 				mapheaderinfo[num-1]->mustrack = ((UINT16)i - 1);
 			else if (fastcmp(word, "MUSICPOS"))
 				mapheaderinfo[num-1]->muspos = (UINT32)get_number(word2);
+			else if (fastcmp(word, "MUSICINTERFADEOUT"))
+				mapheaderinfo[num-1]->musinterfadeout = (UINT32)get_number(word2);
 			else if (fastcmp(word, "MUSICINTER"))
 				deh_strlcpy(mapheaderinfo[num-1]->musintername, word2,
 					sizeof(mapheaderinfo[num-1]->musintername), va("Level header %d: intermission music", num));
diff --git a/src/doomstat.h b/src/doomstat.h
index 817209dadd5267c4c175d6511534362ca13c02f2..aa8ce58f1e408665287df5eb4601a4ed66e42959 100644
--- a/src/doomstat.h
+++ b/src/doomstat.h
@@ -323,6 +323,7 @@ typedef struct
 	nightsgrades_t *grades; ///< NiGHTS grades. Allocated dynamically for space reasons. Be careful.
 
 	// Music stuff.
+	UINT32 musinterfadeout;  ///< Fade out level music on intermission screen in milliseconds
 	char musintername[7];    ///< Intermission screen music.
 
 	// Lua stuff.
diff --git a/src/lua_maplib.c b/src/lua_maplib.c
index 7d6c5e09c4ae756797e2b24c38716c4377678d2c..27b97204f2f64a073005ae22dc1a41aea86b572f 100644
--- a/src/lua_maplib.c
+++ b/src/lua_maplib.c
@@ -2033,6 +2033,8 @@ static int mapheaderinfo_get(lua_State *L)
 		lua_pushinteger(L, header->mustrack);
 	else if (fastcmp(field,"muspos"))
 		lua_pushinteger(L, header->muspos);
+	else if (fastcmp(field,"musinterfadeout"))
+		lua_pushinteger(L, header->musinterfadeout);
 	else if (fastcmp(field,"musintername"))
 		lua_pushstring(L, header->musintername);
 	else if (fastcmp(field,"forcecharacter"))
diff --git a/src/p_setup.c b/src/p_setup.c
index b50c6144a610e6dcfb2795ab27f56dd6fab4e0c1..3dd6739069e62997c6e9d66a19be8043b0fe2742 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -213,6 +213,7 @@ static void P_ClearSingleMapHeaderInfo(INT16 i)
 	mapheaderinfo[num]->musname[6] = 0;
 	mapheaderinfo[num]->mustrack = 0;
 	mapheaderinfo[num]->muspos = 0;
+	mapheaderinfo[num]->musinterfadeout = 0;
 	mapheaderinfo[num]->musintername[0] = '\0';
 	mapheaderinfo[num]->forcecharacter[0] = '\0';
 	mapheaderinfo[num]->weather = 0;
diff --git a/src/y_inter.c b/src/y_inter.c
index 58fff1a3aaa979d2714b0a5caf5935fe1f86a632..98b58ac4bf740acc7548c4dc8a2924403cda683d 100644
--- a/src/y_inter.c
+++ b/src/y_inter.c
@@ -833,7 +833,14 @@ void Y_Ticker(void)
 
 		if (!intertic) // first time only
 		{
-			if (mapheaderinfo[gamemap-1]->musintername[0] && S_MusicExists(mapheaderinfo[gamemap-1]->musintername, !midi_disabled, !digital_disabled))
+			if (mapheaderinfo[gamemap-1]->musinterfadeout
+#ifdef _WIN32
+				// can't fade midi due to win32 volume hack
+				&& S_MusicType() != MU_MID
+#endif
+			)
+				S_FadeOutStopMusic(mapheaderinfo[gamemap-1]->musinterfadeout);
+			else if (mapheaderinfo[gamemap-1]->musintername[0] && S_MusicExists(mapheaderinfo[gamemap-1]->musintername, !midi_disabled, !digital_disabled))
 				S_ChangeMusicInternal(mapheaderinfo[gamemap-1]->musintername, false); // don't loop it
 			else
 				S_ChangeMusicInternal("lclear", false); // don't loop it
@@ -901,7 +908,14 @@ void Y_Ticker(void)
 
 		if (!intertic) // first time only
 		{
-			if (mapheaderinfo[gamemap-1]->musintername[0] && S_MusicExists(mapheaderinfo[gamemap-1]->musintername, !midi_disabled, !digital_disabled))
+			if (mapheaderinfo[gamemap-1]->musinterfadeout
+#ifdef _WIN32
+				// can't fade midi due to win32 volume hack
+				&& S_MusicType() != MU_MID
+#endif
+			)
+				S_FadeOutStopMusic(mapheaderinfo[gamemap-1]->musinterfadeout);
+			else if (mapheaderinfo[gamemap-1]->musintername[0] && S_MusicExists(mapheaderinfo[gamemap-1]->musintername, !midi_disabled, !digital_disabled))
 				S_ChangeMusicInternal(mapheaderinfo[gamemap-1]->musintername, false); // don't loop it
 			else
 				S_ChangeMusicInternal("lclear", false); // don't loop it