diff -Nru trem901-original-wraths-tmp1/src/game/bg_public.h trem901-original-wraths-tmp/src/game/bg_public.h
--- trem901-original-wraths-tmp1/src/game/bg_public.h	2007-07-15 09:04:09.000000000 +0200
+++ trem901-original-wraths-tmp/src/game/bg_public.h	2007-08-18 07:02:33.000000000 +0200
@@ -882,7 +882,9 @@
 
   MOD_ASPAWN,
   MOD_ATUBE,
-  MOD_OVERMIND
+  MOD_OVERMIND,
+  
+  MOD_SLAP
 } meansOfDeath_t;
 
 
diff -Nru trem901-original-wraths-tmp1/src/game/g_admin.c trem901-original-wraths-tmp/src/game/g_admin.c
--- trem901-original-wraths-tmp1/src/game/g_admin.c	2007-08-18 07:00:57.000000000 +0200
+++ trem901-original-wraths-tmp/src/game/g_admin.c	2007-08-18 07:04:20.000000000 +0200
@@ -164,6 +164,11 @@
       "move 999 pingers to the spectator team",
       ""},
 
+    {"slap", G_admin_slap, "x",
+      "abuses your authoritay!",
+      "[^3name|slot^7] (damage)"
+    },
+
     {"time", G_admin_time, "C",
       "show the current local server time",
       ""},
@@ -2760,6 +2765,95 @@
   return qtrue;
 }
 
