diff --git a/doc/lfun/InsertSensitiveObject b/doc/lfun/InsertSensitiveObject
index c89cef8..534db19 100644
--- a/doc/lfun/InsertSensitiveObject
+++ b/doc/lfun/InsertSensitiveObject
@@ -1,48 +1,68 @@
+
 InsertSensitiveObject()
-FUNKTION:
-     void InsertSensitiveObject(object ob, mixed *arg)
+***********************
 
-DEFINIERT IN:
-     /std/container/inventory.c
-     generalizes /std/living/inventory.c
 
-BESCHREIBUNG:
-     Fuegt "ob" in die Benachrichtigungslisten des Containers ein.
-     Wird von thing/moving.c im Ziel-Environment gerufen, wenn
-     P_SENSITIVE gesetzt ist.
+FUNKTION
+========
 
-BEMERKUNGEN:
-     Setzt man P_SENSITIVE nicht als Default sondern situationsabhaengig,
-     dann muss man auch InsertSensitiveObject() im Environment
-     auch selbst rufen!
+   void InsertSensitiveObject(object ob, mixed *arg)
 
-BEISPIEL:
-     // Fackel (inheriting lightsource)
-     // wenn angezuendet, aendert es die Eigenschaften und wird zum
-     // aktiven Objekt - das muss man dem environment() mitteilen
-     static int light(string str) {
-      int i;
-      i=::light(str);
-      if(i && QueryProp(P_LIGHT)>0) {
-       SetProp(P_SENSITIVE,
-        ({({SENSITIVE_INVENTORY_TRIGGER,DT_FIRE,120})}));
-       if(environment())
-        environment()->InsertSensitiveObject(this_object(),
-					     QueryProp(P_SENSITIVE));
-      }
-      return i;
-     }
 
-     - falls ein empfindliches Objekt im environment() ist, dann wird
-       in diesem nun eventuell (Treshold) trigger_sensitive_inv()
-       gerufen
+DEFINIERT IN
+============
 
-SIEHE AUCH:
-     P_SENSITIVE
-     RemoveSensitiveObject
-     insert_sensitive_inv_trigger, insert_sensitive_inv
-     P_SENSITIVE_ATTACK, P_SENSITIVE_INVENTORY, P_SENSITIVE_INVENTORY_TRIGGER
-     CheckSensitiveAttack
+   /std/container/inventory.c
+   generalizes /std/living/inventory.c
+
+
+BESCHREIBUNG
+============
+
+   Fuegt "ob" in die Benachrichtigungslisten des Containers ein.
+   Wird von thing/moving.c im Ziel-Environment gerufen, wenn
+   P_SENSITIVE gesetzt ist.
+
+
+BEMERKUNGEN
+===========
+
+   Setzt man P_SENSITIVE nicht als Default sondern situationsabhaengig,
+   dann muss man auch InsertSensitiveObject() im Environment
+   auch selbst rufen!
+
+
+BEISPIEL
+========
+
+   // Fackel (inheriting lightsource)
+   // wenn angezuendet, aendert es die Eigenschaften und wird zum
+   // aktiven Objekt - das muss man dem environment() mitteilen
+   static int light(string str) {
+    int i;
+    i=::light(str);
+    if(i && QueryProp(P_LIGHT)>0) {
+     SetProp(P_SENSITIVE,
+      ({({SENSITIVE_INVENTORY_TRIGGER,DT_FIRE,120})}));
+     if(environment())
+      environment()->InsertSensitiveObject(this_object(),
+                                           QueryProp(P_SENSITIVE));
+    }
+    return i;
+   }
+
+   - falls ein empfindliches Objekt im environment() ist, dann wird
+     in diesem nun eventuell (Treshold) trigger_sensitive_inv()
+     gerufen
+
+
+SIEHE AUCH
+==========
+
+   P_SENSITIVE
+   RemoveSensitiveObject
+   insert_sensitive_inv_trigger, insert_sensitive_inv
+   P_SENSITIVE_ATTACK, P_SENSITIVE_INVENTORY, P_SENSITIVE_INVENTORY_TRIGGER
+   CheckSensitiveAttack
 
 25.Apr.2001, Gloinson@MG
-
