diff --git a/doc/lfun/AddExtraLook b/doc/lfun/AddExtraLook
index 7436f7e..279b496 100644
--- a/doc/lfun/AddExtraLook
+++ b/doc/lfun/AddExtraLook
@@ -2,9 +2,11 @@
 AddExtraLook()
 **************
 
-AddExtraLook() varargs int AddExtraLook(string look, [int duration,
-string key,
 
+FUNKTION
+========
+
+   varargs int AddExtraLook(string look, [int duration, string key,
    string lookende, object ob]);
 
 
@@ -14,117 +16,168 @@
    /std/living/description.c
 
 
+ARGUMENTE
+=========
+
+   string look:
+
+      * String, der in der Langbeschreibung des Lebewesens
+        zusaetzlich ausgegeben wird.
+
+      * zu rufender Funktionsname, wenn 'ob' angegeben ist
+
+   int duration:
+
+      * > 0: Dauer der Gueltigkeit des Extralooks in Sekunden.
+
+      * 0:   Unbegrenzt gueltiger Eintrag. Rebootfest.
+
+      * < 0: Bis Ende/Reboot bestehender Eintrag.
+
+   string key:
+      Schluesselwort, unter dem der Eintrag registriert wird und mit
+      dem man diesen auch mittels RemoveExtraLook() entfernen kann.
+      Sollte eindeutig sein! Ist 'key' nicht angeben, wird der
+      Objektname (object_name()) des setzenden Objekts benutzt.
+
+   string lookende:
+
+      * String, der an das Lebewesen (nur bei Spielern) ausgegeben
+        wird, wenn der eingetragene Extralook abgelaufen ist.
+
+      * zu rufender Funktionsname, wenn 'ob' angegeben ist
+
+   object ob:
+      Ein Objekt, an dem die in 'look' und 'lookende' abgelegten
+      Methoden bei Abfrage oder Ablauf aufgerufen werden. Die Methoden
+      bekommen das Living uebergeben und muessen selbst umgebrochene
+      Strings zurueckgeben.
+
+
 BESCHREIBUNG
 ============
 
    Der Extralook erscheint in der Langbeschreibung des Lebewesens.
-   Eintraege koennen mit dieser Funktion hinzugefuegt werden. Dies ist der
-   bevorzugte Weg, wenn ansonsten extra ein Objekt im Spielerinventar abgelegt
-   werden muesste.
 
+   Texte dafuer koennen mit dieser Funktion hinzugefuegt und verwaltet
+   werden. Wenn ihr nicht ohnehin unbedingt ein Objekt IM Spieler
+   ablegt (wie zB eine Ruestung mit einem Extralook) (1), dann ist
+   diese Methode bevorzugt zu verwenden.
 
+   Ueber die Angabe eines 'ob' koennen Looks auch dynamisch erstellt
+   werden, dabei werden dann 'look' bzw. 'lookende' als Methoden am
+   Objekt gerufen. (1) Ein so fuer AddExtraLook verwendetes Objekt
+   'ob' muss nicht wie bisher ueblich im Inv des Spieler liegen!
 
-   Alle Parameter bis auf <look> sind optional.
-
-
-ARGUMENTE
-=========
-
-   - string look:
-     String, der in der Langbeschreibung des Lebewesens zusaetzlich ausgegeben
-     wird.
-     Kann auch ein Funktionsname sein, wenn <ob> angegeben wird (s.u.).
-   - int duration:
-     > 0: Wie lang bleibt der Extralook gueltig (in Sekunden)? Anschliessend
-          wird er automatisch geloescht.
-     0:   Dieser Eintrag bleibt unbegrenzt gueltig.
-     < 0: Dieser Eintrag bleibt bis zum Ende/Reboot bestehen.
-   - string key:
-     Schluesselwort, unter dem der Eintrag registriert wird und mit dem man ihn
-     auch mittels RemoveExtraLook() entfernen kann. Sollte natuerlich
-     moeglichst eindeutig sein. ;-) Wenn <key> nicht angeben wird, wird der
-     Objektname (object_name()) benutzt.
-   - string lookende:
-     String, der an das Lebewesen (nur bei Spielern) ausgegeben wird, wenn der
-     eingetragene Extralook abgelaufen ist.
-     Kann auch ein Funktionsname sein, wenn <ob> angegeben wird.
-   - object ob:
-     Wenn hier ein Objekt angegeben wird, werden <look> und <lookende> als
-     Funktonsnamen aufgefasst. Diese Funktionen werden in <ob> aufgerufen, wenn
-     der Extralook des Lebewesen angezeigt wird bzw. der eingetragene Extralook
-     abgelaufen ist. Diese Funktionen bekommen das jeweilige Lebenwesen als
-     Objekt uebergeben. Sie muessen einen String zurueckliefern, der ausgegeben
-     wird. Dieser String wird direkt so ausgeben, also selber fuer Zeilenumbruch
-     etc. sorgen!
-     WICHTIG: Das Objekt sollte nach Moeglichkeit eine Blueprint sein, da das
-     ganze nix mehr ausgibt, sobald der Clone zerstoert wird, falls hier
-     einer angeben wird. Wenn ihr keine BP uebergebt: Wisst, was ihr tut. ;-)
-
-
-RUECKGABEWERTE
-==============
-
-   > 0, falls der Eintrag erfolgreich registriert wurde.
-   < 0 sonst.
-     -1: <key> war nicht gueltig und es konnte keiner ermittelt werden.
-     -2: <look> war kein gueltiger String.
-     -3: <duration> war kein Integer.
-     -4: unter <key> gibt es schon einen Eintrag.
+   Direkt angegebene Texte (also nicht von einem Objekt 'ob' bezogen)
+   werden durch replace_personal() gefiltert und unter Beibehaltung
+   existierender Umbrueche auf 78 Zeichen umgebrochen.
 
 
 BEMERKUNGEN
 ===========
 
