diff --git a/secure/awmaster.c b/secure/awmaster.c
new file mode 100644
index 0000000..cccdb1d
--- /dev/null
+++ b/secure/awmaster.c
@@ -0,0 +1,433 @@
+// MorgenGrauen MUDlib
+//
+// awmaster.c -- Armours- and Weapons-Master
+//
+#pragma strict_types
+#pragma no_clone
+#pragma no_shadow
+#pragma no_inherit
+#pragma verbose_errors
+#pragma combine_strings
+#pragma pedantic
+#pragma range_check
+#pragma warn_deprecated
+
+#include <combat.h>
+#include <language.h>
+#include <properties.h>
+#include <wizlevels.h>
+
+#define SAVEFILE  "/secure/ARCH/awmaster"
+#define ADUMPFILE "/log/ARCH/RUESTUNGEN"
+#define DDUMPFILE "/log/ARCH/DAMAGERS"
+#define WDUMPFILE "/log/ARCH/WAFFEN"
+
+#define AWF_PUTON  1
+#define AWF_PUTOFF 2
+#define AWF_BOOST  4
+#define AWF_ZAUBER 8
+#define AWF_RESIST 16
+
+#define AWM_TYPE      0
+#define AWM_CLASS     1
+#define AWM_EFF_CLASS 2
+#define AWM_FLAGS     3
+#define AWM_WEIGHT    4
+#define AWM_VALUE     5
+#define AWM_HANDS     6
+#define AWM_D_TYPE    7
+#define AWM_X_CLASS   8
+#define AWM_TIME      9
+
+mapping armours,weapons,damagers;
+private int save_me_soon;
+
+private int allowed()
+{
+  if (previous_object() && geteuid(previous_object())==ROOTID)
+    return 1;
+  if (!process_call() && previous_object() && this_interactive() && ARCH_SECURITY)
+    return 1;
+  return 0;
+}
+
+void create()
+{
+    seteuid(getuid(this_object()));
+
+    if (!restore_object(SAVEFILE))
+    {
+        armours = ([]);
+        weapons = ([]);
+        damagers = ([]);
+    }
+    if (widthof(damagers) == 1) {
+      mapping tmp = damagers;
+      damagers = m_allocate(sizeof(tmp),2);
+      foreach(string r, int flag: tmp) {
+        damagers[r,0]=flag;
+      }
+    }
+}
+
+void save_me(int now)
+{
+  if (now)
+    save_object(SAVEFILE);
+  else
+    save_me_soon=1;
+}
+
+void reset() {
+  if (save_me_soon)
+  {
+    save_me_soon=0;
+    save_me(1);
+  }
+}
+
+public varargs int remove(int silent) {
+  save_me(1);
+  destruct(this_object());
+  return 1;
+}
+
+int xflags(object ob){
+    int re;
+    mapping m;
+    if (!ob || !objectp(ob))
+        return 0;
+    re=0;
+    if (((object)ob->QueryProp(P_WEAR_FUNC))==ob  ||
+        ((object)ob->QueryProp(P_WIELD_FUNC))==ob )
+        re += AWF_PUTON;
+    if (((object)ob->QueryProp(P_REMOVE_FUNC))==ob  ||
+        ((object)ob->QueryProp(P_UNWIELD_FUNC))==ob )
+        re += AWF_PUTOFF;
+    if (((object)ob->QueryProp(P_DEFEND_FUNC))==ob ||
+        ((object)ob->QueryProp(P_HIT_FUNC))==ob    )
+        re += AWF_BOOST;
+    // ists nen Mapping und nicht leer?
+    if (mappingp(m=(mapping)ob->QueryProp(P_RESISTANCE_STRENGTHS))
+        && sizeof(m))
+        re += AWF_RESIST;
+    return re;
+}
+
+void RegisterArmour()
+{   object  ob;
+    string  id;
+    int     flag,h;
+
+    if (!objectp(ob=previous_object()) || 
+      member(inherit_list(ob),"/std/armour.c")==-1)
+      return;
+    id = explode(object_name(ob),"#")[0];
+    if (member(armours,id))
+    {
+        armours[id][AWM_TIME]=time();
+        flag=0;
+        if ((h=(int)ob->QueryProp(P_AC)) > armours[id][AWM_CLASS])
+        {
+            armours[id][AWM_CLASS]=h;
+            flag=1;
+        }
+        if ((h=(int)ob->QueryProp(P_EFFECTIVE_AC)) > armours[id][AWM_EFF_CLASS])
+        {
+            armours[id][AWM_EFF_CLASS]=h;
+            flag=1;
+        }
+        if ((h=(int)ob->QueryProp(P_NR_HANDS)) < armours[id][AWM_HANDS])
+        {
+            armours[id][AWM_HANDS]=h;
+            flag=1;
+        }
+        if ((h=xflags(ob)) != armours[id][AWM_FLAGS])
+        {
+            armours[id][AWM_FLAGS]=h;
+            flag=1;
+        }
+    }
+    else
+    {
+      armours += ([ id : 
+        ([
+            AWM_TYPE      : ob->QueryProp(P_ARMOUR_TYPE) ,
+            AWM_CLASS     : ob->QueryProp(P_AC) ,
+            AWM_EFF_CLASS : ob->QueryProp(P_EFFECTIVE_AC) ,
+            AWM_FLAGS     : xflags(ob),
+            AWM_WEIGHT    : ob->QueryProp(P_WEIGHT) ,
+            AWM_VALUE     : ob->QueryProp(P_VALUE) ,
+            AWM_HANDS     : ob->QueryProp(P_NR_HANDS) , // Fuer Schilde
+            AWM_D_TYPE    : ob->QueryProp(P_DAM_TYPE) ,
+            AWM_X_CLASS   : ob->QueryProp(P_EFFECTIVE_WC) ||
+                            ob->QueryProp(P_WC),
+            AWM_TIME      : time()
+        ]) ]);
+    }
+    save_me(0);
+}
+
+void RegisterWeapon()
+{   object  ob;
+    string  id;
+    int     flag,h;
+
+    if (!objectp(ob=previous_object()) ||
+      member(inherit_list(ob),"/std/weapon.c")==-1)
+      return;
+    id = explode(object_name(ob),"#")[0];
+    if (member(weapons,id))
+    {
+        weapons[id][AWM_TIME] = time();
+        flag=0;
+        if ((h=(int)ob->QueryProp(P_WC)) > weapons[id][AWM_CLASS])
+        {
+            weapons[id][AWM_CLASS]=h;
+            flag=1;
+        }
+        if ((h=(int)ob->QueryProp(P_EFFECTIVE_WC)) > weapons[id][AWM_EFF_CLASS])
+        {
+            weapons[id][AWM_EFF_CLASS]=h;
+            flag=1;
+        }
+        if ((h=(int)ob->QueryProp(P_NR_HANDS)) < weapons[id][AWM_HANDS])
+        {
+            weapons[id][AWM_HANDS]=h;
+            flag=1;
+        }
+        if ((h=xflags(ob)) != weapons[id][AWM_FLAGS])
+        {
+            weapons[id][AWM_FLAGS]=h;
+            flag=1;
+        }
+    }
+    else
+    {
+      weapons += ([ id :
+        ([
+            AWM_TYPE      : ob->QueryProp(P_WEAPON_TYPE) ,
+            AWM_CLASS     : ob->QueryProp(P_WC) ,
+            AWM_EFF_CLASS : ob->QueryProp(P_EFFECTIVE_WC) ,
+            AWM_FLAGS     : xflags(ob),
+            AWM_WEIGHT    : ob->QueryProp(P_WEIGHT) ,
+            AWM_VALUE     : ob->QueryProp(P_VALUE) ,
+            AWM_HANDS     : ob->QueryProp(P_NR_HANDS) ,
+            AWM_D_TYPE    : ob->QueryProp(P_DAM_TYPE) ,
+            AWM_X_CLASS   : ob->QueryProp(P_EFFECTIVE_AC) || 
+                            ob->QueryProp(P_AC),
+            AWM_TIME      : time()
+        ]) ]);
+    }
+    save_me(0);
+}
+
+void RegisterDamager(object dam_ob,int old_dam, int new_dam)
+{   object ob;
+    int flag;
+    string fn;
+
+    if (!objectp(ob=previous_object()) ||
+      (member(inherit_list(ob),"/std/weapon.c")==-1 &&
+       member(inherit_list(ob),"/std/armour.c")==-1 ))
+      return;
+    if (old_dam>new_dam) // Repair
+        flag=2;
+    else if (new_dam>old_dam) // Damage
+        flag=1;
+    else
+        return;
+    if (!objectp(dam_ob))
+        return;
+    if (!(fn=old_explode(object_name(dam_ob),"#")[0]) || !stringp(fn))
+        return;
+    damagers[fn,0]=damagers[fn,0]|flag;
+    damagers[fn,1]=time(); 
+    save_me(0);
+}
+
+string dtdump(mixed arg)
+{   string re;
+    int i,w;
+
+    if (stringp(arg))
+        return capitalize(arg);
+    if (!pointerp(arg) || !stringp(arg[0]))
+        return "<NONE>";
+    if ((i=sizeof(arg))==1)
+        return capitalize(arg[0]);
+    w = (31-i)/i;
+    if (w--<1)
+        return "<MANY>";
+    for (re="",--i;i>=0;i--)
+    {
+        if (!stringp(arg[i]))
+            re += "-";
+        else
+            re += capitalize(arg[i][0..w]);
+        if (i)
+            re += "|";
+    }
+    return re;
+}
+
+int Dump(mixed what, int sortidx)
+{   string  file,*ind;
+    mapping dump;
+
+    if (!allowed())
+        return -1;
+
+    if (!what)
+    {
+        write("Nimm doch mal einen richtigen Parameter!\n");
+        return 0;
+    }
+    if (stringp(what) && sizeof(what)>0)
+    {
+        what==what[0..0];
+        if (what=="a")
+            what=1;
+        else if (what=="w")
+            what=2;
+        else if (what=="d")
+            what=3;
+        else
+        {
+            write("Nimm doch mal einen richtigen Parameter!\n");
+            return 0;
+        }
+    }
+    if (!intp(what) || what<1 || what>3)
+    {
+        write("Nimm doch mal einen richtigen Parameter!\n");
+        return 0;
+    }
+    if (what==3) // Die 'damagers' haben ein anderes Ausgabeformat
+    {
+        printf("AWM: Dumping 'damagers' to '%s'\n",DDUMPFILE);
+        if (sizeof(damagers) < 1) {
+            write("AWM: Dump aborted, mapping empty.\n");
+            return 1;
+        }
+        if (file_size(DDUMPFILE)>1)
+            rm(DDUMPFILE);
+        
+        // nach letzter Aktualisierung sortieren.
+        mixed sorted = sort_array(m_indices(damagers),
+            function int (string a, string b) {
+                return damagers[a,1] < damagers[b,1];
+            } );
+
+        string ausgabe = sprintf(
+            "--- Damagers-Dump --- %s --- %s ---\n\n"+
+            "%:15s D R [Filename]\n",
+            dtime(time()),capitalize(getuid(this_interactive())),
+            "Datum/Zeit");
+        foreach(string rue : sorted) {
+            ausgabe += sprintf("%:15s %1s %1s %s\n",
+                strftime("%y%m%d-%H:%M:%S",damagers[rue,1]),
+                (damagers[rue,0]&1?"+":"-"),
+                (damagers[rue,0]&2?"+":"-"),
+                rue);
+        }
+        
+        write_file(DDUMPFILE, ausgabe);
+        return 1;
+    }
+    if (what==2)
+        what=0;
+    file=(what?ADUMPFILE:WDUMPFILE);
+
+    printf("AWM: Dumping '%s' to '%s'\n",
+        (what?"armours":"weapons"),file);
+    
+    dump=(what?armours:weapons);
+    
+    if (sortidx) {
+      ind = sort_array(m_indices(dump),
+          function int (string a, string b)
+          {return dump[a][sortidx] < dump[b][sortidx];} );
+    }
+    else
+      ind = sort_array(m_indices(dump),#'>);
+    
+    if (sizeof(ind) < 1)
+    {
+        write("AWM: Dump aborted, mapping empty.\n");
+        return 1;
+    }
+
+    if (file_size(file)>1)
+        rm(file);
+    
+    string ausgabe = sprintf(
+        "--- %s-Dump --- %s --- %s ---\n\n"+
+        "[Filename], Datum/Zeit\n"+
+        "    ____Typ___ CLS ECL XCL NFBR WGHT. VALUE H %30.30'_'|s\n",
+        (what?"Ruestungs":"Waffen"),dtime(time()),
+        capitalize(getuid(this_interactive())),"DamType(s)");
+
+    foreach(string index : ind)
+    {
+        ausgabe += sprintf(
+            "[%s] %s\n    %10s %3d %3d %3d %1s%1s%1s%1s %5d %5d %1d %-30.30s\n",
+            index, strftime("%y%m%d-%H:%M:%S",dump[index][AWM_TIME]),
+            dump[index][AWM_TYPE],
+            dump[index][AWM_CLASS],
+            dump[index][AWM_EFF_CLASS],
+            dump[index][AWM_X_CLASS],
+           (dump[index][AWM_FLAGS]&AWF_PUTON?"+":"-"),
+           (dump[index][AWM_FLAGS]&AWF_PUTOFF?"+":"-"),
+           (dump[index][AWM_FLAGS]&AWF_BOOST?"+":"-"),
+           (dump[index][AWM_FLAGS]&AWF_RESIST?"+":"-"),
+            dump[index][AWM_WEIGHT],
+            dump[index][AWM_VALUE],
+            dump[index][AWM_HANDS],
+            dtdump(dump[index][AWM_D_TYPE]) );
+    }
+    write_file(file,ausgabe);
+    write("AWM: Done.\n");
+    return 1;
+}
+
+int Unregister(string what)
+{
+    if (!allowed())
+        return -1;
+    if (!what)
+    {
+        write("Du solltest schon einen Filenamen angeben!\n");
+        return 0;
+    } 
+    if (member(armours,what))
+    {
+        m_delete(armours,what);
+        write("Unregistered "+what+" from 'armours'.\n");
+        return 1;
+    }
+    if (member(weapons,what))
+    {
+        m_delete(weapons,what);
+        write("Unregistered "+what+" from 'weapons'.\n");
+        return 1;
+    }
+    if (member(damagers,what))
+    {
+        m_delete(damagers,what);
+        write("Unregistered "+what+" from 'damagers'.\n");
+        return 1;
+    }
+    save_me(0);
+    return 0;
+}
+
+int ResetDamagers()
+{
+    if (!allowed())
+        return -1;
+    damagers = m_allocate(0,2);
+    save_me(1);
+    return 1;
+}
+
