diff -Nru tremulous/src/game/bg_misc.c tremulous.temp/src/game/bg_misc.c
--- tremulous/src/game/bg_misc.c	2007-02-28 18:28:08.000000000 +0100
+++ tremulous.temp/src/game/bg_misc.c	2007-02-28 18:32:06.000000000 +0100
@@ -67,7 +67,8 @@
     qfalse,                //qboolean  creepTest;
     ASPAWN_CREEPSIZE,      //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qfalse,                //qboolean  replacable;
   },
   {
     BA_A_BARRICADE,        //int       buildNum;
@@ -102,7 +103,8 @@
     qtrue,                 //qboolean  creepTest;
     BARRICADE_CREEPSIZE,   //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qfalse,                //qboolean  replaceable;
   },
   {
     BA_A_BOOSTER,          //int       buildNum;
@@ -137,7 +139,8 @@
     qtrue,                 //qboolean  creepTest;
     BOOSTER_CREEPSIZE,     //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qtrue,                 //qboolean  replacable;
   },
   {
     BA_A_ACIDTUBE,         //int       buildNum;
@@ -172,7 +175,8 @@
     qtrue,                 //qboolean  creepTest;
     ACIDTUBE_CREEPSIZE,    //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qfalse,                //qboolean  replacable;
   },
   {
     BA_A_HIVE,             //int       buildNum;
@@ -207,7 +211,8 @@
     qtrue,                 //qboolean  creepTest;
     HIVE_CREEPSIZE,        //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qfalse,                //qboolean  replacable;
   },
   {
     BA_A_TRAPPER,          //int       buildNum;
@@ -242,7 +247,8 @@
     qtrue,                 //qboolean  creepTest;
     TRAPPER_CREEPSIZE,     //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qfalse,                //qboolean  replacable;
   },
   {
     BA_A_OVERMIND,         //int       buildNum;
@@ -277,7 +283,8 @@
     qfalse,                //qboolean  creepTest;
     OVERMIND_CREEPSIZE,    //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qtrue                  //qboolean  reactorTest;
+    qtrue,                 //qboolean  reactorTest;
+    qtrue,                 //qboolean  replacable;
   },
   {
     BA_A_HOVEL,            //int       buildNum;
@@ -312,7 +319,8 @@
     qtrue,                 //qboolean  creepTest;
     HOVEL_CREEPSIZE,       //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qtrue                  //qboolean  reactorTest;
+    qtrue,                 //qboolean  reactorTest;
+    qfalse,                //qboolean  replacable;
   },
   {
     BA_H_SPAWN,            //int       buildNum;
@@ -347,7 +355,8 @@
     qfalse,                //qboolean  creepTest;
     0,                     //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qfalse,                //qboolean  replacable;
   },
   {
     BA_H_MEDISTAT,         //int       buildNum;
@@ -382,7 +391,8 @@
     qfalse,                //qboolean  creepTest;
     0,                     //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qtrue,                 //qboolean  replacable;
   },
   {
     BA_H_MGTURRET,         //int       buildNum;
@@ -419,7 +429,8 @@
     qfalse,                //qboolean  creepTest;
     0,                     //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qfalse,                //qboolean  replacable;
   },
   {
     BA_H_TESLAGEN,         //int       buildNum;
@@ -454,7 +465,8 @@
     qfalse,                //qboolean  creepTest;
     0,                     //int       creepSize;
     qtrue,                 //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qfalse,                //qboolean  replacable;
   },
   {
     BA_H_DCC,              //int       buildNum;
@@ -489,7 +501,8 @@
     qfalse,                //qboolean  creepTest;
     0,                     //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qtrue,                 //qboolean  replacable;
   },
   {
     BA_H_ARMOURY,          //int       buildNum;
@@ -524,7 +537,8 @@
     qfalse,                //qboolean  creepTest;
     0,                     //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qtrue,                 //qboolean  replacable;
   },
   {
     BA_H_REACTOR,          //int       buildNum;
@@ -559,7 +573,8 @@
     qfalse,                //qboolean  creepTest;
     0,                     //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qtrue                  //qboolean  reactorTest;
+    qtrue,                 //qboolean  reactorTest;
+    qtrue,                 //qboolean  replacable;
   },
   {
     BA_H_REPEATER,         //int       buildNum;
@@ -594,7 +609,8 @@
     qfalse,                //qboolean  creepTest;
     0,                     //int       creepSize;
     qfalse,                //qboolean  dccTest;
-    qfalse                 //qboolean  reactorTest;
+    qfalse,                //qboolean  reactorTest;
+    qtrue,                 //qboolean  replacable;
   }
 };
 
