diff --git a/src/p_inter.c b/src/p_inter.c
index 71dcd70a1d4b5aae5f9f30dbe81efb02c65602af..8090b7406f9e177f6630d2a58e162218d9aaa22c 100644
--- a/src/p_inter.c
+++ b/src/p_inter.c
@@ -2257,9 +2257,9 @@ void P_CheckSurvivors(void)
 		{
 			if (players[i].spectator)
 				spectators++;
-			else if (players[i].pflags & PF_TAGIT)
+			else if ((players[i].pflags & PF_TAGIT) && players[i].quittime < 30 * TICRATE)
 				taggers++;
-			else if (!(players[i].pflags & PF_GAMETYPEOVER))
+			else if (!(players[i].pflags & PF_GAMETYPEOVER) && players[i].quittime < 30 * TICRATE)
 			{
 				survivorarray[survivors] = i;
 				survivors++;
diff --git a/src/p_setup.c b/src/p_setup.c
index 679060d443b799ef1aab9c6da52c96e338997b99..729ee00c2245e11546ff4853d91985c09975e9a3 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -3097,7 +3097,7 @@ static void P_InitTagGametype(void)
 	//Also, you'd never have to loop through all 32 players slots to find anything ever again.
 	for (i = 0; i < MAXPLAYERS; i++)
 	{
-		if (playeringame[i] && !players[i].spectator)
+		if (playeringame[i] && !(players[i].spectator && players[i].quittime))
 		{
 			playersactive[realnumplayers] = i; //stores the player's node in the array.
 			realnumplayers++;
diff --git a/src/p_tick.c b/src/p_tick.c
index 4dd3bb30a81e57832ac7f503c26287ec14215bfe..a4b8aa097163a2833ebb67bcb4cf171e5addc272 100644
--- a/src/p_tick.c
+++ b/src/p_tick.c
@@ -599,6 +599,10 @@ void P_Ticker(boolean run)
 			if (players[i].quittime)
 			{
 				players[i].quittime++;
+
+				if (players[i].quittime == 30 * TICRATE)
+					P_CheckSurvivors();
+
 				if (server && players[i].quittime >= FixedMul(cv_rejointimeout.value, 60 * TICRATE))
 					SendKick(i, KICK_MSG_PLAYER_QUIT);
 			}