diff -Nru tremulous/src/game/g_local.h tremulous.temp/src/game/g_local.h
--- tremulous/src/game/g_local.h	2007-02-28 18:32:22.000000000 +0100
+++ tremulous.temp/src/game/g_local.h	2007-02-28 18:32:22.000000000 +0100
@@ -554,7 +554,6 @@
   int               numNonSpectatorClients;       // includes connecting clients
   int               numPlayingClients;            // connected, non-spectators
   int               sortedClients[MAX_CLIENTS];   // sorted by score
-  int               follow1, follow2;             // clientNums for auto-follow spectators
 
   int               snd_fry;                      // sound index for standing in lava
 
diff -Nru tremulous/src/game/g_main.c tremulous.temp/src/game/g_main.c
--- tremulous/src/game/g_main.c	2007-02-28 18:32:18.000000000 +0100
+++ tremulous.temp/src/game/g_main.c	2007-02-28 18:32:22.000000000 +0100
@@ -1293,8 +1293,6 @@
   gclient_t *cl;
   char P[ MAX_CLIENTS + 1 ] = {""};
 
-  level.follow1 = -1;
-  level.follow2 = -1;
   level.numConnectedClients = 0;
   level.numNonSpectatorClients = 0;
   level.numPlayingClients = 0;
@@ -1310,52 +1308,42 @@
   for( i = 0; i < level.maxclients; i++ )
   {
     P[ i ] = '-';
+
     if ( level.clients[ i ].pers.connected != CON_DISCONNECTED )
     {
       level.sortedClients[ level.numConnectedClients ] = i;
       level.numConnectedClients++;
+
       P[ i ] = (char)'0' + level.clients[ i ].pers.teamSelection;
 
-      if( !( level.clients[ i ].ps.pm_flags & PMF_FOLLOW ) )
+      if( level.clients[ i ].pers.connected != CON_CONNECTED )
+        continue;
+
+      if( level.clients[ i ].pers.teamSelection != PTE_NONE )
       {
-        //so we know when the game ends and for team leveling
-        if( level.clients[ i ].ps.stats[ STAT_PTEAM ] == PTE_ALIENS )
+        level.numPlayingClients++;
+        level.numVotingClients++;
+        level.numNonSpectatorClients++;
+
+        if( level.clients[ i ].pers.teamSelection == PTE_ALIENS )
         {
           level.numAlienClients++;
+          level.numteamVotingClients[ 1 ]++;
+
           if( level.clients[ i ].sess.sessionTeam != TEAM_SPECTATOR )
             level.numLiveAlienClients++;
         }
-
-        if( level.clients[ i ].ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
+        else if( level.clients[ i ].pers.teamSelection == PTE_HUMANS )
         {
           level.numHumanClients++;
+          level.numteamVotingClients[ 0 ]++;
+
           if( level.clients[ i ].sess.sessionTeam != TEAM_SPECTATOR )
             level.numLiveHumanClients++;
         }
       }
-
-      if( level.clients[ i ].sess.sessionTeam != TEAM_SPECTATOR )
-      {
-        level.numNonSpectatorClients++;
-
-        // decide if this should be auto-followed
-        if( level.clients[ i ].pers.connected == CON_CONNECTED )
-        {
-          level.numPlayingClients++;
-          level.numVotingClients++;
-
-          if( level.clients[ i ].ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
-            level.numteamVotingClients[ 0 ]++;
-          else if( level.clients[ i ].ps.stats[ STAT_PTEAM ] == PTE_ALIENS )
-            level.numteamVotingClients[ 1 ]++;
-
-          if( level.follow1 == -1 )
-            level.follow1 = i;
-          else if( level.follow2 == -1 )
-            level.follow2 = i;
-        }
-
-      }
+      else if( g_allowSpecVoting.integer )
+        level.numVotingClients++;
     }
   }
   P[ i + 1 ] = '\0';
@@ -1992,13 +1980,13 @@
   }
   else
   {
-    if( level.voteYes > level.numConnectedClients / 2 )
+    if( level.voteYes > level.numVotingClients / 2 )
     {
       // execute the command, then remove the vote
       trap_SendServerCommand( -1, "print \"Vote passed\n\"" );
       level.voteExecuteTime = level.time + 3000;
     }
-    else if( level.voteNo >= level.numConnectedClients / 2 )
+    else if( level.voteNo >= level.numVotingClients / 2 )
     {
       // same behavior as a timeout
       trap_SendServerCommand( -1, "print \"Vote failed\n\"" );
