diff --git a/src/dehacked.c b/src/dehacked.c
index fb0f958c3..28c86f56e 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -2863,6 +2863,19 @@ static void readmaincfg(MYFILE *f)
 				startchar = (INT16)value;
 				char_on = -1;
 			}
+			else if (fastcmp(word, "TUTORIALMAP"))
+			{
+				// Support using the actual map name,
+				// i.e., Level AB, Level FZ, etc.
+
+				// Convert to map number
+				if (word2[0] >= 'A' && word2[0] <= 'Z')
+					value = M_MapNumber(word2[0], word2[1]);
+				else
+					value = get_number(word2);
+
+				tutorialmap = (INT16)value;
+			}
 			else
 				deh_warning("Maincfg: unknown word '%s'", word);
 		}
diff --git a/src/doomstat.h b/src/doomstat.h
index 24b9e5753..18ae04584 100644
--- a/src/doomstat.h
+++ b/src/doomstat.h
@@ -132,6 +132,8 @@ extern INT16 titlemap;
 extern boolean hidetitlepics;
 extern INT16 bootmap; //bootmap for loading a map on startup
 
+extern INT16 tutorialmap; // map to load for tutorial
+
 extern boolean looptitle;
 
 // CTF colors.
diff --git a/src/g_game.c b/src/g_game.c
index 52358a8b9..da6f1bbd1 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -127,6 +127,8 @@ INT16 titlemap = 0;
 boolean hidetitlepics = false;
 INT16 bootmap; //bootmap for loading a map on startup
 
+INT16 tutorialmap = 0; // map to load for tutorial
+
 boolean looptitle = false;
 
 UINT8 skincolor_redteam = SKINCOLOR_RED;
diff --git a/src/m_menu.c b/src/m_menu.c
index f8324ab7e..ec7215d46 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -6132,8 +6132,6 @@ static void M_LoadGameLevelSelect(INT32 choice)
 	M_SetupNextMenu(&SP_LevelSelectDef);
 }
 
-static INT32 tutorialmap = 1000; // MAPZ0, temporary value
-
 // Starts up the tutorial immediately (tbh I wasn't sure where else to put this)
 static void M_StartTutorial(INT32 choice)
 {