@@ -1290,6 +1306,25 @@
 
 /*
 ==============
+BG_FindReplaceableTestForBuildable
+==============
+*/
+qboolean BG_FindReplaceableTestForBuildable( int bclass )
+{
+  int i;
+
+  for( i = 0; i < bg_numBuildables; i++ )
+  {
+    if( bg_buildableList[ i ].buildNum == bclass )
+    {
+      return bg_buildableList[ i ].replaceable;
+    }
+  }
+  return qfalse;
+}
+
+/*
+==============
 BG_FindOverrideForBuildable
 ==============
 */
diff -Nru tremulous/src/game/bg_public.h tremulous.temp/src/game/bg_public.h
--- tremulous/src/game/bg_public.h	2007-02-28 18:31:12.000000000 +0100
+++ tremulous.temp/src/game/bg_public.h	2007-02-28 18:32:06.000000000 +0100
@@ -1020,6 +1020,7 @@
 
   qboolean  dccTest;
   qboolean  reactorTest;
+  qboolean  replaceable;
 } buildableAttributes_t;
 
 typedef struct
@@ -1146,6 +1147,7 @@
 int       BG_FindCreepSizeForBuildable( int bclass );
 int       BG_FindDCCTestForBuildable( int bclass );
 int       BG_FindUniqueTestForBuildable( int bclass );
+qboolean  BG_FindReplaceableTestForBuildable( int bclass );
 void      BG_InitBuildableOverrides( void );
 
 int       BG_FindClassNumForName( char *name );
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:06.000000000 +0100
+++ tremulous.temp/src/game/g_cmds.c	2007-02-28 18:32:06.000000000 +0100
@@ -1812,9 +1812,16 @@
         return;
 
       // Don't allow destruction of buildables that cannot be rebuilt
-      if( G_TimeTilSuddenDeath( ) <= 0 &&
-          BG_FindBuildPointsForBuildable( traceEnt->s.modelindex ) )
+      if( level.suddenDeath && traceEnt->health > 0 &&
+        ( ( g_suddenDeathMode.integer == SDMODE_SELECTIVE &&
+          !BG_FindReplaceableTestForBuildable( traceEnt->s.modelindex ) ) ||
+        ( g_suddenDeathMode.integer == SDMODE_BP &&
+          BG_FindBuildPointsForBuildable( traceEnt->s.modelindex ) ) ||
+        g_suddenDeathMode.integer == SDMODE_NO_BUILD ) ) 
       {
+        trap_SendServerCommand( ent-g_entities,
+          "print \"During Sudden Death you can only decon buildings that "
+          "can be rebuilt\n\"" );
         return;
       }
 
@@ -2353,6 +2360,23 @@
   trap_Argv( 1, s, sizeof( s ) );
 
   buildable = BG_FindBuildNumForName( s );
