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:19.000000000 +0100
+++ tremulous.temp/src/game/g_combat.c	2007-02-28 18:31:19.000000000 +0100
@@ -1042,7 +1042,19 @@
     // if the attacker was on the same team
     if( targ != attacker && OnSameTeam( targ, attacker ) )
     {
-      if( !g_friendlyFire.integer )
+      if( g_dretchPunt.integer &&
+        targ->client->ps.stats[ STAT_PCLASS ] == PCL_ALIEN_LEVEL0 )
+      {
+        vec3_t dir, push;
+
+        VectorSubtract( targ->r.currentOrigin, attacker->r.currentOrigin, dir );
+        VectorNormalizeFast( dir );
+        VectorScale( dir, ( damage * 10.0f ), push );
+        push[2] = 64.0f;
+        VectorAdd( targ->client->ps.velocity, push, targ->client->ps.velocity );
+        return;
+      }
+      else if( !g_friendlyFire.integer )
       {
         if( !g_friendlyFireHumans.integer 
           && targ->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
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:28:08.000000000 +0100
+++ tremulous.temp/src/game/g_local.h	2007-02-28 18:31:19.000000000 +0100
@@ -1162,6 +1162,8 @@
 
 extern  vmCvar_t  g_privateMessages;
 
+extern  vmCvar_t  g_dretchPunt;
+
 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-02-28 18:28:08.000000000 +0100
+++ tremulous.temp/src/game/g_main.c	2007-02-28 18:31:19.000000000 +0100
@@ -133,6 +133,8 @@
 
 vmCvar_t  g_tag;
 
+vmCvar_t  g_dretchPunt;
+
 static cvarTable_t   gameCvarTable[ ] =
 {
   // don't override the cheat state set by the system
@@ -250,6 +252,8 @@
   
   { &g_tag, "g_tag", "main", CVAR_INIT, 0, qfalse },
   
+  { &g_dretchPunt, "g_dretchPunt", "1", CVAR_ARCHIVE, 0, qfalse  },
+  
   { &g_rankings, "g_rankings", "0", 0, 0, qfalse}
 };
 