+qboolean G_admin_slap( gentity_t *ent, int skiparg )
+{
+  int pids[ MAX_CLIENTS ], damage = 0;
+  char name[MAX_NAME_LENGTH], err[MAX_STRING_CHARS], command[MAX_ADMIN_CMD_LEN], *cmd;
+  gentity_t *vic;
+  vec3_t dir;
+ 
+  if( level.intermissiontime ) return qfalse;
+
+  if( G_SayArgc() < 2 + skiparg )
+  {
+    ADMP( "^3!slap: ^7usage: slap [name|slot#]\n" );
+    return qfalse;
+  }
+  G_SayArgv( skiparg, command, sizeof( command ) );
+  cmd = command;
+  if( cmd && *cmd == '!' )
+    cmd++;
+  G_SayArgv( 1 + skiparg, name, sizeof( name ) );
+  if( G_ClientNumbersFromString( name, pids ) != 1 )
+  {
+    G_MatchOnePlayer( pids, err, sizeof( err ) );
+    ADMP( va( "^3!slap: ^7%s\n", err ) );
+    return qfalse;
+  }
+  if( !admin_higher( ent, &g_entities[ pids[ 0 ] ] ) )
+  {
+    ADMP( "^3!slap: ^7sorry, but your intended victim has a higher admin"
+        " level than you\n" );
+    return qfalse;
+  }
+  vic = &g_entities[ pids[ 0 ] ];
+
+  // cant slap spectators
+  if( vic->client->pers.teamSelection == PTE_NONE ||
+      vic->client->pers.classSelection == PCL_NONE ) {
+    ADMP( "^3!slap: ^7can't slap thin air\n" );
+    return qfalse;
+  }
+
+  // cant slap console?
+  if( !vic ) {
+    ADMP( "^3!slap: ^7bad target\n" );
+    return qfalse;
+  }
+
+  // knockback in a random direction
+  dir[0] = crandom();
+  dir[1] = crandom();
+  dir[2] = random();
+  G_Knockback( vic, dir, g_slapKnockback.integer );
+
+  // play a sound
+  //G_AddEvent( vic, EV_SLAP, 0 );
+
+  if( vic != ent )
+    trap_SendServerCommand( vic-g_entities,
+      va( "cp \"%s^7 is ^1not amused!\n\"",
+      ent ? ent->client->pers.netname : "console" ) );
+
+  if( g_slapDamage.integer > 0 ) {
+
+    // !slap (name) [damage] syntax
+    if( G_SayArgc() > 2 + skiparg ) {
+      char dmg_str[ MAX_STRING_CHARS ];
+      G_SayArgv( 2 + skiparg, dmg_str, sizeof( dmg_str ) );
+      damage = atoi(dmg_str);
+      if( damage < 0 ) damage = 0;
+    } else {
+      if( g_slapDamage.integer > 100 ) g_slapDamage.integer = 100;
+      damage = BG_FindHealthForClass( vic->client->ps.stats[ STAT_PCLASS ] ) *
+        g_slapDamage.integer / 100;
+      if( damage < 1 ) damage = 1;
+    }
+
+    vic->health -= damage;
+    vic->client->ps.stats[ STAT_HEALTH ] = vic->health;
+    vic->lastDamageTime = level.time;
+    if( vic->health <= 0 )
+    {
+      vic->flags |= FL_NO_KNOCKBACK;
+      vic->enemy = &g_entities[ pids[ 0 ] ];
+      vic->die( vic, ent, ent, damage, MOD_SLAP );
+    } else if( vic->pain ) vic->pain( vic, &g_entities[ pids[ 0 ] ], damage );
+  }
+
+  return qtrue;
+}
+
 qboolean G_admin_rename( gentity_t *ent, int skiparg )
 {
   int pids[ MAX_CLIENTS ];
diff -Nru trem901-original-wraths-tmp1/src/game/g_admin.h trem901-original-wraths-tmp/src/game/g_admin.h
--- trem901-original-wraths-tmp1/src/game/g_admin.h	2007-08-18 07:00:52.000000000 +0200
+++ trem901-original-wraths-tmp/src/game/g_admin.h	2007-08-18 07:04:30.000000000 +0200
@@ -163,6 +163,7 @@
 qboolean G_admin_allready( gentity_t *ent, int skiparg );
 qboolean G_admin_cancelvote( gentity_t *ent, int skiparg );
 qboolean G_admin_passvote( gentity_t *ent, int skiparg );
+qboolean G_admin_slap( gentity_t *ent, int skiparg );
 qboolean G_admin_spec999( gentity_t *ent, int skiparg );
 qboolean G_admin_register( gentity_t *ent, int skiparg );
 qboolean G_admin_rename( gentity_t *ent, int skiparg );
diff -Nru trem901-original-wraths-tmp1/src/game/g_combat.c trem901-original-wraths-tmp/src/game/g_combat.c
--- trem901-original-wraths-tmp1/src/game/g_combat.c	2007-07-15 09:04:09.000000000 +0200
+++ trem901-original-wraths-tmp/src/game/g_combat.c	2007-08-18 07:07:16.000000000 +0200
@@ -117,7 +117,9 @@
 
   "MOD_ASPAWN",
   "MOD_ATUBE",
-  "MOD_OVERMIND"
+  "MOD_OVERMIND",
+  
+  "MOD_SLAP"
 };
 
 /*
@@ -191,7 +193,21 @@
     BG_DeactivateUpgrade( i, self->client->ps.stats );
 
   // broadcast the death event to everyone
-  if( !tk )
+  if( meansOfDeath == MOD_SLAP )
+  {
+    if( self == attacker || !attacker )
+      trap_SendServerCommand( -1, va( "print \"%s^7 slapped himself silly\n\"",
+        self->client->pers.netname ) );
+    else
+      trap_SendServerCommand( -1,
+        va( "print \"%s^7 felt %s^7's authoritay\n\"",
+        self->client->pers.netname, killerName ) );
+ 
+    // do not send obituary or credit any kills by slapping, skip straight to
+    // setting the animations etc
+    goto finish_dying;
+  }
+  else if( !tk )
   {
     ent = G_TempEntity( self->r.currentOrigin, EV_OBITUARY );
     ent->s.eventParm = meansOfDeath;
@@ -376,6 +392,8 @@
       Cmd_Score_f( g_entities + i );
   }
 
+finish_dying:
+
   self->client->pers.classSelection = PCL_NONE; //TA: reset the classtype
   VectorCopy( self->s.origin, self->client->pers.lastDeathLocation );
 
@@ -893,6 +911,54 @@
 
 /*
 ============
++G_Knockback
++
++Apply knockback or kickback to an entity.
++============
++*/
+void G_Knockback( gentity_t *targ, vec3_t dir, int knockback )
+{
+  if( knockback && targ->client )
+  {
+    vec3_t  kvel;
+    float   mass;
+
+    mass = 200;
+
+    // Halve knockback for bsuits
+    if( targ->client &&
+        targ->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS &&
+        BG_InventoryContainsUpgrade( UP_BATTLESUIT, targ->client->ps.stats ) )
+      mass += 400;
+
+    // Halve knockback for crouching players
+    if(targ->client->ps.pm_flags&PMF_DUCKED) knockback /= 2;
+
+    VectorScale( dir, g_knockback.value * (float)knockback / mass, kvel );
+    VectorAdd( targ->client->ps.velocity, kvel, targ->client->ps.velocity );
+
+    // set the timer so that the other client can't cancel
+    // out the movement immediately
+    if( !targ->client->ps.pm_time )
+    {
+      int   t;
+
+      t = knockback * 2;
+      if( t < 50 )
+        t = 50;
+
+      if( t > 200 )
+        t = 200;
+
+      targ->client->ps.pm_time = t;
+      targ->client->ps.pm_flags |= PMF_TIME_KNOCKBACK;
+    }
+  }
+}
+
+
+/*
++============
 T_Damage
 
 targ    entity that is being damaged
diff -Nru trem901-original-wraths-tmp1/src/game/g_local.h trem901-original-wraths-tmp/src/game/g_local.h
--- trem901-original-wraths-tmp1/src/game/g_local.h	2007-07-15 09:04:09.000000000 +0200
+++ trem901-original-wraths-tmp/src/game/g_local.h	2007-08-18 07:08:20.000000000 +0200
@@ -799,6 +799,7 @@
 // g_combat.c
 //
 qboolean  CanDamage( gentity_t *targ, vec3_t origin );
+void      G_Knockback( gentity_t *targ, vec3_t dir, int knockback );
 void      G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
                     vec3_t dir, vec3_t point, int damage, int dflags, int mod );
 void      G_SelectiveDamage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker, vec3_t dir,
@@ -1184,6 +1185,9 @@
 
 extern  vmCvar_t  g_dretchPunt;
 
+extern  vmCvar_t  g_slapKnockback;
+extern  vmCvar_t  g_slapDamage;
+
 void      trap_Printf( const char *fmt );
 void      trap_Error( const char *fmt );
 int       trap_Milliseconds( void );
diff -Nru trem901-original-wraths-tmp1/src/game/g_main.c trem901-original-wraths-tmp/src/game/g_main.c
--- trem901-original-wraths-tmp1/src/game/g_main.c	2007-07-15 09:04:09.000000000 +0200
+++ trem901-original-wraths-tmp/src/game/g_main.c	2007-08-18 07:09:01.000000000 +0200
@@ -146,6 +146,9 @@
 
 vmCvar_t  g_allowShare;
 
+vmCvar_t  g_slapKnockback;
+vmCvar_t  g_slapDamage;
+
 static cvarTable_t   gameCvarTable[ ] =
 {
   // don't override the cheat state set by the system
@@ -277,7 +280,10 @@
   
   { &g_rankings, "g_rankings", "0", 0, 0, qfalse},
   
-  { &g_allowShare, "g_allowShare", "1", CVAR_ARCHIVE, 0, qfalse}
+  { &g_allowShare, "g_allowShare", "1", CVAR_ARCHIVE, 0, qfalse},
+  
+  { &g_slapKnockback, "g_slapKnockback", "200", CVAR_ARCHIVE, 0, qfalse},
+  { &g_slapDamage, "g_slapDamage", "5", CVAR_ARCHIVE, 0, qfalse}
 };
 
 static int gameCvarTableSize = sizeof( gameCvarTable ) / sizeof( gameCvarTable[ 0 ] );