+
+  if( level.suddenDeath )
+  {
+    if( g_suddenDeathMode.integer == SDMODE_SELECTIVE &&
+      !BG_FindReplaceableTestForBuildable( buildable ) )
+    {
+      trap_SendServerCommand( ent-g_entities,
+        "print \"Only essential buildings can be rebuilt in Sudden Death\n\"" );
+      return;
+    }
+    else if( g_suddenDeathMode.integer == SDMODE_NO_BUILD )
+    {
+      trap_SendServerCommand( ent-g_entities,
+        "print \"Building is not allowed during Sudden Death\n\"" );
+    }
+  }
+
   team = ent->client->ps.stats[ STAT_PTEAM ];
 
   if( buildable != BA_NONE &&
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:06.000000000 +0100
+++ tremulous.temp/src/game/g_local.h	2007-02-28 18:32:06.000000000 +0100
@@ -633,6 +633,9 @@
 
   pTeam_t           lastWin;
 
+  int               suddenDeathABuildPoints;
+  int               suddenDeathHBuildPoints;
+  qboolean          suddenDeath;
   timeWarning_t     suddenDeathWarning;
   timeWarning_t     timelimitWarning;
 
@@ -1089,6 +1092,7 @@
 
 extern  vmCvar_t  g_timelimit;
 extern  vmCvar_t  g_suddenDeathTime;
+extern  vmCvar_t  g_suddenDeathMode;
 extern  vmCvar_t  g_friendlyFire;
 extern  vmCvar_t  g_friendlyFireHumans;
 extern  vmCvar_t  g_friendlyFireAliens;
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:06.000000000 +0100
+++ tremulous.temp/src/game/g_main.c	2007-02-28 18:32:06.000000000 +0100
@@ -42,6 +42,7 @@
 vmCvar_t  g_fraglimit;
 vmCvar_t  g_timelimit;
 vmCvar_t  g_suddenDeathTime;
+vmCvar_t  g_suddenDeathMode;
 vmCvar_t  g_capturelimit;
 vmCvar_t  g_friendlyFire;
 vmCvar_t  g_friendlyFireAliens;
@@ -159,6 +160,7 @@
   // change anytime vars
   { &g_timelimit, "timelimit", "0", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue },
   { &g_suddenDeathTime, "g_suddenDeathTime", "0", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue },
+  { &g_suddenDeathMode, "g_suddenDeathMode", "0", CVAR_SERVERINFO | CVAR_ARCHIVE | CVAR_NORESTART, 0, qtrue },
 
   { &g_synchronousClients, "g_synchronousClients", "0", CVAR_SYSTEMINFO, 0, qfalse  },
 
@@ -1040,13 +1042,34 @@
   {
     if( G_TimeTilSuddenDeath( ) <= 0 )
     {
-      localHTP = 0;
-      localATP = 0;
-
-      //warn about sudden death
+      //begin sudden death
       if( level.suddenDeathWarning < TW_PASSED )
       {
         trap_SendServerCommand( -1, "cp \"Sudden Death!\"" );
+        localHTP = 0;
+        localATP = 0;
+
+        if( g_suddenDeathMode.integer == SDMODE_SELECTIVE ) {
+          for( i = 1, ent = g_entities + i; i < level.num_entities; i++, ent++ )
+          {
+            if( ent->s.eType != ET_BUILDABLE )
+              continue;
+    
+            if( BG_FindReplaceableTestForBuildable( ent->s.modelindex ) )
+            {
+              int t = BG_FindTeamForBuildable( ent->s.modelindex );
+    
+              if( t == BIT_HUMANS )
+                localHTP += BG_FindBuildPointsForBuildable( ent->s.modelindex );
+              else if( t == BIT_ALIENS )
+                localATP += BG_FindBuildPointsForBuildable( ent->s.modelindex );
+            }
+          }
+        }
+        level.suddenDeathHBuildPoints = localHTP;
+        level.suddenDeathABuildPoints = localATP;
+        level.suddenDeath = qtrue;
+
         level.suddenDeathWarning = TW_PASSED;
       }
     }
@@ -1061,6 +1084,12 @@
       }
     }
   }
+
+  if( level.suddenDeath )
+  {
+    localHTP = level.suddenDeathHBuildPoints;
+    localATP = level.suddenDeathABuildPoints;
+  }
   else
   {
     localHTP = g_humanBuildPoints.integer;
@@ -1091,16 +1120,18 @@
       if( buildable == BA_A_OVERMIND && ent->spawned && ent->health > 0 )
         level.overmindPresent = qtrue;
 
-      if( BG_FindTeamForBuildable( buildable ) == BIT_HUMANS )
+      if( !level.suddenDeath || BG_FindReplaceableTestForBuildable( buildable ) )
       {
-        level.humanBuildPoints -= BG_FindBuildPointsForBuildable( buildable );
-
-        if( ent->powered )
-          level.humanBuildPointsPowered -= BG_FindBuildPointsForBuildable( buildable );
-      }
-      else
-      {
-        level.alienBuildPoints -= BG_FindBuildPointsForBuildable( buildable );
+        if( BG_FindTeamForBuildable( buildable ) == BIT_HUMANS )
+        {
+          level.humanBuildPoints -= BG_FindBuildPointsForBuildable( buildable );
+          if( ent->powered )
+            level.humanBuildPointsPowered -= BG_FindBuildPointsForBuildable( buildable );
+        }
+        else
+        {
+          level.alienBuildPoints -= BG_FindBuildPointsForBuildable( buildable );
+        }
       }
     }
   }
diff -Nru tremulous/src/game/tremulous.h tremulous.temp/src/game/tremulous.h
--- tremulous/src/game/tremulous.h	2007-02-28 18:28:08.000000000 +0100
+++ tremulous.temp/src/game/tremulous.h	2007-02-28 18:32:06.000000000 +0100
@@ -615,3 +615,8 @@
 
 #define DAMAGE_FRACTION_FOR_KILL    0.5f //how much damage players (versus structures) need to
                                          //do to increment the stage kill counters
+
+// g_suddenDeathMode settings
+#define SDMODE_BP                   0 
+#define SDMODE_NO_BUILD             1
+#define SDMODE_SELECTIVE            2
