diff -Nru tremulous/src/game/g_active.c tremulous.temp/src/game/g_active.c
--- tremulous/src/game/g_active.c	2007-02-28 18:28:08.000000000 +0100
+++ tremulous.temp/src/game/g_active.c	2007-02-28 18:31:51.000000000 +0100
@@ -375,19 +375,31 @@
 {
   pmove_t pm;
   gclient_t *client;
+  qboolean	doPmove = qtrue;
 
   client = ent->client;
 
   client->oldbuttons = client->buttons;
   client->buttons = ucmd->buttons;
 
-  if( client->sess.spectatorState != SPECTATOR_FOLLOW )
+  if( client->sess.spectatorState == SPECTATOR_LOCKED || client->sess.spectatorState == SPECTATOR_FOLLOW )
+    client->ps.pm_type = PM_FREEZE;
+  else
+    client->ps.pm_type = PM_SPECTATOR;
+
+  if ( client->sess.spectatorState == SPECTATOR_FOLLOW )
   {
-    if( client->sess.spectatorState == SPECTATOR_LOCKED )
-      client->ps.pm_type = PM_FREEZE;
-    else
-      client->ps.pm_type = PM_SPECTATOR;
+    gclient_t *cl;
+    if ( client->sess.spectatorClient >= 0 )
+    {
+      cl = &level.clients[ client->sess.spectatorClient ];
+      if ( cl->sess.sessionTeam != TEAM_SPECTATOR )
+        doPmove = qfalse;
+    }
+  }
 
+  if (doPmove)
+  {
     client->ps.speed = BG_FindSpeedForClass( client->ps.stats[ STAT_PCLASS ] );
 
     client->ps.stats[ STAT_STAMINA ] = 0;
@@ -1754,13 +1766,14 @@
     {
       cl = &level.clients[ clientNum ];
 
-      if( cl->pers.connected == CON_CONNECTED && cl->sess.sessionTeam != TEAM_SPECTATOR )
+      if( cl->pers.connected == CON_CONNECTED )
       {
         flags = ( cl->ps.eFlags & ~( EF_VOTED | EF_TEAMVOTED ) ) |
           ( ent->client->ps.eFlags & ( EF_VOTED | EF_TEAMVOTED ) );
         ent->client->ps = cl->ps;
-        ent->client->ps.pm_flags |= PMF_FOLLOW;
         ent->client->ps.eFlags = flags;
+        ent->client->ps.pm_flags |= PMF_FOLLOW;
+        ent->client->ps.pm_flags &= ~PMF_QUEUED;
       }
     }
   }
diff -Nru tremulous/src/game/g_cmds.c tremulous.temp/src/game/g_cmds.c
--- tremulous/src/game/g_cmds.c	2007-02-28 18:31:51.000000000 +0100
+++ tremulous.temp/src/game/g_cmds.c	2007-02-28 18:31:51.000000000 +0100
@@ -2478,7 +2478,7 @@
       continue;
 
     // can't follow another spectator
-    if( level.clients[ clientnum ].sess.sessionTeam == TEAM_SPECTATOR )
+    if( level.clients[ clientnum ].pers.teamSelection == PTE_NONE )
       continue;
 
     // this is good, we can use it
@@ -2493,7 +2493,7 @@
 
 /*
 =================
-Cmd_Follow_f
+Cmd_Follow_f (with r1 changes in here)
 =================
 */
 void Cmd_Follow_f( gentity_t *ent, qboolean toggle )
@@ -2534,7 +2534,7 @@
       return;
 
     // can't follow another spectator
-    if( ent->client->pers.teamSelection != PTE_NONE )
+    if( level.clients[ i ].pers.teamSelection == PTE_NONE)
       return;
 
     ent->client->sess.spectatorState = SPECTATOR_FOLLOW;
diff -Nru tremulous/src/game/g_combat.c tremulous.temp/src/game/g_combat.c
--- tremulous/src/game/g_combat.c	2007-02-28 18:31:34.000000000 +0100
+++ tremulous.temp/src/game/g_combat.c	2007-02-28 18:31:51.000000000 +0100
@@ -148,16 +148,7 @@
     return;
 
   // stop any following clients
-  for( i = 0; i < level.maxclients; i++ )
-  {
-    if( level.clients[ i ].sess.sessionTeam == TEAM_SPECTATOR &&
-        level.clients[ i ].sess.spectatorState == SPECTATOR_FOLLOW &&
-        level.clients[ i ].sess.spectatorClient == self->client->ps.clientNum )
-    {
-      if( !G_FollowNewClient( &g_entities[ i ], 1 ) )
-        G_StopFollowing( &g_entities[ i ] );
-    }
-  }
+  // r1: removed, annoying.
 
   self->client->ps.pm_type = PM_DEAD;
   self->suicideTime = 0;
