diff --git a/doc/props/P_AUTOLOADOBJ b/doc/props/P_AUTOLOADOBJ
index 32b433d..3184fff 100644
--- a/doc/props/P_AUTOLOADOBJ
+++ b/doc/props/P_AUTOLOADOBJ
@@ -1,119 +1,141 @@
-NAME:
-    P_AUTOLOADOBJ                 "autoloadobj"
 
-DEFINIERT IN:
-    /sys/player/base.h
-
-BESCHREIBUNG:
-     Hiermit kann prinzipiell angegeben werden ob ein Objekt ueber das
-     Ausloggen eines Spielers (Reboot/ende) behalten werden soll.
-
-     Als Inhalt der Property koennen permanente Eigenschaften des Objektes
-     angegeben werden.
-     Beim Einloggen wird das Objekt neu erzeugt und P_AUTOLOADOBJ auf die
-     gespeicherten Werte gesetzt. Die Werte muessen allerdings selbst
-     verwaltet werden.
-
-     Bitte geht nicht davon aus, dass es waehrend des Setzens/Abfragens dieser
-     Prop einen this_player() oder ein this_interactive() geben muss.
-     Speziell ist this_interactive() nicht == /secure/login!
-     Ebenfalls muss das Objekt beim Setzen/Abfragen nicht in einem Spieler
-     sein.
-
-BEMERKUNGEN:
-     Autoloadobjekte werden beim Ausloggen nicht fallengelassen!
-
-BEISPIELE:
-     ## Variante 1: simples Objekt, bleibt einfach nur erhalten,
-     ##             Variablen werden nicht gesichert ##
-     void create() {
-      ...
-      SetProp(P_AUTOLOADOBJ,1);
-      ...
-     }
+P_AUTOLOADOBJ
+*************
 
 
-     ## Variante 2: Speicherung mehrerer Variablen ueber
-     ##             P_AUTOLOADOBJ (elegante Verwaltung)
+NAME
+====
 
