diff -Nru tremulous/src/game/g_active.c tremulous.temp/src/game/g_active.c
--- tremulous/src/game/g_active.c	2007-04-15 19:13:06.000000000 +0200
+++ tremulous.temp/src/game/g_active.c	2007-04-15 19:37:33.000000000 +0200
@@ -1357,6 +1357,19 @@
     return;
   }
 
+  if (g_freeFunds.integer)
+  {
+     // give full evo/credits
+     if (client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS)
+     {
+        client->ps.persistant[ PERS_CREDIT ] = ALIEN_MAX_KILLS;
+     }
+     else
+     {
+        client->ps.persistant[ PERS_CREDIT ] = HUMAN_MAX_CREDITS;
+     }
+  }
+
   G_UpdatePTRConnection( client );
 
   // check for inactivity timer, but never drop the local client of a non-dedicated server
diff -Nru tremulous/src/game/g_buildable.c tremulous.temp/src/game/g_buildable.c
--- tremulous/src/game/g_buildable.c	2007-04-15 17:59:03.000000000 +0200
+++ tremulous.temp/src/game/g_buildable.c	2007-04-15 19:37:33.000000000 +0200
@@ -955,9 +955,18 @@
       self->s.eFlags &= ~EF_FIRING;
     }
 
-    //do some damage
-    G_SelectiveRadiusDamage( self->s.pos.trBase, self, self->splashDamage,
-      self->splashRadius, self, self->splashMethodOfDeath, PTE_ALIENS );
+    if (g_noBaseAttack.integer)
+    {
+       // you should not attack the base, then get hurt !
+       G_SelectiveRadiusDamage( self->s.pos.trBase, self, self->splashDamage*g_quadfactor.integer,
+         self->splashRadius, self, self->splashMethodOfDeath, PTE_ALIENS );
+    }
+    else
+    {
+      //do some damage
+       G_SelectiveRadiusDamage( self->s.pos.trBase, self, self->splashDamage,
+         self->splashRadius, self, self->splashMethodOfDeath, PTE_ALIENS );
+    }
   }
 
   G_CreepSlow( self );
@@ -1868,7 +1877,13 @@
   float   temp, rotAngle;
   float   accuracyTolerance, angularSpeed;
 