-   Die Strings <look> und <lookende> werden vor Ausgabe durch
-   replace_personal() geschickt, daher ist die Verwendung von @WER1, @WESSEN1
-   usw. moeglich (s. replace_personal). Dies gilt aber _nicht_ fuer den Fall,
-   dass die entsprechenden Funktionen in <ob> gerufen werden, dann muessen die
-   Funktionen selber umbrechen, etc.
-   Nach replace_personal() werden die Strings noch von break_string() auf 78
-   Zeilen umgebrochen, allerdings bleiben dabei vorhandene Umbrueche erhalten.
-   Die Meldung von <lookende> bzw. der Funktionsaufruf erfolgt, wenn der
-   Extralook der Lebewesen das erste Mal nach Ablauf der Gueltigkeit aufgerufen
-   wird.
+   * Die Meldung von <lookende> bzw. der Funktionsaufruf erfolgt,
+     wenn der Extralook der Lebewesen das erste Mal nach Ablauf der
+     Gueltigkeit aufgerufen wird.
+
+   * Das uebergbene Objekt sollte fuer permanente Eintraege eine
+     Blueprint sein, da Clones irgendwann (spaetestens mit Reboot)
+     zerstoert werden und der Eintrag dann bei Abfrage automatisch
+     geloescht wird.
+
+   * Folgerung: Clone-Objekte koennen fuer selbst beschraenkt
+     temporaere Extralooks benutzt werden.
+
+
+RUECKGABEWERTE
+==============
+
+   Siehe auch /sys/living/description.h fuer Konstanten.
+
+   * 1, falls der Eintrag erfolgreich registriert wurde.
+
+   * < 0 sonst.
+
+     * -1: <key> war nicht gueltig und es konnte keiner ermittelt
+       werden.
+
+     * -2: <look> war kein gueltiger String.
+
+     * -3: <duration> war kein Integer.
+
+     * -4: unter <key> gibt es schon einen Eintrag.
 
 
 BEISPIELE
 =========
 
