diff --git a/src/f_finale.c b/src/f_finale.c
index 27c9ebd681b4d39209c426dd8ecfcbd8fd0f5a26..134bc9fcc24eb20528cce2526f2bcbc963e41e64 100644
--- a/src/f_finale.c
+++ b/src/f_finale.c
@@ -67,7 +67,7 @@ static INT32 menuanimtimer; // Title screen: background animation timing
 mobj_t *titlemapcameraref = NULL;
 
 // menu presentation state
-char curbgname[8];
+char curbgname[9];
 SINT8 curfadevalue;
 boolean curhidepics;
 INT32 curbgcolor;
diff --git a/src/f_finale.h b/src/f_finale.h
index c0c6360c316186698c1c78b200d56b3399f121f8..663a454128d4f47acc241f82b35effa576616829 100644
--- a/src/f_finale.h
+++ b/src/f_finale.h
@@ -84,7 +84,7 @@ typedef enum
 
 extern UINT8 titlemapinaction;
 extern mobj_t *titlemapcameraref;
-extern char curbgname[8];
+extern char curbgname[9];
 extern SINT8 curfadevalue;
 extern boolean curhidepics;
 extern INT32 curbgcolor;
diff --git a/src/m_menu.c b/src/m_menu.c
index dca2e552d734f9ee4b77f041adf6a06f9e7771bf..53e0182fdd1dbfbb565d6d506d25cfeb930fe645 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -2247,6 +2247,8 @@ static INT32 M_IterateMenuTree(menutree_iterator itfunc, void *input)
 	{
 		bitmask = ((1 << MENUBITS) - 1) << (MENUBITS*i);
 		menutype = (activeMenuId & bitmask) >> (MENUBITS*i);
+		if (!menutype)
+			continue;
 		if (itfunc(menutype, i, &retval, &input, false))
 			break;
 	}
@@ -2300,7 +2302,7 @@ static boolean MIT_SetCurBackground(UINT32 menutype, INT32 level, INT32 *retval,
 		curbgyspeed = menupres[menutype].titlescrollyspeed != INT32_MAX ? menupres[menutype].titlescrollyspeed : titlescrollyspeed;
 		return true;
 	}
-	else if (menupres[menutype].bghide && titlemapinaction) // hide the background
+	else if (gamestate != GS_TIMEATTACK && menupres[menutype].bghide && titlemapinaction) // hide the background
 	{
 		curbghide = true;
 		return true;
@@ -2309,7 +2311,7 @@ static boolean MIT_SetCurBackground(UINT32 menutype, INT32 level, INT32 *retval,
 	{
 		if (M_GetYoungestChildMenu() == MN_SP_PLAYER || !defaultname || !defaultname[0])
 			curbgcolor = 31;
-		else if (titlemapinaction) // hide the background by default in titlemap
+		else if (gamestate != GS_TIMEATTACK && titlemapinaction) // hide the background by default in titlemap
 			curbghide = true;
 		else
 		{
@@ -2469,7 +2471,7 @@ static void M_HandleMenuPresState(menu_t *newMenu)
 	curbgcolor = -1;
 	curbgxspeed = titlescrollxspeed;
 	curbgyspeed = titlescrollyspeed;
-	curbghide = true;
+	curbghide = (gamestate != GS_TIMEATTACK); // show in time attack, hide in other menus
 
 	// don't do the below during the in-game menus
 	if (gamestate != GS_TITLESCREEN && gamestate != GS_TIMEATTACK)
diff --git a/src/m_menu.h b/src/m_menu.h
index 04146ebdc7ccc97cc9bf8c68f78abed928eaf290..06631dc3934bf465d6f7e1616859a03e024cedd3 100644
--- a/src/m_menu.h
+++ b/src/m_menu.h
@@ -123,7 +123,7 @@ typedef enum
 
 typedef struct
 {
-	char bgname[8]; // name for background gfx lump; lays over titlemap if this is set
+	char bgname[9]; // name for background gfx lump; lays over titlemap if this is set
 	SINT8 hidetitlepics; // hide title gfx per menu; -1 means undefined, inherits global setting
 	INT32 titlescrollxspeed; // background gfx scroll per menu; inherits global setting
 	INT32 titlescrollyspeed; // y scroll