-  if( self->lev1Grabbed )
+  if (g_noBaseAttack.integer)
+  {
+     // don't attack base, turret are *fast*
+     accuracyTolerance = MGTURRET_DCC_ACCURACYTOLERANCE*2;
+     angularSpeed = MGTURRET_DCC_ANGULARSPEED*2;
+  }
+  else if( self->lev1Grabbed )
   {
     //can't turn fast if grabbed
     accuracyTolerance = MGTURRET_GRAB_ACCURACYTOLERANCE;
@@ -2070,6 +2085,8 @@
   {
     //find a dcc for self
     self->dcced = G_FindDCC( self );
+    if (g_noBaseAttack.integer)
+       self->dcced = qtrue; 
 
     //if the current target is not valid find a new one
     if( !HMGTurret_CheckTarget( self, self->enemy, qfalse ) )
@@ -3079,8 +3096,8 @@
   built->spawned = qfalse;
   built->buildTime = built->s.time = level.time;
 
-  // build instantly in cheat mode
-  if( builder->client && g_cheats.integer )
+  // build instantly in cheat mode or in fastbuild mode
+  if( builder->client && (g_cheats.integer || g_fastBuild.integer) )
   {
     built->health = BG_FindHealthForBuildable( buildable );
     built->buildTime = built->s.time =
diff -Nru tremulous/src/game/g_cmds.c tremulous.temp/src/game/g_cmds.c
--- tremulous/src/game/g_cmds.c	2007-04-15 18:05:36.000000000 +0200
+++ tremulous.temp/src/game/g_cmds.c	2007-04-15 19:37:33.000000000 +0200
@@ -330,8 +330,11 @@
 {
   if( !g_cheats.integer )
   {
-    trap_SendServerCommand( ent-g_entities, va( "print \"Cheats are not enabled on this server\n\"" ) );
-    return qfalse;
+    if (!g_cheatAdminLevel.integer || G_admin_level(ent) < g_cheatAdminLevel.integer)
+    {
+      trap_SendServerCommand( ent-g_entities, va( "print \"Cheats are not enabled on this server\n\"" ) );
+      return qfalse;
+    }
   }
 
   if( ent->health <= 0 )
@@ -1690,7 +1693,7 @@
       if( !tr.startsolid && tr2.fraction == 1.0f )
       {
         //...check we can evolve to that class
-        if( numLevels >= 0 &&
+        if( (numLevels >= 0 || g_freeFunds.integer) &&
             BG_FindStagesForClass( newClass, g_alienStage.integer ) &&
             BG_ClassIsAllowed( newClass ) )
         {
@@ -1704,8 +1707,9 @@
           else if( ent->client->pers.evolveHealthFraction > 1.0f )
             ent->client->pers.evolveHealthFraction = 1.0f;
 
-          //remove credit
-          G_AddCreditToClient( ent->client, -(short)numLevels, qtrue );
+          //remove credit if not freefunds
+          if (!g_freeFunds.integer)
+             G_AddCreditToClient( ent->client, -(short)numLevels, qtrue );
           ent->client->pers.classSelection = newClass;
           ClientUserinfoChanged( clientNum );
           VectorCopy( infestOrigin, ent->s.pos.trBase );
@@ -1894,7 +1898,8 @@
           else
             G_FreeEntity( traceEnt );
 
-          if( !g_cheats.integer )
+          // cheat or fast build -> no build timer
+          if( !g_cheats.integer && !g_fastBuild.integer )
             ent->client->ps.stats[ STAT_MISC ] +=
               BG_FindBuildDelayForWeapon( ent->s.weapon ) >> 2;
         }
@@ -2095,8 +2100,8 @@
       return;
     }
 
-    //can afford this?
-    if( BG_FindPriceForWeapon( weapon ) > (short)ent->client->ps.persistant[ PERS_CREDIT ] )
+    //can afford this? (if free funds then go buy, it's free !)
+    if( !g_freeFunds.integer && BG_FindPriceForWeapon( weapon ) > (short)ent->client->ps.persistant[ PERS_CREDIT ] )
     {
       G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOFUNDS );
       return;
@@ -2147,7 +2152,8 @@
     ent->client->ps.stats[ STAT_MISC ] = 0;
 
     //subtract from funds
-    G_AddCreditToClient( ent->client, -(short)BG_FindPriceForWeapon( weapon ), qfalse );
+    if (!g_freeFunds.integer) // buy it for free
+       G_AddCreditToClient( ent->client, -(short)BG_FindPriceForWeapon( weapon ), qfalse );
   }
   else if( upgrade != UP_NONE )
   {
@@ -2159,7 +2165,7 @@
     }
 
     //can afford this?
-    if( BG_FindPriceForUpgrade( upgrade ) > (short)ent->client->ps.persistant[ PERS_CREDIT ] )
+    if( !g_freeFunds.integer && BG_FindPriceForUpgrade( upgrade ) > (short)ent->client->ps.persistant[ PERS_CREDIT ] )
     {
       G_TriggerMenu( ent->client->ps.clientNum, MN_H_NOFUNDS );
       return;
@@ -2205,7 +2211,8 @@
       G_GiveClientMaxAmmo( ent, qtrue );
 
     //subtract from funds
-    G_AddCreditToClient( ent->client, -(short)BG_FindPriceForUpgrade( upgrade ), qfalse );
+    if (!g_freeFunds.integer)
+       G_AddCreditToClient( ent->client, -(short)BG_FindPriceForUpgrade( upgrade ), qfalse );
   }
   else
   {
@@ -2276,7 +2283,8 @@
       BG_RemoveWeaponFromInventory( weapon, ent->client->ps.stats );
 
       //add to funds
-      G_AddCreditToClient( ent->client, (short)BG_FindPriceForWeapon( weapon ), qfalse );
+      if (!g_freeFunds.integer)  // yes free funds but not get 9999 credits :)
+         G_AddCreditToClient( ent->client, (short)BG_FindPriceForWeapon( weapon ), qfalse );
     }
 
     //if we have this weapon selected, force a new selection
@@ -2300,7 +2308,8 @@
         G_GiveClientMaxAmmo( ent, qtrue );
 
       //add to funds
-      G_AddCreditToClient( ent->client, (short)BG_FindPriceForUpgrade( upgrade ), qfalse );
+      if (!g_freeFunds.integer)
+         G_AddCreditToClient( ent->client, (short)BG_FindPriceForUpgrade( upgrade ), qfalse );
     }
   }
   else if( !Q_stricmp( s, "weapons" ) )
@@ -2321,7 +2330,8 @@
         BG_RemoveWeaponFromInventory( i, ent->client->ps.stats );
 
         //add to funds
-        G_AddCreditToClient( ent->client, (short)BG_FindPriceForWeapon( i ), qfalse );
+        if (!g_freeFunds.integer)
+            G_AddCreditToClient( ent->client, (short)BG_FindPriceForWeapon( i ), qfalse );
       }
 
       //if we have this weapon selected, force a new selection
@@ -2356,7 +2366,8 @@
         }
 
         //add to funds
-        G_AddCreditToClient( ent->client, (short)BG_FindPriceForUpgrade( i ), qfalse );
+        if (!g_freeFunds.integer)
+           G_AddCreditToClient( ent->client, (short)BG_FindPriceForUpgrade( i ), qfalse );
       }
     }
   }
