diff -Nru old/src/game/g_cmds.c new/src/game/g_cmds.c
--- old/src/game/g_cmds.c	2007-04-22 14:33:51.000000000 +0200
+++ new/src/game/g_cmds.c	2007-04-22 13:54:10.000000000 +0200
@@ -992,6 +992,17 @@
     }
   }
 
+  if( g_allowDonate.integer )
+  {
+    args = G_SayConcatArgs(0);
+    if( !Q_stricmpn( args, "say /donate", 11 ) ||
+      !Q_stricmpn( args, "say_team /donate", 16 ) )
+    {
+      Cmd_Donate_f( ent );
+      return;
+    }
+  }
+
   if( trap_Argc( ) < 2 && !arg0 )
     return;
 
@@ -2819,6 +2830,103 @@
   ent->client->lastPoisonClient = ent;*/
 }
 
+ /*
+ =================
+Cmd_Donate_f
+
+Alms for the poor
+=================
+*/
+void Cmd_Donate_f( gentity_t *ent ) {
+  char s[ 20 ] = "", *type = "evo(s)";
+  int i, value, divisor, portion, new_credits, total=0,
+    max = ALIEN_MAX_KILLS, *amounts, skipargs=0;
+  qboolean donated = qtrue;
+
+  if( !ent->client || !g_allowDonate.integer ) return;
+
+  if( ent->client->pers.teamSelection == PTE_ALIENS )
+    divisor = level.numAlienClients-1;
+  else if( ent->client->pers.teamSelection == PTE_HUMANS ) {
+    divisor = level.numHumanClients-1;
+    max = HUMAN_MAX_CREDITS;
+    type = "credit(s)";
+  } else {
+    trap_SendServerCommand( ent-g_entities,
+      va( "print \"donate: spectators cannot be so gracious\n\"" ) );
+    return;
+  }
+
+  if( divisor < 1 ) {
+    trap_SendServerCommand( ent-g_entities,
+      "print \"donate: get yourself some teammates first\n\"" );
+    return;
+  }
+
+  G_SayArgv ( 0, s, sizeof( s ) );
+  if ( !Q_stricmp( s, "say" ) || !Q_stricmp( s, "say_team" ) )
+  {
+     skipargs = 1;
+     G_SayArgv ( 1, s, sizeof( s )); //usefull ?
+  }
+  
+  G_SayArgv( 1 + skipargs, s, sizeof( s ) );
+  value = atoi(s);
+  if( value <= 0 ) {
+    trap_SendServerCommand( ent-g_entities,
+      "print \"donate: very funny\n\"" );
+    return;
+  }
+  if( value > ent->client->ps.persistant[ PERS_CREDIT ] )
+    value = ent->client->ps.persistant[ PERS_CREDIT ];
+
+  // allocate memory for distribution amounts
+  amounts = G_Alloc( level.maxclients * sizeof( int ) );
+  for( i = 0; i < level.maxclients; i++ ) amounts[ i ] = 0;
+
+  // determine donation amounts for each client
+  total = value;
+  while( donated && value ) {
+    donated = qfalse;
+    portion = value / divisor;
+    if( portion < 1 ) portion = 1;
+    for( i = 0; i < level.maxclients; i++ )
+      if( level.clients[ i ].pers.connected == CON_CONNECTED &&
+           ent->client != level.clients + i &&
+           level.clients[ i ].pers.teamSelection ==
+           ent->client->pers.teamSelection ) {
+        new_credits = level.clients[ i ].ps.persistant[ PERS_CREDIT ] + portion;
+        amounts[ i ] = portion;
+        if( new_credits > max ) {
+          amounts[ i ] -= new_credits - max;
+          new_credits = max;
+        }
+        if( amounts[ i ] ) {
+          level.clients[ i ].ps.persistant[ PERS_CREDIT ] = new_credits;
+          donated = qtrue;
+          value -= amounts[ i ];
+          if( value < portion ) break;
+        }
+      }
+  }
+
+  // transfer funds
+  G_AddCreditToClient( ent->client, value - total, qtrue );
+  for( i = 0; i < level.maxclients; i++ )
+    if( amounts[ i ] ) {
+      trap_SendServerCommand( i,
+        va( "print \"%s^7 donated %d %s to you, don't forget to say 'thank you'!\n\"",
+        ent->client->pers.netname, amounts[ i ], type ) );
+    }
+
+  G_Free( amounts );
+
+  trap_SendServerCommand( ent-g_entities,
+    va( "print \"Donated %d %s to the cause.\n\"",
+    total-value, type ) );
+}
+
+
 /*
 =================
 Cmd_Share_f
@@ -3138,6 +3246,8 @@
     Cmd_Test_f( ent );
   else if( Q_stricmp( cmd, "share" ) == 0 )
     Cmd_Share_f( ent );
+  else if( Q_stricmp( cmd, "donate" ) == 0 )
+    Cmd_Donate_f( ent );
   else
     trap_SendServerCommand( clientNum, va( "print \"unknown cmd %s\n\"", cmd ) );
 }
diff -Nru old/src/game/g_local.h new/src/game/g_local.h
--- old/src/game/g_local.h	2007-04-22 14:33:51.000000000 +0200
+++ new/src/game/g_local.h	2007-04-20 21:38:31.000000000 +0200
@@ -687,7 +687,7 @@
 void      G_SanitiseName( char *in, char *out );
 void      G_PrivateMessage( gentity_t *ent );
 void      Cmd_Share_f( gentity_t *ent );
-
+void      Cmd_Donate_f( gentity_t *ent );
 
 //
 // g_physics.c
@@ -1130,6 +1130,7 @@
 extern  vmCvar_t  pmove_msec;
 extern  vmCvar_t  g_rankings;
 extern  vmCvar_t  g_allowShare;
+extern  vmCvar_t  g_allowDonate;
 extern  vmCvar_t  g_enableDust;
 extern  vmCvar_t  g_enableBreath;
 extern  vmCvar_t  g_singlePlayer;
diff -Nru old/src/game/g_main.c new/src/game/g_main.c
--- old/src/game/g_main.c	2007-04-22 14:33:51.000000000 +0200
+++ new/src/game/g_main.c	2007-04-20 21:38:31.000000000 +0200
@@ -145,7 +145,7 @@
 vmCvar_t  g_dretchPunt;
 
 vmCvar_t  g_allowShare;
-
+vmCvar_t  g_allowDonate;
 
 vmCvar_t g_freeFunds;
 vmCvar_t g_fastBuild;
@@ -291,6 +291,7 @@
   { &g_cheatAdminLevel, "g_cheatAdminLevel", "0", CVAR_SERVERINFO, 0, qfalse},
   { &wbpguid, "wbpguid", "", CVAR_ARCHIVE, 0, qfalse },
   
+  { &g_allowDonate, "g_allowDonate", "1", CVAR_ARCHIVE, 0, qfalse},
   { &g_allowShare, "g_allowShare", "1", CVAR_ARCHIVE, 0, qfalse}
 };
 
