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:32:13.000000000 +0100
+++ tremulous.temp/src/game/g_cmds.c	2007-02-28 18:32:13.000000000 +0100
@@ -656,6 +656,16 @@
   if( level.time - ent->client->pers.teamChangeTime < 1000 )
     return;
 
+  // do warm up
+  if( g_doWarmup.integer &&
+      level.time - level.startTime < g_warmup.integer * 1000 )
+  {
+    trap_SendServerCommand( ent - g_entities, va( "print \"team: you can't join"
+      " a team during warm up (%d seconds remaining)\n\"",
+      g_warmup.integer - ( level.time - level.startTime ) / 1000 ) );
+    return;
+  }
+
   trap_Argv( 1, s, sizeof( s ) );
 
   if( !strlen( s ) )
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:53.000000000 +0100
+++ tremulous.temp/src/game/g_combat.c	2007-02-28 18:32:13.000000000 +0100
@@ -41,10 +41,6 @@
   if( !ent->client )
     return;
 
-  // no scoring during pre-match warmup
-  if( level.warmupTime )
-    return;
-
   ent->client->ps.persistant[ PERS_SCORE ] += score;
   CalculateRanks( );
 }
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:09.000000000 +0100
+++ tremulous.temp/src/game/g_local.h	2007-02-28 18:32:13.000000000 +0100
@@ -531,8 +531,6 @@
   int               gentitySize;
   int               num_entities;   // current number, <= MAX_GENTITIES
 
-  int               warmupTime;     // restart match at this time
-
   fileHandle_t      logFile;
 
   // store latched cvars here that we want to get at often
@@ -560,8 +558,6 @@
 
   int               snd_fry;                      // sound index for standing in lava
 
-  int               warmupModificationCount;      // for detecting if g_warmup is changed
-
   // voting state
   char              voteString[MAX_STRING_CHARS];
   char              voteDisplayString[MAX_STRING_CHARS];
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:09.000000000 +0100
+++ tremulous.temp/src/game/g_main.c	2007-02-28 18:32:13.000000000 +0100
@@ -173,7 +173,7 @@
   { &g_teamForceBalance, "g_teamForceBalance", "0", CVAR_ARCHIVE  },
 
   { &g_warmup, "g_warmup", "20", CVAR_ARCHIVE, 0, qtrue  },
-  { &g_doWarmup, "g_doWarmup", "0", 0, 0, qtrue  },
+  { &g_doWarmup, "g_doWarmup", "1", CVAR_ARCHIVE, 0, qtrue  },
   { &g_logFile, "g_logFile", "games.log", CVAR_ARCHIVE, 0, qfalse  },
   { &g_logFileSync, "g_logFileSync", "0", CVAR_ARCHIVE, 0, qfalse  },
 
@@ -456,9 +456,6 @@
 
   if( remapped )
     G_RemapTeamShaders( );
-
-  // check some things
-  level.warmupModificationCount = g_warmup.modificationCount;
 }
 
 /*
@@ -1038,7 +1035,7 @@
   int         localHTP = g_humanBuildPoints.integer,
               localATP = g_alienBuildPoints.integer;
 
-  if( g_suddenDeathTime.integer && !level.warmupTime )
+  if( g_suddenDeathTime.integer )
   {
     if( G_TimeTilSuddenDeath( ) <= 0 )
     {
@@ -1906,7 +1903,7 @@
     return;
   }
 
-  if( g_timelimit.integer && !level.warmupTime )
+  if( g_timelimit.integer )
   {
     if( level.time - level.startTime >= g_timelimit.integer * 60000 )
     {
diff -Nru tremulous/src/game/g_spawn.c tremulous.temp/src/game/g_spawn.c
--- tremulous/src/game/g_spawn.c	2007-02-28 18:28:08.000000000 +0100
+++ tremulous.temp/src/game/g_spawn.c	2007-02-28 18:32:13.000000000 +0100
@@ -662,20 +662,8 @@
   g_entities[ ENTITYNUM_WORLD ].s.number = ENTITYNUM_WORLD;
   g_entities[ ENTITYNUM_WORLD ].classname = "worldspawn";
 
-  // see if we want a warmup time
-  trap_SetConfigstring( CS_WARMUP, "" );
   if( g_restarted.integer )
-  {
     trap_Cvar_Set( "g_restarted", "0" );
-    level.warmupTime = 0;
-  }
-  else if( g_doWarmup.integer )
-  {
-    // Turn it on
-    level.warmupTime = -1;
-    trap_SetConfigstring( CS_WARMUP, va( "%i", level.warmupTime ) );
-    G_LogPrintf( "Warmup:\n" );
-  }
 
 }
 
diff -Nru tremulous/src/server/sv_ccmds.c tremulous.temp/src/server/sv_ccmds.c
--- tremulous/src/server/sv_ccmds.c	2007-02-28 18:31:40.000000000 +0100
+++ tremulous.temp/src/server/sv_ccmds.c	2007-02-28 18:32:13.000000000 +0100
@@ -239,11 +239,6 @@
 	else {
 		delay = 5;
 	}
-	if( delay && !Cvar_VariableValue("g_doWarmup") ) {
-		sv.restartTime = sv.time + delay * 1000;
-		SV_SetConfigstring( CS_WARMUP, va("%i", sv.restartTime) );
-		return;
-	}
 
 	// check for changes in variables that can't just be restarted
 	// check for maxclients change