diff -Nru tremulous/src/game/g_combat.c tremulous.temp/src/game/g_combat.c
--- tremulous/src/game/g_combat.c	2007-04-15 17:59:03.000000000 +0200
+++ tremulous.temp/src/game/g_combat.c	2007-04-15 19:37:33.000000000 +0200
@@ -956,6 +956,12 @@
     return;
   }
 
+
+  // don't attack buildable when noBaseAttack, you can't destroy them
+  if (g_noBaseAttack.integer && targ->s.eType == ET_BUILDABLE)
+     return;
+
+  
   client = targ->client;
 
   if( client )
diff -Nru tremulous/src/game/g_local.h tremulous.temp/src/game/g_local.h
--- tremulous/src/game/g_local.h	2007-04-15 17:59:14.000000000 +0200
+++ tremulous.temp/src/game/g_local.h	2007-04-15 19:37:33.000000000 +0200
@@ -1181,6 +1181,11 @@
 
 extern  vmCvar_t  g_dretchPunt;
 
+extern vmCvar_t g_freeFunds;
+extern vmCvar_t g_fastBuild;
+extern vmCvar_t g_noBaseAttack;
+extern vmCvar_t g_cheatAdminLevel; // an admin above or equal this level can use cheat, disable if 0
+
 void      trap_Printf( const char *fmt );
 void      trap_Error( const char *fmt );
 int       trap_Milliseconds( void );
diff -Nru tremulous/src/game/g_main.c tremulous.temp/src/game/g_main.c
--- tremulous/src/game/g_main.c	2007-04-15 19:22:22.000000000 +0200
+++ tremulous.temp/src/game/g_main.c	2007-04-15 19:37:33.000000000 +0200
@@ -144,6 +144,12 @@
 
 vmCvar_t  g_allowShare;
 
+
+vmCvar_t g_freeFunds;
+vmCvar_t g_fastBuild;
+vmCvar_t g_noBaseAttack;
+vmCvar_t g_cheatAdminLevel; // an admin above or equal this level can use cheat, disable if 0
+
 static cvarTable_t   gameCvarTable[ ] =
 {
   // don't override the cheat state set by the system
@@ -272,6 +278,11 @@
   { &g_dretchPunt, "g_dretchPunt", "1", CVAR_ARCHIVE, 0, qfalse  },
   
   { &g_rankings, "g_rankings", "0", 0, 0, qfalse},
+
+  { &g_freeFunds, "g_freeFunds", "0", 0, 0, qfalse},
+  { &g_fastBuild, "g_fastBuild", "0", 0, 0, qfalse},
+  { &g_noBaseAttack, "g_noBaseAttack", "0", 0, 0, qfalse},
+  { &g_cheatAdminLevel, "g_cheatAdminLevel", "0", CVAR_SERVERINFO, 0, qfalse},
   
   { &g_allowShare, "g_allowShare", "1", CVAR_ARCHIVE, 0, qfalse}
 };
@@ -657,6 +668,13 @@
   trap_Cvar_Set( "g_alienKills", 0 );
   trap_Cvar_Set( "g_humanKills", 0 );
 
+
+  //reset training var
+  trap_Cvar_Set( "g_freeFunds", 0);
+  trap_Cvar_Set( "g_fastBuild", 0);
+  trap_Cvar_Set( "g_noBaseAttack", 0);
+  trap_Cvar_Set( "g_cheatAdminLevel", 0);
+
   G_Printf( "-----------------------------------\n" );
 
   G_RemapTeamShaders( );
diff -Nru tremulous/src/game/g_weapon.c tremulous.temp/src/game/g_weapon.c
--- tremulous/src/game/g_weapon.c	2007-04-15 17:58:53.000000000 +0200
+++ tremulous.temp/src/game/g_weapon.c	2007-04-15 19:37:33.000000000 +0200
@@ -759,7 +759,7 @@
 
     if( G_BuildIfValid( ent, ent->client->ps.stats[ STAT_BUILDABLE ] & ~SB_VALID_TOGGLEBIT ) )
     {
-      if( g_cheats.integer )
+      if( g_cheats.integer || g_fastBuild.integer)
       {
         ent->client->ps.stats[ STAT_MISC ] = 0;
       }
@@ -1601,7 +1601,10 @@
       teslaFire( ent );
       break;
     case WP_MGTURRET:
-      bulletFire( ent, MGTURRET_SPREAD, MGTURRET_DMG, MOD_MGTURRET );
+      if (g_noBaseAttack.integer)
+         bulletFire( ent, MGTURRET_SPREAD, MGTURRET_DMG*g_quadfactor.integer, MOD_MGTURRET );
+      else
+         bulletFire( ent, MGTURRET_SPREAD, MGTURRET_DMG, MOD_MGTURRET );
       break;
 
     case WP_ABUILD:
