diff -Nru -x .svn -x .cdtproject -x .project -x .settings -x build -x build-linux-x86 -x q3asm -x q3cpp -x q3lcc -x q3rcc -x '*.orig' -x '*.rej' -x '*~' -x '.*.swp' pm_ori/src/game/g_buildable.c pm/src/game/g_buildable.c
--- pm_ori/src/game/g_buildable.c	2007-06-24 16:21:40.000000000 +0200
+++ pm/src/game/g_buildable.c	2007-06-24 16:24:16.000000000 +0200
@@ -25,6 +25,12 @@
 
 // from g_combat.c
 extern char *modNames[ ];
+int lastTime; // used for control point
+int whoControl; // used for control point
+int lastTimeCap;
+int msgSend;
+int showEvoMsg;
+int lastStage;
 
 /*
 ================
@@ -255,7 +261,8 @@
 
     //if entity is a power item calculate the distance to it
     if( ( ent->s.modelindex == BA_H_REACTOR || ent->s.modelindex == BA_H_REPEATER ) &&
-        ent->spawned )
+        ent->spawned &&
+        !ent->deconstruct )
     {
       VectorSubtract( self->s.origin, ent->s.origin, temp_v );
       distance = VectorLength( temp_v );
@@ -2568,7 +2575,9 @@
   G_BuildableTouchTriggers( ent );
 
   //fall back on normal physics routines
-  G_Physics( ent, msec );
+  if( !G_IsPromod( ) 
+		  || ( G_IsPromod( ) && !(ent->killedBy & 0x8 ) ) )
+ 	 G_Physics( ent, msec );
 }
 
 
@@ -2602,7 +2611,7 @@
     if( ent->biteam == BIT_HUMANS && !ent->powered )
       continue;
 
-    if( ent->s.modelindex == buildable && ent->spawned )
+    if( ent->s.modelindex == buildable && ent->spawned && !(ent->killedBy & 0x8))
       return qtrue;
   }
 
@@ -2682,6 +2691,18 @@
   for( i = 0; i < level.numBuildablesForRemoval; i++ )
   {
     ent = level.markedBuildables[ i ];
+	/* hein? kazako?
+    if ( G_IsPromod( ) )
+    {
+	    if ( ent->biteam == PTE_HUMANS )
+	    {
+		    level.humanBuildPoints += BG_FindBuildPointsForBuildable( ent->s.modelindex ) >> 1;
+	    }
+	    else if ( ent->biteam == PTE_ALIENS )
+	    {
+		    level.alienBuildPoints += BG_FindBuildPointsForBuildable( ent->s.modelindex ) >> 1;
+	    }
+    }*/
 
     G_FreeEntity( ent );
   }
@@ -2857,6 +2878,7 @@
   int               contents;
   playerState_t     *ps = &ent->client->ps;
   int               buildPoints;
+  gentity_t *ent2;
 
   BG_FindBBoxForBuildable( buildable, mins, maxs );
 
@@ -3072,6 +3094,10 @@
         reason = IBE_RPTWARN2;
     }
 
+    //if( buildable == BA_H_REACTOR )
+	//    if( G_IsPowered( entity_origin ) )
+	//	    reason = IBE_RPTWARN2;
+
     //check permission to build here
     if( tr1.surfaceFlags & SURF_NOHUMANBUILD || tr1.surfaceFlags & SURF_NOBUILD ||
         contents & CONTENTS_NOHUMANBUILD || contents & CONTENTS_NOBUILD )
@@ -3120,7 +3146,20 @@
   //the user is not allowed to build
   if( ent->client->pers.denybuild )
     return IBE_DENIED;
-    
+  
+  // check for distance with promod point
+  for ( i = 0; i < level.num_entities; i++ )
+  {
+		ent2 = &level.gentities[ i ];
+
+		if ( ent2->s.eType == ET_BUILDABLE && ent2->killedBy & 0x8 )
+		{
+			if (Distance(ent2->s.origin, origin) < ent2->damage * g_pmNobuildRange.value)
+			{
+				return IBE_NOROOM;
+			}
+		}
+  }
 
   return reason;
 }
@@ -3561,6 +3600,397 @@
 }
 
 /*
+======================
+G_PromodCapture
+======================
+*/
+
+void G_PromodCapture( gentity_t *mark, gentity_t *capturer )
+{
+	if ( capturer->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS && 
+		whoControl != PTE_HUMANS ) 
+	{
+		whoControl = PTE_HUMANS;
+		lastTimeCap = level.time;
+		lastTime = level.time;
+		msgSend = 0;
+		showEvoMsg = PTE_NONE;
+		lastStage = g_humanStage.integer;
+		trap_SendServerCommand( -1, va ( "cp \"humans have control!\"" ) );
+	}
+	else if ( capturer->client->ps.stats[ STAT_PTEAM ] == PTE_ALIENS  && 
+		whoControl != PTE_ALIENS ) 
+	{
+		whoControl = PTE_ALIENS;
+		lastTimeCap = level.time;
+		lastTime = level.time;
+		showEvoMsg = PTE_NONE;
+		lastStage = g_alienStage.integer;
+		trap_SendServerCommand( -1, va ( "cp \"Aliens have control!\"" ) );
+		msgSend = 0;
+	}
+
+}
+
+void PromodSendMsg( void )
+{
+	int i;
+	for( i = 0; i < level.maxclients; i++ )
+	{
+		if (level.clients[i].ps.stats[ STAT_PTEAM ] == whoControl)
+		{
+			trap_SendServerCommand( i, va ( "cp \"%s\"", g_pmRewardIncMsg.string));
+		}
+		else if (level.clients[i].ps.stats[ STAT_PTEAM ] != PTE_NONE)
+		{
+			trap_SendServerCommand( i, va ( "cp \"%s\"", g_pmOwnageIncMsg.string ));
+		}
+		else
+		{
+			trap_SendServerCommand( i, va ( "cp \"%s will get Punised\"", (whoControl==PTE_HUMANS?"Aliens":"Humans")));
+		}
+	}
+}
+
+void PromodSendMsg2( void )
+{
+	int i;
+	for( i = 0; i < level.maxclients; i++ )
+	{
+		if (level.clients[i].ps.stats[ STAT_PTEAM ] == showEvoMsg)
+		{
+			trap_SendServerCommand( i, va ( "cp \"%s\"", g_pmRewardMsg.string));
+		}
+		else if (level.clients[i].ps.stats[ STAT_PTEAM ] != PTE_NONE)
+		{
+			trap_SendServerCommand( i, va ( "cp \"%s\"", g_pmOwnedMsg.string ));
+		}
+		else
+		{
+			trap_SendServerCommand( i, va ( "cp \"%s get punised\"", (whoControl==PTE_HUMANS?"Aliens":"Humans")));
+		}
+	}
+}
+
+/*
+======================
+PromodMark_Think
+======================
+*/
+#define PLAYER_COUNT_MOD 5.0f // HUGLY!! but PLAYER_COUNT_MOD defined in g_main.C
+
+void PromodMark_Think( gentity_t *self )
+{
+	int eList[ MAX_GENTITIES ];
+	int num, i;
+	vec3_t mins, maxs, range;
+	gentity_t *ent;
+	// BAD init! (should be elsewhere, didn't search where it should be)
+	if (lastTime > level.time || lastTime < 0)
+	{
+		lastTime = 0;
+	}
+	self->nextthink = level.time + 250;
+	
+	if (whoControl == PTE_HUMANS)
+	{
+		if (g_humanStage.integer > lastStage)
+		{
+			// human got stage with normal way
+			// reste timer
+			lastTime = level.time;
+			lastStage = g_humanStage.integer;
+		}
+	}
+	if (whoControl == PTE_ALIENS)
+	{
+		if (g_alienStage.integer > lastStage)
+		{
+			// human got stage with normal way
+			// reste timer
+			lastTime = level.time;
+			lastStage = g_alienStage.integer;
+		}
+	}
+	
+	if (whoControl != PTE_NONE &&  lastTime + (g_pmTime.integer * 700 )  <= level.time && !msgSend)
+	{
+		msgSend=1;
+		PromodSendMsg();
+	}
+	if (showEvoMsg != PTE_NONE && (level.time - lastTime) > 500)
+	{
+		PromodSendMsg2();
+		showEvoMsg=PTE_NONE;		
+	}
+	if ( whoControl == PTE_ALIENS &&
+				lastTime + (g_pmTime.integer * 1000 ) <= level.time )
+	{
+		int killNeededForNextStage=0;
+		for ( i = 0; i < level.maxclients; i++ )
+		{
+			if ( level.clients[ i ].pers.connected == CON_CONNECTED && 
+					level.clients[ i ].pers.teamSelection == PTE_ALIENS )
+			{
+					G_AddCreditToClient(&level.clients[ i ], g_pmFundsValue.integer, qtrue);
+			}
+		}
+		// next stage
+		if (g_alienStage.integer == 0)
+		{	// stage1
+			killNeededForNextStage = g_alienStage2Threshold.integer * level.averageNumAlienClients / PLAYER_COUNT_MOD;
+		}
+		if (g_alienStage.integer == 1)
+		{
+			//stage2	
+			killNeededForNextStage = g_alienStage3Threshold.integer * level.averageNumAlienClients / PLAYER_COUNT_MOD;
+		}
+		if (killNeededForNextStage != 0)
+		{
+			trap_Cvar_Set( "g_alienKills", va( "%d", killNeededForNextStage + 1 ) );
+		}
+		showEvoMsg = PTE_ALIENS;
+		lastTime = level.time;
+		msgSend=0;
+
+	}
+	if ( whoControl == PTE_HUMANS &&
+			lastTime + (g_pmTime.integer * 1000 ) <= level.time )
+	{		
+		int killNeededForNextStage=0;
+		for ( i = 0; i < level.maxclients; i++ )
+		{
+			if ( level.clients[ i ].pers.connected == CON_CONNECTED && 
+					level.clients[ i ].pers.teamSelection == PTE_HUMANS )
+			{				
+				
+				G_AddCreditToClient(&level.clients[ i ], g_pmFundsValue.integer * LEVEL0_VALUE, qtrue);
+			}
+		}
+				// next stage
+		if (g_humanStage.integer == 0)
+		{	// stage1
+			killNeededForNextStage = g_humanStage2Threshold.integer * level.averageNumHumanClients / PLAYER_COUNT_MOD;
+		}
+		if (g_humanStage.integer == 1)
+		{
+			//stage2	
+			killNeededForNextStage = g_humanStage3Threshold.integer * level.averageNumHumanClients / PLAYER_COUNT_MOD;
+		}
+		if (killNeededForNextStage != 0)
+		{
+			trap_Cvar_Set( "g_humanKills", va( "%d", killNeededForNextStage +1 ) );
+		}
+		showEvoMsg = PTE_HUMANS;
+		lastTime = level.time;
+		msgSend=0;		
+	}
+
+	VectorSet( range, 50, 50, 75 );
+	VectorAdd( self->s.origin, range, maxs );
+	VectorSubtract( self->s.origin, range, mins );
+	
+	num = trap_EntitiesInBox( mins, maxs, eList, MAX_GENTITIES );
+
+	for ( i = 0; i < num; i++ ) 
+	{
+		ent = &g_entities[ eList[ i ] ];
+	
+		if ( ent->client && (level.time - lastTimeCap) > 1000 )
+		{
+			G_PromodCapture( self, ent );
+			break;
+		}
+	}
+}
+
+/*
+================
+G_PromodMark
+
+================
+*/
+
+void G_PromodMark( int range, vec3_t origin )
+{
+
+	gentity_t *mark;
+
+	if ( !G_IsPromod( ) )
+		return;
+
+	mark = G_Spawn( );
+
+	mark->s.eType = ET_BUILDABLE;
+	mark->classname = BG_FindEntityNameForBuildable( BA_H_REPEATER );
+	mark->s.modelindex = BA_H_REPEATER;
+
+	mark->biteam = mark->s.modelindex2 = BIT_NONE;
+
+	G_SetOrigin( mark, origin );
+
+	mark->s.groundEntityNum = ENTITYNUM_WORLD;
+
+	BG_FindBBoxForBuildable( BA_H_REPEATER, mark->r.mins, mark->r.maxs );
+	mark->damage = range;
+
+	// keep things from being built underneath the 
+	// Promod (supremacy)  points
+	mark->r.mins[ 2 ] -= 85;
+	mark->r.maxs[ 2 ] -= 85;
+/*	mark->r.mins[ 0 ] -= range * g_pmNobuildRange.value;
+	mark->r.mins[ 1 ] -= range * g_pmNobuildRange.value;
+	mark->r.mins[ 2 ] -= range * g_pmNobuildRange.value;
+	mark->r.maxs[ 0 ] += range * g_pmNobuildRange.value;
+	mark->r.maxs[ 1 ] += range * g_pmNobuildRange.value;
+	mark->r.maxs[ 2 ] += range * g_pmNobuildRange.value;*/
+
+
+	// set neutral team ownership and marker status respectively
+	mark->killedBy |= 0x1;
+	mark->killedBy |= 0x8;
+
+	mark->physicsObject = qfalse;
+
+	mark->nextthink = level.time + 250;
+	mark->think = PromodMark_Think;
+
+	mark->s.generic1 = B_HEALTH_MASK;
+
+	VectorSet( mark->s.origin2, 0.0f, 0.0f, 1.0f );
+
+	trap_LinkEntity( mark );
+
+	G_Printf("Creating promod (supremacy) mark at %f %f %f\n",
+			origin[ 0 ], origin[ 1 ], origin[ 2 ] );
+
+}
+
+/*
+================
+G_PromodSave
+
+================
+*/
+
+void G_PromodSave( void )
+{
+	fileHandle_t fWrite;
+	gentity_t *ent;
+	char map[ MAX_QPATH ];
+	char *l;
+	int i, range;
+
+	trap_Cvar_VariableStringBuffer( "mapname", map, sizeof( map ) );
+	if ( trap_FS_FOpenFile( va( "promod/%s.sup", map ), &fWrite, FS_WRITE ) < 0 )
+	{
+
+		G_Printf( "PromodSave: could not open promod file. ");
+		return;
+
+	}
+
+	for ( i = 0; i < level.num_entities; i++ )
+	{
+		ent = &level.gentities[ i ];
+
+		if ( ent->s.eType == ET_BUILDABLE && ent->killedBy & 0x8 )
+		{
+
+			range = ent->damage;
+
+			l = va( "%d %f %f %f\n",
+					range,
+					ent->s.origin[ 0 ],
+					ent->s.origin[ 1 ],
+					ent->s.origin[ 2 ]);
+
+			G_Printf("Saving marker: %s\n", l );
+
+			trap_FS_Write( l, strlen( l ), fWrite );
+		}
+
+	}
+
+	G_Printf("Done, saving file.\n");
+	trap_FS_FCloseFile( fWrite );
+
+}
+
+/*
+================
+G_PromodLoad
+
+================
+*/
+
+void G_PromodLoad( void )
+{
+	int len;
+	fileHandle_t fRead;
+	char map[ MAX_QPATH ];
+	char fileName[ MAX_QPATH ];
+	char line[ MAX_STRING_CHARS ];
+	char *dmarker;
+	vec3_t origin;
+	int range, i;
+
+	showEvoMsg = PTE_NONE;
+	whoControl = PTE_NONE;
+
+	trap_Cvar_VariableStringBuffer( "mapname", map, sizeof( map ) );
+	Com_sprintf( fileName, MAX_QPATH, "promod/%s.sup", map );
+
+	len = trap_FS_FOpenFile( fileName, &fRead, FS_READ );
+
+	if ( len < 0 )
+	{
+		G_Printf( "PromodLoad: could not open Promod data file: %s", fileName );
+
+		g_pmError.integer = 1;
+		G_PromodShutdown( );
+		return;
+	}
+
+	lastTime = level.time;
+
+	msgSend=0;
+	dmarker = G_Alloc( len + 1 );
+	trap_FS_Read( dmarker, len, fRead );
+
+	*( dmarker + len ) = '\0';
+
+	trap_FS_FCloseFile( fRead );
+
+	i = 0;
+
+	while ( *dmarker )
+	{
+		line[ i++ ] = *dmarker;
+
+		if ( *dmarker == '\n' )
+		{
+			line[ i ] = '\0';
+			sscanf(line, "%d %f %f %f\n",
+					&range,
+					&origin[ 0 ], 
+					&origin[ 1 ], 
+					&origin[ 2 ] );
+
+			G_PromodMark( range, origin );
+
+			i = 0;
+		}
+
+		dmarker++;
+	}
+
+	G_Printf("PromodLoad: Finished loading data file.\n");
+
+}
+
+
+/*
 ============
 G_LayoutSave
 
diff -Nru -x .svn -x .cdtproject -x .project -x .settings -x build -x build-linux-x86 -x q3asm -x q3cpp -x q3lcc -x q3rcc -x '*.orig' -x '*.rej' -x '*~' -x '.*.swp' pm_ori/src/game/g_cmds.c pm/src/game/g_cmds.c
--- pm_ori/src/game/g_cmds.c	2007-06-24 16:21:40.000000000 +0200
+++ pm/src/game/g_cmds.c	2007-06-24 16:24:16.000000000 +0200
@@ -3134,6 +3134,138 @@
     level.clients[ clientNum ].pers.netname );
 }
 
+/*
+======================
+Cmd_PromodRemove_f
+======================
+*/
+ 
+void Cmd_PromodRemove_f( gentity_t *ent )
+{
+
+	int entityList[ MAX_GENTITIES ];
+	gentity_t *tent;
+	vec3_t pmins, pmaxs;
+	int i, numEntities;
+
+	if ( !CheatsOk( ent ) )
+		return;
+
+	VectorAdd( ent->r.mins, ent->s.origin, pmins );
+	VectorAdd( ent->r.maxs, ent->s.origin, pmaxs );
+
+	numEntities = trap_EntitiesInBox( pmins, pmaxs, entityList, MAX_GENTITIES );
+
+	for( i = 0; i < numEntities; i++ )
+	{
+		tent = &g_entities[ entityList[ i ] ];
+		if( tent->killedBy & 0x8 )
+		{
+			G_FreeEntity( tent );
+		}
+	}
+
+}
+
+ /*
+======================
+Cmd_PromodClear_f
+======================
+*/
+
+void Cmd_PromodClear_f( gentity_t *ent )
+{
+
+	int i;
+	gentity_t *tent;
+
+	if ( !CheatsOk( ent ) )
+		return;
+
+	for ( i = 0; i < level.num_entities; i++ )
+	{
+		tent = &g_entities[ i ];
+
+		if ( tent->killedBy & 0x8 )
+			G_FreeEntity( tent );
+
+	}
+
+}
+
+/*
+======================
+Cmd_PromodSave_f
+======================
+*/
+
+void Cmd_PromodSave_f( gentity_t *ent )
+{
+
+	if ( !G_IsPromod( ) )
+		return;
+
+	if ( !CheatsOk( ent ) )
+		return;
+
+	G_PromodSave( );
+	
+}
+
+/*
+======================
+Cmd_PromodLoad_f
+======================
+*/
+
+void Cmd_PromodLoad_f( gentity_t *ent )
+{
+
+	if ( !G_IsPromod( ) )
+		return;
+
+	if ( !CheatsOk( ent ) )
+		return;
+
+	G_PromodLoad( );
+
+}
+
+/*
+======================
+Cmd_PromodCreate_f
+======================
+*/
+void Cmd_PromodCreate_f( gentity_t *ent )
+{
+
+	char arg[ MAX_QPATH ];
+	int range, numArgs;
+	vec3_t origin;
+
+	if ( !G_IsPromod( ) )
+		return;
+
+	if ( !CheatsOk( ent ) )
+		return;
+
+	numArgs = trap_Argc( );
+
+	if ( numArgs <= 1 )
+		return;
+
+	trap_Argv( 1, arg, sizeof( arg ) );
+	range = atoi( arg );
+
+	VectorCopy( ent->s.origin, origin );
+
+	// hack to get this thing off the ground
+	origin[ 2 ] = origin[ 2 ] + 80;
+
+	G_PromodMark( range, origin );
+
+}
+
 
 /*
 =================
@@ -3248,6 +3380,16 @@
     Cmd_PTRCRestore_f( ent );
   else if( Q_stricmp( cmd, "test" ) == 0 )
     Cmd_Test_f( ent );
+  else if( Q_stricmp( cmd, "pm_create" ) == 0 )
+     Cmd_PromodCreate_f( ent );
+  else if( Q_stricmp( cmd, "pm_load" ) == 0 )
+    Cmd_PromodLoad_f( ent );
+  else if( Q_stricmp( cmd, "pm_save" ) == 0 )
+    Cmd_PromodSave_f( ent );
+  else if( Q_stricmp( cmd, "pm_remove" ) == 0 )
+    Cmd_PromodRemove_f( ent );
+  else if( Q_stricmp( cmd, "pm_clear" ) == 0 )
+    Cmd_PromodClear_f( ent );
   else if( Q_stricmp( cmd, "share" ) == 0 )
     Cmd_Share_f( ent );
   else if( Q_stricmp( cmd, "donate" ) == 0 )
diff -Nru -x .svn -x .cdtproject -x .project -x .settings -x build -x build-linux-x86 -x q3asm -x q3cpp -x q3lcc -x q3rcc -x '*.orig' -x '*.rej' -x '*~' -x '.*.swp' pm_ori/src/game/g_local.h pm/src/game/g_local.h
--- pm_ori/src/game/g_local.h	2007-06-24 16:21:40.000000000 +0200
+++ pm/src/game/g_local.h	2007-06-24 16:24:16.000000000 +0200
@@ -747,6 +747,10 @@
 void              G_SetIdleBuildableAnim( gentity_t *ent, buildableAnimNumber_t anim );
 void              G_SpawnBuildable(gentity_t *ent, buildable_t buildable);
 void              FinishSpawningBuildable( gentity_t *ent );
+
+void		  G_PromodMark( int range, vec3_t origin );
+void		  G_PromodSave( void );
+void		  G_PromodLoad( void );
 void              G_LayoutSave( char *name );
 int               G_LayoutList( const char *map, char *list, int len );
 void              G_LayoutSelect( void );
@@ -925,6 +929,11 @@
 //
 // g_main.c
 //
+
+qboolean G_IsPromod( void );
+void G_PromodInit( void );
+void G_PromodShutdown( void );
+
 void ScoreboardMessage( gentity_t *client );
 void MoveClientToIntermission( gentity_t *client );
 void G_MapConfigs( const char *mapname );
@@ -1094,6 +1103,18 @@
 extern  vmCvar_t  g_minNameChangePeriod;
 extern  vmCvar_t  g_maxNameChanges;
 
+extern  vmCvar_t  g_promod;
+extern  vmCvar_t  g_pmError;
+extern  vmCvar_t  g_pmFundsValue;
+extern  vmCvar_t  g_pmTime;
+extern  vmCvar_t  g_pmNobuildRange;
+extern  vmCvar_t  g_pmRewardIncMsg;
+extern  vmCvar_t  g_pmOwnageIncMsg;
+extern  vmCvar_t  g_pmOwnedMsg;
+extern  vmCvar_t  g_pmRewardMsg;
+
+
+
 extern  vmCvar_t  g_timelimit;
 extern  vmCvar_t  g_suddenDeathTime;
 extern  vmCvar_t  g_suddenDeathMode;
diff -Nru -x .svn -x .cdtproject -x .project -x .settings -x build -x build-linux-x86 -x q3asm -x q3cpp -x q3lcc -x q3rcc -x '*.orig' -x '*.rej' -x '*~' -x '.*.swp' pm_ori/src/game/g_main.c pm/src/game/g_main.c
--- pm_ori/src/game/g_main.c	2007-06-24 16:21:40.000000000 +0200
+++ pm/src/game/g_main.c	2007-06-24 16:24:16.000000000 +0200
@@ -92,6 +92,16 @@
 vmCvar_t  g_minNameChangePeriod;
 vmCvar_t  g_maxNameChanges;
 
+vmCvar_t  g_promod;
+vmCvar_t  g_pmError;
+vmCvar_t  g_pmTime;
+vmCvar_t  g_pmRewardIncMsg;
+vmCvar_t  g_pmOwnageIncMsg;
+vmCvar_t  g_pmOwnedMsg;
+vmCvar_t  g_pmRewardMsg;
+vmCvar_t  g_pmFundsValue;
+vmCvar_t  g_pmNobuildRange;
+
 vmCvar_t  g_reactorBuildPoints;
 vmCvar_t  g_repeaterBuildPoints;
 vmCvar_t  g_overmindBuildPoints;
@@ -237,6 +247,16 @@
   { &g_minNameChangePeriod, "g_minNameChangePeriod", "5", 0, 0, qfalse},
   { &g_maxNameChanges, "g_maxNameChanges", "5", 0, 0, qfalse},
 
+  { &g_promod, "g_promod", "0", CVAR_ARCHIVE, 0, qfalse},
+  { &g_pmTime , "g_pmTime", "420", CVAR_ARCHIVE, 0, qfalse},
+  { &g_pmFundsValue , "g_pmFundsValue", "3", CVAR_ARCHIVE, 0, qfalse},
+  { &g_pmError, "g_pmError", "0", 0, qfalse},
+  { &g_pmRewardIncMsg, "g_pmRewardIncMsg", "It seems your opponent is a bit inactive.", CVAR_ARCHIVE, 0, qfalse},
+  { &g_pmOwnageIncMsg, "g_pmOwnageIncMsg", "You'd better move your ass, quick!", CVAR_ARCHIVE, 0, qfalse},
+  { &g_pmOwnedMsg, "g_pmOwnedMsg", "You just got punished for camping. Told you.", CVAR_ARCHIVE, 0, qfalse},
+  { &g_pmRewardMsg, "g_pmRewardMsg", "Go! Get them baby!", CVAR_ARCHIVE, 0, qfalse},
+  { &g_pmNobuildRange, "g_pmNobuildRange", "1", CVAR_ARCHIVE, 0, qfalse},
+  
   { &g_smoothClients, "g_smoothClients", "1", 0, 0, qfalse},
   { &pmove_fixed, "pmove_fixed", "0", CVAR_SYSTEMINFO, 0, qfalse},
   { &pmove_msec, "pmove_msec", "8", CVAR_SYSTEMINFO, 0, qfalse},
@@ -566,6 +586,53 @@
 }
 
 /*
+================
+G_IsPromod
+================
+*/
+
+qboolean G_IsPromod( void )
+{
+
+	if ( !g_promod.integer )
+		return qfalse;
+
+	if ( g_pmError.integer )
+		return qfalse;
+
+	return qtrue;
+
+}
+
+/*
+================
+G_PromodInit
+================
+*/
+
+void G_PromodInit( void )
+{
+	G_PromodLoad( );
+}
+
+void G_PromodShutdown( void )
+{
+
+	gentity_t *ent;
+	int i;
+
+	for( i = 0; i < level.num_entities; i++ )
+	{
+		ent = &g_entities[ i ];
+
+		if( ent->killedBy & 0x8 )
+		       G_FreeEntity( ent );
+
+	}	
+
+}
+
+/*
 ============
 G_InitGame
 
@@ -2216,6 +2283,7 @@
 {
   static int lastPasswordModCount   = -1;
   static int lastMarkDeconModCount  = -1;
+  static int lastPromodModCount  = -1;
 
   if( g_password.modificationCount != lastPasswordModCount )
   {
@@ -2247,6 +2315,16 @@
       ent->deconstruct = qfalse;
     }
   }
+
+  if ( g_promod.modificationCount != lastPromodModCount )
+  { 
+    lastPromodModCount = g_promod.modificationCount;
+
+    if( G_IsPromod( ) )
+      G_PromodInit( );
+    else
+      G_PromodShutdown( );	
+  }
 }
 
 /*
@@ -2381,7 +2459,7 @@
       continue;
     }
 
-    if( ent->s.eType == ET_BUILDABLE )
+    if( ent->s.eType == ET_BUILDABLE && !( ent->killedBy & 0x8 ) )
     {
       G_BuildableThink( ent, msec );
       continue;
