diff --git a/src/d_netcmd.c b/src/d_netcmd.c
index 528d79f3b2853b8885cb44dd405e95c3c0fcf330..dd9ced6c4ea17d543960d8bf217ee7efdf2ef814 100644
--- a/src/d_netcmd.c
+++ b/src/d_netcmd.c
@@ -719,6 +719,7 @@ void D_RegisterClientCommands(void)
 	CV_RegisterVar(&cv_crosshair2);
 	CV_RegisterVar(&cv_alwaysfreelook);
 	CV_RegisterVar(&cv_alwaysfreelook2);
+	CV_RegisterVar(&cv_postfirsttime);
 
 	// g_input.c
 	CV_RegisterVar(&cv_sideaxis);
diff --git a/src/g_game.h b/src/g_game.h
index d6b41830e8c674e52bf0cb3374e526709df3e93b..00298c62363c49493887b592dd0d3b189c492a86 100644
--- a/src/g_game.h
+++ b/src/g_game.h
@@ -55,6 +55,7 @@ extern tic_t timeinmap; // Ticker for time spent in level (used for levelcard di
 extern INT16 rw_maximums[NUM_WEAPONS];
 
 // used in game menu
+extern consvar_t cv_postfirsttime;
 extern consvar_t cv_crosshair, cv_crosshair2;
 extern consvar_t cv_invertmouse, cv_alwaysfreelook, cv_mousemove;
 extern consvar_t cv_invertmouse2, cv_alwaysfreelook2, cv_mousemove2;
diff --git a/src/m_menu.c b/src/m_menu.c
index 38ff3f998c936b02b99ef4007c03b27491aeee86..b61c6396a008c9154d29d5d2b10c2c20fa27ba74 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -441,6 +441,9 @@ static CV_PossibleValue_t serversort_cons_t[] = {
 };
 consvar_t cv_serversort = {"serversort", "Ping", CV_HIDEN | CV_CALL, serversort_cons_t, M_SortServerList, 0, NULL, NULL, 0, 0, NULL};
 
+// first time memory
+consvar_t cv_postfirsttime = {"postfirsttime", "No", CV_HIDEN | CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
+
 // autorecord demos for time attack
 static consvar_t cv_autorecord = {"autorecord", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL};
 
@@ -6141,6 +6144,8 @@ static void M_StartTutorial(INT32 choice)
 	if (!tutorialmap)
 		return; // no map to go to, don't bother
 
+	CV_SetValue(&cv_postfirsttime, 1);
+
 	tutorialmode = true; // turn on tutorial mode
 
 	emeralds = 0;
@@ -6757,6 +6762,20 @@ static void M_HandleLoadSave(INT32 choice)
 	}
 }
 
+static void M_TutorialResponse(INT32 ch)
+{
+	CV_SetValue(&cv_postfirsttime, 1);
+	if (ch != 'y' && ch != KEY_ENTER)
+	{
+		return;
+		// copypasta from M_LoadGame
+		M_ReadSaveStrings();
+		M_SetupNextMenu(&SP_LoadDef);
+	}
+	else
+		M_StartTutorial(0);
+}
+
 //
 // Selected from SRB2 menu
 //
@@ -6764,6 +6783,12 @@ static void M_LoadGame(INT32 choice)
 {
 	(void)choice;
 
+	if (tutorialmap && !cv_postfirsttime.value)
+	{
+		M_StartMessage("Do you want to play a brief Tutorial?\n(Press 'Y' to go, or 'N' to skip)", M_TutorialResponse, MM_YESNO);
+		return;
+	}
+
 	M_ReadSaveStrings();
 	M_SetupNextMenu(&SP_LoadDef);
 }