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:56.000000000 +0100
+++ tremulous.temp/src/game/g_cmds.c	2007-02-28 18:31:56.000000000 +0100
@@ -793,8 +793,10 @@
 G_Say
 ==================
 */
-static void G_SayTo( gentity_t *ent, gentity_t *other, int mode, int color, const char *name, const char *message )
+static void G_SayTo( gentity_t *ent, gentity_t *other, int mode, int color, const char *name, const char *message, const char *prefix )
 {
+  qboolean toSend = qtrue, usePrefix = qfalse;
+
   if( !other )
     return;
 
@@ -809,18 +811,31 @@
 
   if( mode == SAY_TEAM && !OnSameTeam( ent, other ) )
   {
-    if( other->client->ps.stats[ STAT_PTEAM ] != PTE_NONE )
-      return; 
-
-    if( !G_admin_permission( other, ADMF_SPEC_ALLCHAT ) )
-      return;
-
+    toSend = qfalse;
+    
     // specs with ADMF_SPEC_ALLCHAT flag can see team chat
+    if( other->client->pers.teamSelection == PTE_NONE &&
+        G_admin_permission( other, ADMF_SPEC_ALLCHAT ) ) {
+      usePrefix = qtrue;
+      toSend = qtrue;
+    }
+    
+    // spec following someone in talker's steam may see
+    // that teamchat if g_specsSeeTeamchat is enabled
+    if( other->client->ps.stats[ STAT_PTEAM ] == ent->client->ps.stats[ STAT_PTEAM ] &&
+        ent->client->pers.teamSelection != PTE_NONE && g_specsSeeTeamchat.integer )
+      toSend = qtrue;
+    
   }
+  if( mode == SAY_ALL )
+    usePrefix = qtrue;
 
-  trap_SendServerCommand( other-g_entities, va( "%s \"%s%c%c%s\"",
-    mode == SAY_TEAM ? "tchat" : "chat",
-    name, Q_COLOR_ESCAPE, color, message ) );
+  if( toSend ) {
+    trap_SendServerCommand( other-g_entities, va( "%s \"%s%s%c%c%s\"",
+      mode == SAY_TEAM ? "tchat" : "chat",
+      usePrefix ? prefix : "",
+      name, Q_COLOR_ESCAPE, color, message ) );
+  }
 }
 
 #define EC    "\x19"
@@ -859,20 +874,25 @@
     default:
     case SAY_ALL:
       G_LogPrintf( "say: %s%s^7: ^2%s^7\n", prefix, ent->client->pers.netname, chatText );
-      Com_sprintf( name, sizeof( name ), "%s%s%c%c"EC": ", prefix,
+      Com_sprintf( name, sizeof( name ), "%s%c%c"EC": ",
                    ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE );
       color = COLOR_GREEN;
       break;
 
     case SAY_TEAM:
-      G_LogPrintf( "sayteam: %s^7: ^5%s^7\n", ent->client->pers.netname, chatText );
+      G_LogPrintf( "sayteam: %s%s^7: ^5%s^7\n", prefix, ent->client->pers.netname, chatText );
       if( Team_GetLocationMsg( ent, location, sizeof( location ) ) )
         Com_sprintf( name, sizeof( name ), EC"(%s%c%c"EC") (%s)"EC": ",
           ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE, location );
       else
         Com_sprintf( name, sizeof( name ), EC"(%s%c%c"EC")"EC": ",
           ent->client->pers.netname, Q_COLOR_ESCAPE, COLOR_WHITE );
-      color = COLOR_CYAN;
+      
+      if( ent->client->pers.teamSelection == PTE_NONE )
+        color = COLOR_YELLOW;
+      else
+        color = COLOR_CYAN;
+      
       break;
 
     case SAY_TELL:
@@ -892,7 +912,7 @@
 
   if( target )
   {
-    G_SayTo( ent, target, mode, color, name, text );
+    G_SayTo( ent, target, mode, color, name, text, prefix );
     return;
   }
 
@@ -900,7 +920,7 @@
   for( j = 0; j < level.maxclients; j++ )
   {
     other = &g_entities[ j ];
-    G_SayTo( ent, other, mode, color, name, text );
+    G_SayTo( ent, other, mode, color, name, text, prefix );
   }
   
   if( g_adminParseSay.integer )
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:31:51.000000000 +0100
+++ tremulous.temp/src/game/g_local.h	2007-02-28 18:31:56.000000000 +0100
@@ -1149,6 +1149,7 @@
 extern  vmCvar_t  g_currentMap;
 extern  vmCvar_t  g_initialMapRotation;
 extern  vmCvar_t  g_chatTeamPrefix;
+extern  vmCvar_t  g_specsSeeTeamchat;
 
 extern  vmCvar_t  g_shove;
 
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:31:23.000000000 +0100
+++ tremulous.temp/src/game/g_main.c	2007-02-28 18:31:56.000000000 +0100
@@ -119,6 +119,7 @@
 
 vmCvar_t  g_mapConfigs;
 vmCvar_t  g_chatTeamPrefix;
+vmCvar_t  g_specsSeeTeamchat;
 
 vmCvar_t  g_layouts;
 vmCvar_t  g_layoutAuto;
@@ -228,6 +229,7 @@
   { &g_disabledBuildables, "g_disabledBuildables", "", CVAR_ROM, 0, qfalse  },
 
   { &g_chatTeamPrefix, "g_chatTeamPrefix", "0", CVAR_ARCHIVE  },
+  { &g_specsSeeTeamchat, "g_specsSeeTeamchat", "1", CVAR_ARCHIVE  },
 
   { &g_markDeconstruct, "g_markDeconstruct", "1", CVAR_SERVERINFO | CVAR_ARCHIVE, 0, qfalse  },
 