-   # einfacher Eintrag, "fuer die Ewigkeit"
+   // (1) einfacher Eintrag, "fuer die Ewigkeit"
    living->AddExtraLook("@WER1 hat den Drachengott der SSP besiegt.");
 
-   # Eintrag der nach 1h automatisch weg ist.
+   // (2) Eintrag der nach 1h automatisch weg ist.
    living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600);
 
-
-
-   # Eintrag mit bestimmten Schluessel, damit man ihn wieder entfernen kann.
+   // (3) Eintrag mit bestimmten Schluessel, damit man ihn wieder entfernen kann
    living->AddExtraLook("@WER1 ist ganz mit Marmelade bedeckt.", 3600,
                         "humni_marmeladen_look");
 
-
-
-   # Mit "Ende"-Meldung, aber kein eigener Schluessel.
+   // (4) Mit "Ende"-Meldung, aber kein eigener Schluessel
    living->AddExtraLook("@WER1 ist patschnass.", 1200, 0,
                         "Du bist endlich wieder trocken. Puuh.");
 
+   // (5) Mit Objekt, welches den Extralook dynamisch erzeugt
+   living->AddExtraLook("get_my_special_extralook", 3600, 0, 0,
+                        this_object());
+   // In diesem Fall muss this_object() natuerlich die Funktion
+   // "get_my_special_extralook()" definieren, die einen String zurueckgibt
 
-
-   # Mit Objekt, was den Extralook dynamisch erzeugt
-   living->AddExtraLook("get_my_special_extralook", 3600, 0, 0, this_object());
-     In diesem Fall muss this_object() natuerlich die Funktion
-     "get_my_special_extralook()" definieren, die einen String zurueckgibt.
-
-   # Mit Objekt, was den Extralook und die Endemeldung dynamisch erzeugt
+   // (6) Mit Objekt, welches den Extralook dynamisch erzeugt
+   // Hier wird explizit die Blueprint uebergeben, der Extralook ist also
+   // rebootfest.
    living->AddExtraLook("get_my_special_extralook", 3600, 0,
-                        "extralookende", this_object());
+                        "extralookende", blueprint(this_object()));
+
+   // Mit Objekt, was den Extralook und die Endemeldung dynamisch erzeugt
+   // und keine festgelegte Existenzdauer hat, sondern sich aufgrund
+   // eigener Konditionen entsorgt
+   void set_extra_look(object living) {
+     object dyntemplook = clone_object("/path/to/some/object");
+     if(living->AddExtraLook("get_my_special_extralook", 0,
+                             object_name(dyntemplook),
+                             0, dyntemplook) == XL_OK)
+       dyntemplook->SetProp(P_INTERNAL_EXTRA_LOOK, living);
+     else
+       dyntemplook->remove();
+   }
+
+   // entsprechendes Objekt:
+   varargs int remove(int silent) {
+     object ob = QueryProp(P_INTERNAL_EXTRA_LOOK);
+     // wenn der Spieler da ist, entfernen wir den Look regulaer
+     if(objectp(ob))
+       ob->RemoveExtraLook(object_name(this_object()));
+     return ::remove(silent);
+   }
+
+   void reset() {
+     if(!random(10))
+       remove();
+     else
+       ::reset();
+   }
 
 
 SIEHE AUCH
 ==========
 
-   RemoveExtraLook(),
-   replace_personal(), break_string()
-   P_INTERNAL_EXTRA_LOOK
+   Verwandt:
+      *RemoveExtraLook()*, *P_INTERNAL_EXTRA_LOOK*
 
-14.05.2007, Zesstra
+   Sonstiges:
+      *replace_personal()*, *break_string()*
+
+   Fuer Spielerobjekte:
+      *P_EXTRA_LOOK*
+
+5. Juni 2017 Gloinson