-     // ein paar #defines fuer die Plaetze in der Speichervariablen
-     #define MY_AL_SHORT    0
-     #define MY_AL_ATTRM    1
-     #define MY_AL_OWNER    2
-     #define MY_AL_DESTRUCT 3
-
-     // die Variablen, die erhalten bleiben sollen
-     static object owner;
-     static int destruct_time;
-
-     // diese hier wird gerufen, wenn der Spieler gespeichert wird,
-     // wir packen also alle aktuellen Variablen in eine und geben die
-     // zum Speichern heraus ... wir nehmen hier ein Array (statt
-     // zB eines Mappings), weil das am wenigsten Platz braucht
-     static mixed* _query_autoloadobj() {
-      mixed *ret;
-      ret=allocate(4);
-      ret[MY_AL_SHORT] = QueryProp(P_SHORT);      // SHORT merken
-      ret[MY_AL_ATTRM] = QueryProp(P_M_ATTR_MOD); // einen Modifikator merken
-      ret[MY_AL_OWNER] = getuid(owner);           // ah, ein Besitzer!
-      ret[MY_AL_DESTRUCT]=destruct_time-time();   // und eine Lebensdauer!
-
-      return ret;
-
-      /*
-      // normalerweise wuerde man das einfach so schreiben:
-      return (({QueryProp(P_SHORT),
-                QueryProp(P_M_ATTR_MOD),
-                getuid(owner),
-                destruct_time-time()}));
-      */
-     }
-
-     // diese hier wird gerufen, wenn das Objekt neu im Spieler
-     // erzeugt wurde (Login), also packen wir das Speicherarray wieder
-     // aus und in alle entsprechenden Variablen
-     static mixed* _set_autoloadobj(mixed *new) {
-      // wenn das Format nicht mit dem oben uebereinstimmt ist was
-      // schiefgelaufen
-      if(pointerp(new) && !owner && sizeof(new)>4 &&
-         (owner=find_player(new[MY_AL_OWNER]))) {
-       // los, zuweisen!
-
-       SetProp(P_SHORT,      new[MY_AL_SHORT]);
-       SetProp(P_M_ATTR_MOD, new[MY_AL_ATTRM]);
-       destruct_time=        time()+new[MY_AL_DESTRUCT];
-
-       call_out(#'remove,new[3]);
-      } else call_out(#'remove,0);
-
-      return new;
-     }
+   P_AUTOLOADOBJ                 "autoloadobj"
 
 
-     ## Variante 3: und das gleiche mit Set/Querymethoden ##
-     // Prototypen fuer Set und Query-Methoden -> man Set
-     static mixed *my_query_autoloadobj();
-     static mixed *my_set_autoloadobj(mixed *new);
+DEFINIERT IN
+============
 
-     void create() {
-      // Binden der Methoden
-      Set(P_AUTOLOADOBJ, #'my_query_autoloadobj, F_QUERY_METHOD);
-      Set(P_AUTOLOADOBJ, #'my_set_autoloadobj, F_SET_METHOD);
+   /sys/player/base.h
 
-      // die werden nur von mir veraendert!
-      Set(P_AUTOLOADOBJ, PROTECTED, F_MODE_AS);
-      ...
-     }
 
-     static mixed *my_query_autoloadobj () {
-       // s.o.
-     }
+BESCHREIBUNG
+============
 
-     static mixed *my_set_autoloadobj (mixed *new) {
-       // s.o.
-     }
+   Hiermit kann prinzipiell angegeben werden ob ein Objekt ueber das
+   Ausloggen eines Spielers (Reboot/ende) behalten werden soll.
 
-SIEHE AUCH:
-     P_AUTOLOAD, SetProp
+   Als Inhalt der Property koennen permanente Eigenschaften des Objektes
+   angegeben werden.
+   Beim Einloggen wird das Objekt neu erzeugt und P_AUTOLOADOBJ auf die
+   gespeicherten Werte gesetzt. Die Werte muessen allerdings selbst
+   verwaltet werden.
+
+   Bitte geht nicht davon aus, dass es waehrend des Setzens/Abfragens dieser
+   Prop einen this_player() oder ein this_interactive() geben muss.
+   Speziell ist this_interactive() nicht == /secure/login!
+   Ebenfalls muss das Objekt beim Setzen/Abfragen nicht in einem Spieler
+   sein.
+
+
+BEMERKUNGEN
+===========
+
+   Autoloadobjekte werden beim Ausloggen nicht fallengelassen!
+
+
+BEISPIELE
+=========
+
+   ## Variante 1: simples Objekt, bleibt einfach nur erhalten,
+   ##             Variablen werden nicht gesichert ##
+   void create() {
+    ...
+    SetProp(P_AUTOLOADOBJ,1);
+    ...
+   }
+
+
+   ## Variante 2: Speicherung mehrerer Variablen ueber
+   ##             P_AUTOLOADOBJ (elegante Verwaltung)
+
+   // ein paar #defines fuer die Plaetze in der Speichervariablen
+   #define MY_AL_SHORT    0
+   #define MY_AL_ATTRM    1
+   #define MY_AL_OWNER    2
+   #define MY_AL_DESTRUCT 3
+
+   // die Variablen, die erhalten bleiben sollen
+   static object owner;
+   static int destruct_time;
+
+   // diese hier wird gerufen, wenn der Spieler gespeichert wird,
+   // wir packen also alle aktuellen Variablen in eine und geben die
+   // zum Speichern heraus ... wir nehmen hier ein Array (statt
+   // zB eines Mappings), weil das am wenigsten Platz braucht
+   static mixed* _query_autoloadobj() {
+    mixed *ret;
+    ret=allocate(4);
+    ret[MY_AL_SHORT] = QueryProp(P_SHORT);      // SHORT merken
+    ret[MY_AL_ATTRM] = QueryProp(P_M_ATTR_MOD); // einen Modifikator merken
+    ret[MY_AL_OWNER] = getuid(owner);           // ah, ein Besitzer!
+    ret[MY_AL_DESTRUCT]=destruct_time-time();   // und eine Lebensdauer!
+
+    return ret;
+
+    /*
+    // normalerweise wuerde man das einfach so schreiben:
+    return (({QueryProp(P_SHORT),
+              QueryProp(P_M_ATTR_MOD),
+              getuid(owner),
+              destruct_time-time()}));
+    */
+   }
+
+   // diese hier wird gerufen, wenn das Objekt neu im Spieler
+   // erzeugt wurde (Login), also packen wir das Speicherarray wieder
+   // aus und in alle entsprechenden Variablen
+   static mixed* _set_autoloadobj(mixed *new) {
+    // wenn das Format nicht mit dem oben uebereinstimmt ist was
+    // schiefgelaufen
+    if(pointerp(new) && !owner && sizeof(new)>4 &&
+       (owner=find_player(new[MY_AL_OWNER]))) {
+     // los, zuweisen!
+
+     SetProp(P_SHORT,      new[MY_AL_SHORT]);
+     SetProp(P_M_ATTR_MOD, new[MY_AL_ATTRM]);
+     destruct_time=        time()+new[MY_AL_DESTRUCT];
+
+     call_out(#'remove,new[3]);
+    } else call_out(#'remove,0);
+
+    return new;
+   }
+
+
+   ## Variante 3: und das gleiche mit Set/Querymethoden ##
+   // Prototypen fuer Set und Query-Methoden -> man Set
+   static mixed *my_query_autoloadobj();
+   static mixed *my_set_autoloadobj(mixed *new);
+
+   void create() {
+    // Binden der Methoden
+    Set(P_AUTOLOADOBJ, #'my_query_autoloadobj, F_QUERY_METHOD);
+    Set(P_AUTOLOADOBJ, #'my_set_autoloadobj, F_SET_METHOD);
+
+    // die werden nur von mir veraendert!
+    Set(P_AUTOLOADOBJ, PROTECTED, F_MODE_AS);
+    ...
+   }
+
+   static mixed *my_query_autoloadobj () {
+     // s.o.
+   }
+
+   static mixed *my_set_autoloadobj (mixed *new) {
+     // s.o.
+   }
+
+
+SIEHE AUCH
+==========
+
+   P_AUTOLOAD, SetProp
 
 24.Aug.2006 Gloinson@MG
