diff --git a/std/clothing/wear.c b/std/clothing/wear.c
new file mode 100644
index 0000000..dcde4bd
--- /dev/null
+++ b/std/clothing/wear.c
@@ -0,0 +1,594 @@
+// MorgenGrauen MUDlib
+//
+// clothing/wear.c -- Funktionen rund ums Anziehen/Tragen von Kleidung.
+//
+// $Id: combat.c 6243 2007-03-15 21:10:21Z Zesstra $
+
+#pragma strict_types
+#pragma save_types
+#pragma no_clone
+#pragma pedantic
+#pragma range_check
+
+#define NEED_PROTOTYPES
+
+#include <thing/properties.h>
+#include <thing/commands.h>
+#include <thing/description.h>
+#include <living/clothing.h>
+#include <clothing.h>
+#include <living/combat.h>
+#include <language.h>
+#include <defines.h>
+#include <new_skills.h>
+#include <moving.h>
+
+// Globale Variablen
+nosave int  flaw, ftime;
+
+void create()
+{
+  // Einige Properties sollten nicht von aussen gesetzt werden koennen
+  Set(P_WORN, PROTECTED, F_MODE);
+  Set(P_LAST_USE, PROTECTED, F_MODE_AS);
+  Set(P_RESTRICTIONS,([]),F_VALUE);
+
+  // Bekleidung benoetigt Kommandos, mit denen man sie an- und
+  // ausziehen kann
+  AddCmd( ({"zieh","ziehe"}),"ziehe" );
+  AddCmd( ({"trag","trage"}),"do_wear" );
+}
+
+// aktuelles Lebewesen, was diese Kleidung (oder auch Ruestung) zur Zeit
+// traegt.
+public object QueryUser()
+{
+  return QueryProp(P_WORN);
+}
+
+
+// Ausgabe von Meldungen ueber write() oder _notify_fail(), je nachdem, ob der
+// Spieler alles anzieht oder was bestimmtes.
+protected void msg(string str, mixed fl) {
+  if (!stringp(str)) {
+    return;
+  }
+  if (fl) {
+    write(str);
+  }
+  else {
+    _notify_fail(str);
+  }
+}
+
+/*
+ * Ausgabe einer Meldung beim Anziehen geht nur an Spieler, nicht an NPC.
+ * Die Umgebung bekommt immer eine Meldung.
+ */
+varargs void doWearMessage(int all) {
+  string *str,s1;
+  mixed wearmsg;
+
+  if(wearmsg=QueryProp(P_WEAR_MSG)) { // Ist eine WearMsg gesetzt?
+    if(closurep(wearmsg)) { // Evtl. gar als extra Fkt.?
+
+      str = funcall(wearmsg, PL);
+      if(interactive(PL)) {
+         // Im Falle, dass all gesetzt ist, wird als Indent der Name des
+         // angezogenen Objektes gesetzt. (trag alles)
+         write(break_string(str[0],78,
+                (all?(Name(WER)+": "):0), BS_LEAVE_MY_LFS));
+      }
+      //(Zesstra): say() ist hier bloed, weil es an das Env vom this_player()
+      //ausgibt, sofern der existiert. So koennen Spieler die meldung kriegen,
+      //obwohl die laengst woanders sind (z.B. Sequenzen)
+      //Daher nun Ausgabe an das Env vom Env (wenn das kein Raum sein sollte,
+      //was durchaus sein koennte, macht tell_room() nix). 
+      if ( objectp(environment()) && objectp(environment(environment())) )
+          tell_room(environment(environment()),
+            break_string(str[1], 78, 0, BS_LEAVE_MY_LFS),({PL}) );
+
+      return;
+    }
+    else if(interactive(PL)) {
+      s1 = replace_personal(sprintf(wearmsg[0],"@WEN2"), ({PL,ME}), 1);
+
+      write(break_string(s1,78,(all?(Name(WER)+": "):0), BS_LEAVE_MY_LFS));
+    }
+
+    s1 = replace_personal(sprintf(wearmsg[1],"@WER1","@WENU2"),
+                            ({PL, ME}), 1);
+ 
+    if ( objectp(environment()) && objectp(environment(environment())) )
+        tell_room(environment(environment()),
+            break_string(s1, 78, 0, BS_LEAVE_MY_LFS),({ PL }) );
+
+    return;
+  }
+  /*
+   * Keine WearMsg gesetzt. Ausgabe der Default-Meldungen.
+   */
+  else if(interactive(PL)) {
+    write(break_string("Du ziehst " + name(WEN,1) + " an.",78,
+     (all?(Name(WER)+": "):0)));
+  }
+  if ( objectp(environment()) && objectp(environment(environment())) )
+      tell_room(environment(environment()),break_string(PL->Name(WER)
+            + " zieht " + name(WEN,0) +" an.",78), ({PL}));
+}
+
+/*
+ * Ausgabe einer Meldung beim Ausziehen geht nur an Spieler, nicht an NPC.
+ * Die Umgebung bekommt natuerlich immer eine Meldung.
+ */
+void doUnwearMessage(object worn_by, int all)
+{
+  string *str,s1;
+  mixed msg;
+
+  if(!objectp(worn_by)) { // Na huch, gar nicht angezogen? Abbruch.
+    return;
+  }
+
+  if(msg=QueryProp(P_UNWEAR_MSG)) { // Ist eine UnwearMsg gesetzt?
+    if(closurep(msg)) { // Oho! Gar gleich als Fkt.?
+
+      str = funcall(msg, worn_by);
+      if(interactive(worn_by)) {
+         tell_object(worn_by,break_string(str[0], 78,
+                                 (all?(Name(WER)+": "):0),BS_LEAVE_MY_LFS));
+      }
+
+      //(Zesstra): say() ist hier bloed, weil es an das Env vom this_player()
+      //ausgibt, sofern der existiert. So koennen Spieler die meldung kriegen,
+      //obwohl die laengst woanders sind (z.B. Sequenzen)
+      //Daher nun Ausgabe an das Env vom worn_by (wenn das kein Raum sein sollte,
+      //macht tell_room() nix). 
+      if ( objectp(environment(worn_by)) )
+          tell_room(environment(worn_by),
+              break_string(str[1],78, 0, BS_LEAVE_MY_LFS),({ worn_by }) );
+      
+      return;
+    }
+    else if(interactive(worn_by)) {
+      s1 = replace_personal(sprintf(msg[0],"@WEN2"),
+                      ({worn_by,ME}), 1);
+
+      tell_object(worn_by,break_string(s1,78,
+                              (all?(Name(WER)+": "):0), BS_LEAVE_MY_LFS));
+    }
+
+    s1 = replace_personal(sprintf(msg[1],"@WER1","@WENU2"),
+                    ({worn_by, ME }), 1);
+
+    if ( objectp(environment(worn_by)) )
+        tell_room(environment(environment()),
+            break_string(s1,78, 0, BS_LEAVE_MY_LFS),({ worn_by }) );
+    return;
+  }
+  /*
+   * Keine UnwearMsg gesetzt. Ausgabe der Default-Meldungen.
+   */
+  else if(interactive(worn_by)) {
+    tell_object(worn_by,break_string("Du ziehst " + name(WEN,1) + " aus.",78,
+     (all?(Name(WER)+": "):0)));
+  }
+  if ( objectp(environment(worn_by)) )
+      tell_room(environment(worn_by), break_string(worn_by->Name(WER)
+            + " zieht " + name(WEN,0) + " aus.",78), ({ worn_by }) );
+}
+
+// Diese Funktion wird aufgerufen, wenn die Ruestung wirklich angezogen
+// wird
+protected void InformWear(object pl, int silent, int all) {
+    return;
+}
+
+// Diese Funktion wird aufgerufen, wenn die Ruestung wirklich ausgezogen
+// wird
+protected void InformUnwear(object pl, int silent, int all) {
+    return;
+}
+
+// liefert Werte <0 zurueck, wenn der Spieler die Kleidung _nicht_ 
+// anziehen darf.
+// Hierbei steht -1 dafuer, dass der Aufrufer return 0 machen sollte,
+// <= -2 sollte zur einem return !all fuehren.
+protected int _check_wear_restrictions(int silent, int all) {
+  mixed   type,res;
+  object  *armours;
+
+  // Man kann nur Kram anziehen, die man bei sich traegt
+  if (environment()!=PL) {            
+    msg(break_string("Du musst "+name(WEN,1)+" erst nehmen!",78,
+            (all?(Name(WER)+": "):0)), all);
+    return(-1);
+  }
+
+  // Eine getragene Ruestung kann man nicht nochmal anziehen
+  if (QueryProp(P_WORN)) {
+    msg(break_string("Du traegst "+name(WEN,1)+" bereits.",78,
+          (all?(Name(WER)+": "):0)), all);
+    return(-1);
+  }
+
+  // Diese Funktion versucht immer, TP anzuziehen (*args*). Es gibt aber viele
+  // Magier, die ohne TP oder mit dem falschen TP anziehen wollen. Daher mal
+  // pruefen und ggf. Fehler ausloesen.
+  if (!this_player())
+      raise_error("Kein this_player() existent beim Anziehen!\n");
+  else if (this_player() != environment())
+      raise_error("Meine Umgebung beim Anziehen ist nicht this_player()!\n");
+
+  // Ueber P_RESTRICTIONS kann man einige Restriktionen definieren, ohne
+  // gleich auf eine WearFunc zurueckgreifen zu muessen.
+  // Die Auswertung erfolgt ueber den RestrictionChecker
+  if ((res=QueryProp(P_RESTRICTIONS)) && mappingp(res) &&
+      (res=(string)"/std/restriction_checker"->check_restrictions(PL,res))
+      && stringp(res)) {  
+    msg(break_string(res,78,(all?(Name(WER)+": "):0)),all);
+    return(-1);
+  }
+
+  // Ist eine WearFunc gesetzt, wird diese aufgerufen.
+  if (objectp(res=QueryProp(P_WEAR_FUNC)) && 
+      !(res->WearFunc(ME, silent, environment()))) {
+    // Eine Meldung muss von der WearFunc ausgegeben werden
+    return(-2);
+  }
+
+  // scheinbar darf man das hier anziehen. ;-)
+  return 0;
+}
+
+protected void _informwear(int silent, int all) {
+
+  // Eine Meldung ausgeben, wenn das silent-Flag nicht gesetzt ist
+  if (!silent) {
+    doWearMessage(all);
+  }
+
+  // Inform-Funktion aufrufen
+  InformWear(PL, silent, all);
+}
+
+// Die Funktion, die das eigentliche Anziehen durchfuehrt
+varargs int DoWear(int silent, int all) {
+  int nh;
+
+  // Bedingungen pruefen, _check_restrictions() gibt die notwendigen Meldungen
+  // an den Spieler aus.
+  int res = _check_wear_restrictions(silent, all);
+  if (res == -1)
+    return(0);
+  else if (res <= -2)
+    return(!all);
+
+  // Der Check auf freie Haende muss nach allen anderen Checks aus Kleidung
+  // und Ruestung erfolgen und ist im Prinzip identisch fuer beide. Daher wird
+  // der hier in dieser Funktion gemacht.
+  // Soll das Objekt Haende "benutzen"? Steht da auch wirklich ein
+  // Integer-Wert drin? ich mach da jetzt ein raise_error(), das soll
+  // schliesslich gefixt werden. Ausserdem spart es nen Workaround beim
+  // Ausziehen.
+  if (!intp(nh=QueryProp(P_NR_HANDS))) {
+    raise_error(sprintf("Invalid P_NR_HANDS in %O",object_name()));
+  }
+  // Wenn Haende benutzt werden sollen, muss natuerlich auch getestet
+  // werden, ob das ueberhaupt geht
+  if (nh>0) {
+    if (!(PL->UseHands(ME, nh))) {
+      // Schade, nicht genug Haende frei -> Meldung ausgeben
+      write(break_string("Du hast keine Hand mehr frei.",78,
+            (all?(Name(WER)+": "):0)));
+      return(!all);
+    }
+  }
+
+  // OK, die Ruestung kann angezogen werden.
+  // Behinderung beim Wechsel nur fuer Spieler
+  if (query_once_interactive(PL))
+  // Wenn das Ganze ,,wirklich'' eine Kleidung/Ruestung ist und kein SMS
+  // oder aehnliches...
+  if (!QueryProp(P_WEAPON_TYPE)) {
+    // Aktion noch setzen, Spieler hat ja was angezogen
+    PL->SetProp(P_LAST_WEAR_ACTION,({WA_WEAR,time()}));
+    // Im Kampf verliert der Spieler durch Kleidungswechsel eine Runde.
+    if (PL->InFight()) {
+      PL->SetProp(P_ATTACK_BUSY,1);
+    }
+  }
+  // Eintragen in P_CLOTHING/P_ARMOURS
+  PL->Wear(this_object());
+
+  PL->SetProp(P_EQUIP_TIME,time());
+  SetProp(P_WORN, PL);
+  SetProp(P_EQUIP_TIME,time());
+
+  // ggf. andere Objekte informieren etc.
+  _informwear(silent, all);
+
+  // Fertig mit dem Anziehen. Vorgang beenden bzw. mit anderen
+  // Ruestungen fortfahren
+  return !all;
+}
+
+
+// liefert 0 zureck, wenn die Kleidung/Ruestung ausgezogen werden kann
+// bei M_NOCHECK ist das Ausziehen immer erlaubt, allerdings wird
+// P_REMOVE_FUNC auch dann gerufen (wenn auch ignoriert).
+// <0 verbietet das Ausziehen
+protected int _check_unwear_restrictions(object worn_by, int silent, 
+                                            int all)
+{
+  // Nicht getragene Ruestungen kann man auch nicht ausziehen
+  if (!objectp(worn_by)) {
+      return(-2);
+  }
+
+  // Ist eine RemoveFunc gesetzt, wird diese aufgerufen
+  // Im Falle von M_NOCHECK wird das Ergebnis allerdings ignoriert.
+  mixed res=QueryProp(P_REMOVE_FUNC);
+  if (objectp(res)
+      && !res->RemoveFunc(ME,silent,worn_by)
+      && !(silent & M_NOCHECK)
+      )
+  {
+      // Eine Meldung muss von der RemoveFunc ausgegeben werden
+      return(-2);
+  }
+
+  // generell hebt M_NOCHECK die Restriktionen auf - sonst kommt es zu
+  // massiven Inkonsistenzen beim Bewegen mit M_NOCHECK.
+  if (silent & M_NOCHECK)
+    return 1;
+
+  // Eine verfluchte Ruestung kann man natuerlich nicht ausziehen
+  res=QueryProp(P_CURSED);
+  if (res ) {
+    if (stringp(res)) {
+      // Stand in P_CURSED ein String? Dann diesen ausgeben
+      tell_object(worn_by,      
+          (res[<1]=='\n' ? res : break_string(res,78,
+            (all?(Name(WER)+": "):0))));
+    }
+    else {
+      // Sonst eine Standard-Meldung ausgeben
+      tell_object(worn_by,break_string(
+          "Du kannst " + name(WEN) + " nicht ausziehen, " + QueryPronoun(WER)
+          + " ist verflucht worden.\n",78,(all?(Name(WER)+": "):0)));
+    }
+    return(-2);
+  }
+
+  // Ausziehen moeglich
+  return(1);
+}
+
+protected void _informunwear(object worn_by, int silent, int all) {
+
+  // Inform-Funktion aufrufen
+  InformUnwear(worn_by, silent, all);
+
+  // Meldung ausgeben, wenn das silent-Flag nicht gesetzt ist
+  if (!(silent&M_SILENT)) {
+    doUnwearMessage( worn_by, all );
+  }
+}
+
+// Die Funktion, die das eigentliche Ausziehen durchfuehrt
+// hier steht nur drin, was auf jeden Fall fuer Kleidungen und Ruestungen
+// gleich ist, damit man bei Ruestungen diese Funktion nicht ueberschreiben
+// muss.
+varargs int DoUnwear(int silent, int all) {
+  object worn_by;
+  int nh;
+
+  // Das Flag "silent" wird in der RemoveFunc() etwas anders behandelt
+  // als ueberall anders. Deshalb wird M_SILENT gesetzt, sofern "silent"
+  // _irgendeinen_ Wert ausser M_NOCHECK hatte.
+  if ( silent & ~M_NOCHECK )
+      silent |= M_SILENT;
+
+  // Standard-Notfiyfail setzen.
+  if (all)
+    notify_fail("Alles ausgezogen, was ging.\n");
+
+  // Hat das Objekt Haende "benutzt"? Steht da auch wirklich ein
+  // Integer-Wert drin? Wenn nicht, mach ich nen raise_error(), das duerfte
+  // eigentlich gar nicht passieren. Pruefung mal am Anfang machen, bevor
+  // irgendwas anderes (RemoveFunc()) passiert ist.
+  if (!intp(nh=QueryProp(P_NR_HANDS))) {
+    raise_error(sprintf("Invalid P_NR_HANDS in %O",object_name()));
+  }
+
+  worn_by=QueryProp(P_WORN);
+  // darf ausgezogen werden? Wenn nicht, Ende.
+  int res = _check_unwear_restrictions(worn_by,silent,all);
+  if (res < 0)
+    return(!all);
+
+  // OK, alles klar, die Ruestung wird ausgezogen
+  worn_by->Unwear(ME);
+
+  // Benutzte Haende wieder freigeben
+  if (nh>0) {
+    worn_by->FreeHands(ME);
+  }
+
+  worn_by->SetProp(P_EQUIP_TIME, time());
+  SetProp(P_WORN, 0);
+
+  // Flag noch setzen, Spieler hat ja was ausgezogen
+  // Aber nur wenns auch der Spieler selbst ist.
+  // und wenn das wirklich eine Ruestung und kein SMS o.ae. ist.
+  if (PL && PL==worn_by && !QueryProp(P_WEAPON_TYPE)) {
+    //Behinderung beim Wechsel nur fuer Spieler
+    if (query_once_interactive(PL)) {
+      PL->SetProp(P_LAST_WEAR_ACTION,({WA_UNWEAR,time()}));
+      if (PL->InFight()) { 
+        PL->SetProp(P_ATTACK_BUSY,1);
+      }
+    }
+  }
+
+  // ok, nun noch andere Objekte informieren.
+  _informunwear(worn_by,silent,all);
+
+  // Fertig mit dem Anziehen. Vorgang beenden bzw. mit anderen
+  // Ruestungen fortfahren
+  return !all;
+}
+
+protected int _do_wear(string str, int silent, int all) {
+  int *last;
+
+  // Standard-Notfiy-Fail setzen.
+  if (all)
+    notify_fail("Alles angezogen, was ging.\n");
+
+  // Ist diese Ruestung ueberhaupt gemeint? Bei "trage alles" ist dies
+  // natuerlich immer der Fall
+  if (!str || (!all && !id(str))) {
+      return 0;
+  }
+
+  // Vielleicht darf der Spieler ja gar nix mehr anziehen.
+  if ((object)PL->InFight()) {        
+    last=(int*)PL->QueryProp(P_LAST_WEAR_ACTION);
+      if (pointerp(last) && (last[0]==WA_UNWEAR) && ((time()-last[1])<2)) {
+        notify_fail("Du hast doch gerade erst etwas ausgezogen!\n"
+            "So schnell bist Du nicht!\n");        
+        return 0;        
+      }
+  }
+
+  // Auf zum eigentlichen Anziehen
+  return DoWear(silent, all);
+
+}
+
+// Funktion, die das "trage"/"ziehe * an"-Kommando auswertet
+varargs int do_wear(string str, int silent) {  
+  int all;  
+
+  // Hat der Spieler "trage alles" eingegeben?
+  all=(str=="alles" || str=="alle kleidung" || str=="alle bekleidung");
+  
+  return(_do_wear(str,silent,all));
+}
+
+protected int _do_unwear(string str, int silent, int all) {
+  int * last;
+
+  // Ist diese Ruestung ueberhaupt gemeint? Und hat dieser Spieler sie
+  // auch wirklich an?
+  if (!stringp(str) || (!all && !id(str))) {
+    return 0;
+  }
+
+  if (!QueryProp(P_WORN)) { 
+    if (all) {  
+      notify_fail("Alles ausgezogen, was ging.\n");
+      return 0;
+    }
+    if (!Query(P_ARTICLE) || QueryProp(P_PLURAL)) {
+      notify_fail( break_string(
+            "Du traegst k"+name(WEN,0)+".",78) );
+    }
+    else {    
+      notify_fail( break_string(
+           "Du traegst "+name(WEN,1)+" nicht.",78) );  
+    }
+    return 0;
+  }
+
+  // Vielleicht darf der Spieler ja gar nichts mehr ausziehen.
+  if ((object)PL->InFight()) {
+    last=(int*)PL->QueryProp(P_LAST_WEAR_ACTION);
+    if (pointerp(last) && (last[0]==WA_WEAR) && ((time()-last[1])<2)) {
+      notify_fail("Du hast doch gerade erst etwas angezogen!\n"              
+          "So schnell bist Du nicht!\n");
+      return 0;
+    }
+  }
+  // Auf zum eigentlichen Ausziehen
+  return DoUnwear(silent, all);
+}
+
+// Die Funktion, die das "ziehe * aus"-Kommando auswertet
+varargs int do_unwear(string str, int silent) {
+  int all;
+
+  all=(str=="alles" || str=="alle kleidung" || str=="alle bekleidung");
+
+  return(_do_unwear(str,silent,all));
+}
+
+// Funktion, die das "ziehe"-Kommando auswertet
+int ziehe(string str) {   
+  string ob;
+
+  // Uebergebenes Argument pruefen
+  if (!stringp(str)) {
+    return 0;  
+  }
+
+  // Ist ANziehen gemeint?
+  if (sscanf(str, "%s an", ob)==1) {
+      return do_wear(ob );
+  }
+
+  // Oder ist AUSziehen gemeint?
+  if (sscanf(str, "%s aus", ob)==1 ) { 
+      return do_unwear(ob);
+  }
+
+  // Ok, es geht wohl weder ums an- noch ums ausziehen
+  return 0;
+}
+
+
+// Beschaedigen des Kleidungsstuecks
+
+// Direktes Beschaedigen der Kleidung durch Setzen der Prop gibts nicht. ;-)
+// Das geht aus Kompatibilitaetgruenden bei Ruestungen, aber nicht mehr bei
+// Kleidung. Punkt.
+static mixed _set_item_damaged(mixed arg) {
+  return(QueryProp(P_DAMAGED));
+}
+
+// Will man eine Kleidung beschaedigen oder reparieren, so macht man das
+// am besten ueber die Funktion Damage(argument). Positive Argumente
+// bedeuten eine Beschaedigung, negative eine Reparatur. Der Rueckgabewert
+// ist die wirklich durchgefuehrte Aenderung des Beschaedigungswertes
+int Damage(int new_dam) {
+  return 0;
+}
+
+// Wird die Kleidung einer Belastung ausgesetzt (bei Ruestungen z.B. bei einem
+// Angriff eines Gegners), dann wird TakeFlaw() aufgerufen. Bei Kleidungen
+// koennte man ja per P_SENSITIVE arbeiten oder ein Magier ruft bei Aktionen
+// TakeFlaw() auf.
+varargs void TakeFlaw(mixed dam_types,mapping einfos) {   
+  int quality;
+
+  // Ist der Ruestung eine Qualitaet gesetzt worden, so kann es zu einer
+  // allmaehlichen Beschaedigung der Ruestung kommen. Im if() flaw gleich
+  // hochzaehlen.
+  if ((quality=QueryProp(P_QUALITY)) && !((++flaw) % quality)) {      
+    Damage(1);
+  }
+
+  // Zeitpunkt des ersten Aufrufes festhalten
+  if (!ftime)   
+    ftime=time();
+}
+
+// Die Flaw-Daten koennen natuerlich auch abgerufen werden
+mixed *QueryFlaw() {
+  return ({flaw,ftime,dtime(ftime)});
+}
+
+public status IsClothing() {return 1;}
+
