diff --git a/src/doomstat.h b/src/doomstat.h
index 7370e807434f97fd22383d5b4cec04d4e036b19b..182f39ba4a619f69ba4b7118b10f12dfe74d0f74 100644
--- a/src/doomstat.h
+++ b/src/doomstat.h
@@ -44,7 +44,6 @@ extern INT32 cursaveslot;
 //extern INT16 lastmapsaved;
 extern INT16 lastmaploaded;
 extern boolean gamecomplete;
-extern INT16 lastcoop;
 
 #define PRECIP_NONE  0
 #define PRECIP_STORM 1
@@ -375,6 +374,7 @@ extern recorddata_t *mainrecords[NUMMAPS];
 #define MV_ULTIMATE     8
 #define MV_PERFECT     16
 #define MV_MAX         31 // used in gamedata check
+#define MV_MP         128
 extern UINT8 mapvisited[NUMMAPS];
 
 // Temporary holding place for nights data for the current map
diff --git a/src/g_game.c b/src/g_game.c
index 3bffd426e08ddd676874b5a1f21e4fb191039512..cbf340a1dc46aa73e5c415a654196775b70015b9 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -80,7 +80,6 @@ INT32 cursaveslot = -1; // Auto-save 1p savegame slot
 //INT16 lastmapsaved = 0; // Last map we auto-saved at
 INT16 lastmaploaded = 0; // Last map the game loaded
 boolean gamecomplete = false;
-INT16 lastcoop = 0;
 
 UINT16 mainwads = 0;
 boolean modifiedgame; // Set if homebrew PWAD stuff has been added.
@@ -3385,7 +3384,7 @@ void G_SaveGameData(void)
 
 	// TODO put another cipher on these things? meh, I don't care...
 	for (i = 0; i < NUMMAPS; i++)
-		WRITEUINT8(save_p, mapvisited[i]);
+		WRITEUINT8(save_p, (mapvisited[i] & MV_MAX));
 
 	// To save space, use one bit per collected/achieved/unlocked flag
 	for (i = 0; i < MAXEMBLEMS;)
diff --git a/src/m_menu.c b/src/m_menu.c
index 193d0dd4f02a9de6c74656bbe16f61d8e2c742c0..d196c739d8eb771b631c83536fc803db84f832d5 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -3827,24 +3827,22 @@ static boolean M_LevelAvailableOnPlatter(INT32 mapnum)
 	switch (levellistmode)
 	{
 		case LLM_CREATESERVER:
-			if (mapheaderinfo[mapnum]->menuflags & LF2_NOVISITNEEDED)
+			if (!(mapheaderinfo[mapnum]->typeoflevel & TOL_COOP))
 				return true;
 
-			if (!mapvisited[mapnum]
-			&& (mapheaderinfo[mapnum]->typeoflevel & TOL_COOP)
-			&& (mapnum+1) > lastcoop)
-				return false;
+			if (mapvisited[mapnum]) // MV_MP
+				return true;
 
-			return true;
+			// intentional fallthrough
 		case LLM_RECORDATTACK:
 		case LLM_NIGHTSATTACK:
-			if (mapheaderinfo[mapnum]->menuflags & LF2_NOVISITNEEDED)
+			if (mapvisited[mapnum] & MV_MAX)
 				return true;
 
-			if (!mapvisited[mapnum])
-				return false;
+			if (mapheaderinfo[mapnum]->menuflags & LF2_NOVISITNEEDED)
+				return true;
 
-			// intentional fallthrough
+			return false;
 		case LLM_LEVELSELECT:
 		default:
 			return true;
@@ -5598,7 +5596,7 @@ static void M_DrawChecklist(void)
 
 									if (title)
 									{
-										const char *level = ((M_MapLocked(cond[condnum].requirement) || !((mapheaderinfo[cond[condnum].requirement-1]->menuflags & LF2_NOVISITNEEDED) || mapvisited[cond[condnum].requirement-1])) ? M_CreateSecretMenuOption(title) : title);
+										const char *level = ((M_MapLocked(cond[condnum].requirement) || !((mapheaderinfo[cond[condnum].requirement-1]->menuflags & LF2_NOVISITNEEDED) || (mapvisited[cond[condnum].requirement-1] & MV_MAX))) ? M_CreateSecretMenuOption(title) : title);
 
 										switch (cond[condnum].type)
 										{
@@ -5631,7 +5629,7 @@ static void M_DrawChecklist(void)
 
 									if (title)
 									{
-										const char *level = ((M_MapLocked(cond[condnum].extrainfo1) || !((mapheaderinfo[cond[condnum].extrainfo1-1]->menuflags & LF2_NOVISITNEEDED) || mapvisited[cond[condnum].extrainfo1-1])) ? M_CreateSecretMenuOption(title) : title);
+										const char *level = ((M_MapLocked(cond[condnum].extrainfo1) || !((mapheaderinfo[cond[condnum].extrainfo1-1]->menuflags & LF2_NOVISITNEEDED) || (mapvisited[cond[condnum].extrainfo1-1] & MV_MAX))) ? M_CreateSecretMenuOption(title) : title);
 
 										switch (cond[condnum].type)
 										{
@@ -5700,7 +5698,7 @@ static void M_DrawChecklist(void)
 
 									if (title)
 									{
-										const char *level = ((M_MapLocked(cond[condnum].extrainfo1) || !((mapheaderinfo[cond[condnum].extrainfo1-1]->menuflags & LF2_NOVISITNEEDED) || mapvisited[cond[condnum].extrainfo1-1])) ? M_CreateSecretMenuOption(title) : title);
+										const char *level = ((M_MapLocked(cond[condnum].extrainfo1) || !((mapheaderinfo[cond[condnum].extrainfo1-1]->menuflags & LF2_NOVISITNEEDED) || (mapvisited[cond[condnum].extrainfo1-1] & MV_MAX))) ? M_CreateSecretMenuOption(title) : title);
 
 										switch (cond[condnum].type)
 										{
@@ -6786,7 +6784,7 @@ static void M_Statistics(INT32 choice)
 		if (!(mapheaderinfo[i]->typeoflevel & TOL_SP) || (mapheaderinfo[i]->menuflags & LF2_HIDEINSTATS))
 			continue;
 
-		if (!mapvisited[i])
+		if (!(mapvisited[i] & MV_MAX))
 			continue;
 
 		statsMapList[j++] = i;
diff --git a/src/p_setup.c b/src/p_setup.c
index b49018e20b5237af42b817d4a8f697e6e79ab05b..a5666904eb1d947862c33ad922a185d429e03dec 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -3013,9 +3013,8 @@ boolean P_SetupLevel(boolean skipprecip)
 
 	if (!(netgame || multiplayer) && (!modifiedgame || savemoddata))
 		mapvisited[gamemap-1] |= MV_VISITED;
-
-	if ((maptol & TOL_COOP) && lastcoop < gamemap)
-		lastcoop = gamemap;
+	else
+		mapvisited[gamemap-1] |= MV_MP; // you want to record that you've been there this session, but not permanently
 
 	levelloading = false;