diff --git a/p/service/loco/obj/fwserv.c b/p/service/loco/obj/fwserv.c
new file mode 100644
index 0000000..7f27d3d
--- /dev/null
+++ b/p/service/loco/obj/fwserv.c
@@ -0,0 +1,152 @@
+/***************************************************************************
+
+ Forward-Server
+ Teil des MG-Mailsystems
+ (C) 1996 Loco@Morgengrauen
+
+ Es gilt dasselbe Copyright wie fuer mailer.c, bitte dort nachlesen.
+
+***************************************************************************/
+/* 24.03.2008, Arathorn
+   - Auch Erzmagier duerfen jetzt Eintraege aendern (Aenderung an Security())
+ */
+
+#include <properties.h>
+#include "/secure/config.h"
+#include "/mail/post.h"
+#include <wizlevels.h>
+
+#define LOG "/p/service/loco/save/FWLOG"
+
+static int Security(string name);
+
+static mixed forwarddata;
+mixed properties;
+
+
+create() {
+  seteuid(getuid());
+  forwarddata=([]);
+}
+
+
+LoadFile(s) {
+  if (!forwarddata[s])
+    forwarddata[s]=FWSAVESERV->LoadData(s);
+  if (!forwarddata[s])
+    forwarddata[s]=([]);
+}
+
+
+string QueryForward(string adr) {
+/* Setze eine Adresse um. Rueckgabe: Forwardadresse oder Name, wenn keine
+   gesetzt ist. Externe Adressen werden nicht umgesetzt. */
+  string s, res;
+  object player;
+  int i;
+
+  if (member(adr, '@')>=0) return adr; /* Externe Adresse */
+
+  for (i=sizeof(adr)-1;i>=1;i--) {
+    if (adr[i]>'z'||adr[i]<'a')
+      return "*UNGUELTIGER NAME: "+adr+" *";
+  }
+  if (adr[0]=='\\')
+    return adr;
+  
+  if (adr[0]>'z'||adr[0]<'a') 
+    return "*UNGUELTIGER NAME: "+adr+" *";
+
+
+  s=adr[0..0];
+  LoadFile(s);
+  
+  if (!member(forwarddata[s],adr)) return adr;
+
+  /* Achtung, ab hier wechselt Variable s z.T. ihre Bedeutung */
+
+  if (player=find_player(adr)) 
+    s=player->QueryProp(P_MAILADDR);
+  else {
+    /* Gibts den Spieler? */
+    if (!master()->find_userinfo(adr))
+        return 0;
+    /* hol die Daten */
+    restore_object(SAVEPATH+s+"/"+adr);
+    s=properties[P_MAILADDR];
+    properties=0;
+  }    
+
+  s=lower_case(s);
+  if (!s || !sizeof(s) ||
+      s=="none")
+    return adr;  /* keine sinnvolle Zieladresse: nicht umsetzen */
+
+  // jetzt noch pruefen, ob s eine fuer den MAILDEMON gueltige adresse ist.
+  if (MAILDEMON->query_recipient_ok(s))
+    return s;
+
+  return adr; // offenbar keine gueltige Adresse.
+}
+
+
+string AddForward(string name) {
+  string s;
+
+  name=lower_case(name);
+  s=name[0..0];
+
+  if (!Security(name)) 
+    return "Nachsendeauftrag abgelehnt, bitte EM oder Loco benachrichtigen.";
+
+  LoadFile(s);
+  
+  if (member(forwarddata[s],name))
+    return "Nachsendeauftrag war bereits gestellt worden.";
+
+  forwarddata[s]+=([name]);
+  FWSAVESERV->SaveData(s,forwarddata[s]);
+
+  write_file(LOG,ctime()+": ADD "+name+"\n");
+  
+  return "Nachsendeauftrag angenommen. Die Adresse lautet:\n  "+
+    QueryForward(name)+
+      "\nFalls diese falsch ist, bitte augenblicklich die email aendern!\n";
+
+}
+
+
+string DeleteForward(string name) {
+  string s;
+
+  name=lower_case(name);
+  s=name[0..0];
+
+  if (!Security(name)) 
+    return "Loeschen des Nachsendeauftrags ist nicht erlaubt,\n  bitte EM oder Loco benachrichtigen.";
+
+  LoadFile(s);
+  
+  if (!member(forwarddata[s],name))
+    return "Es war kein Nachsendeauftrag gestellt worden.";
+
+  forwarddata[s]-=([name]);
+  FWSAVESERV->SaveData(s,forwarddata[s]);
+  
+  write_file(LOG,ctime()+": DEL "+name+"\n");
+
+  return "Nachsendeauftrag geloescht, Post wird wieder direkt ausgeliefert.\n";
+}
+
+
+
+static int Security(string name) {
+  if (geteuid(this_interactive())==name) return 1;
+  if (geteuid()==geteuid(previous_object())) return 2;
+  if (member( ({ROOTID,MAILID}), geteuid(previous_object())) >=0 ) return 3;
+  if ( this_interactive() && IS_ARCH(this_interactive()) ) return 4;
+  return 0;
+}
+
+
+QueryForwards() { if (Security(" N I X ")) return forwarddata; }
