diff --git a/doc/lfun/GuardExit b/doc/lfun/GuardExit
index 1cdf8cc..88da3c9 100644
--- a/doc/lfun/GuardExit
+++ b/doc/lfun/GuardExit
@@ -1,85 +1,111 @@
-FUNKTION:
-     protected <int|<string|closure>* >* GuardExit(object room, int hookid,
-                                                   <string|closure>* hdata);
 
-DEFINIERT IN:
-     /std/npc/moving.c
-
-ARGUMENTE:
-     room
-          Der den Hook ausloesende Raum (environment())
-     hookid
-          Die ID des Hooks (H_HOOK_EXIT_USE)
-     hdata
-          Ein Array mit 3 Elementen:
-          ({
-              verb - Das Kommandoverb/Ausgangsname (string)
-              dest - Zielraum (string) oder closure (special exits)
-              msg  - Bewegungsrichtung (string) oder 0
-          })
-
-BESCHREIBUNG:
-     Ist diese Funktion in einem NPC definiert, traegt sich der NPC bei jeder
-     Bewegung automatisch als Konsument von H_HOOK_EXIT_USE ein und diese
-     Funktion wird immer gerufen, wenn ein Lebewesen im gleichen Environment
-     wie der NPC versucht, einen Ausgang zu benutzen.
-     Der NPC kann dann die Bewegung abbrechen (und so den Ausgang
-     blockieren), Ziel oder Bewegungsmeldung aendern oder keine Veraenderung
-     vornehmen.
-     Die Konstanten fuer Hookid und Hookstatus (s. Rueckgabewert) sind in
-     <hook.h> definiert.
-
-RUeCKGABEWERT:
-     Array mit zwei Elementen:
-     ({
-         H_NO_MOD / H_ALTERED / H_CANCELLED,
-         hdata
-     })
-     hdata ist ggf. das geaenderte Array, welches die Funktion uebergeben
-     wird. Weitere Details s. auch /doc/std/hooks
-
-BEMERKUNGEN:
-     Die Anzahl an Konsumenten eines Hooks ist begrenzt. Es ist daher
-     moeglich, dass die Registrierung nicht klappt, wenn zuviele (>5) Waechter
-     im Raum sind. Will man darauf reagieren, muesste man die Registrierung
-     pruefen.
-     Ein NPC, welcher GuardExit() definiert, aber im aktuellen Environment
-     keine Wache halten will, koennte sich selber de-registrieren.
-
-BEISPIELE:
-     <int|<string|closure>* >* GuardExit(object room, int hookid,
-                                         <string|closure>* hdata)
-     {
-       // Nur in Gefaengnisraeumen Wache halten
-       if (strstr(object_name(environment()), "/room/jail")==0)
-       {
-         // Hier gehts nicht raus. ;-)
-         if (hdata[0] == "raus") {
-             tell_object(this_player(), ...);
-             return ({H_CANCELLED, hdata});
-         }
-         // Special exits ersetzen wir durch einen eigenen
-         else if (closurep(hdata[1])) {
-           hdata[1] = #'my_special_exit;
-           return ({H_ALTERED, hdata});
-         }
-         // alle anderen Ausgaenge in die persoenliche Zelle
-         else {
-           tell_object(this_player(), ...);
-           hdata[1] = "/room/jail_"+getuid(this_player());
-           hdata[2] = "Sueden";
-           return ({H_ALTERED, hdata});
-         }
-      }
-      // in allen anderen Raeumen nicht eingreifen
-      return ({H_NO_MOD, hdata});
-    }
+GuardExit()
+***********
 
 
-SIEHE AUCH:
-     AddExit, AddSpecialExit, RemoveExit
-     HRegisterToHook, HRegisterModifier, HUnregisterFromHook
-     /doc/std/hooks
-----------------------------------------------------------------------------
-20.02.2016, Zesstra
-22.05.2016, Mupfel (Beispiel korrigiert)
+FUNKTION
+========
+
+   protected <int|<string|closure>* >* GuardExit(object room, int hookid,
+                                                 <string|closure>* hdata);
+
+
+DEFINIERT IN
+============
+
+   /std/npc/moving.c
+
+
+ARGUMENTE
+=========
+
+   room
+        Der den Hook ausloesende Raum (environment())
+   hookid
+        Die ID des Hooks (H_HOOK_EXIT_USE)
+   hdata
+        Ein Array mit 3 Elementen:
+        ({
+            verb - Das Kommandoverb/Ausgangsname (string)
+            dest - Zielraum (string) oder closure (special exits)
+            msg  - Bewegungsrichtung (string) oder 0
+        })
+
+
+BESCHREIBUNG
+============
+
+   Ist diese Funktion in einem NPC definiert, traegt sich der NPC bei jeder
+   Bewegung automatisch als Konsument von H_HOOK_EXIT_USE ein und diese
+   Funktion wird immer gerufen, wenn ein Lebewesen im gleichen Environment
+   wie der NPC versucht, einen Ausgang zu benutzen.
+   Der NPC kann dann die Bewegung abbrechen (und so den Ausgang
+   blockieren), Ziel oder Bewegungsmeldung aendern oder keine Veraenderung
+   vornehmen.
+   Die Konstanten fuer Hookid und Hookstatus (s. Rueckgabewert) sind in
+   <hook.h> definiert.
+
+
+RUeCKGABEWERT
+=============
+
+   Array mit zwei Elementen:
+   ({
+       H_NO_MOD / H_ALTERED / H_CANCELLED,
+       hdata
+   })
+   hdata ist ggf. das geaenderte Array, welches die Funktion uebergeben
+   wird. Weitere Details s. auch /doc/std/hooks
+
+
+BEMERKUNGEN
+===========
+
+   Die Anzahl an Konsumenten eines Hooks ist begrenzt. Es ist daher
+   moeglich, dass die Registrierung nicht klappt, wenn zuviele (>5) Waechter
+   im Raum sind. Will man darauf reagieren, muesste man die Registrierung
+   pruefen.
+   Ein NPC, welcher GuardExit() definiert, aber im aktuellen Environment
+   keine Wache halten will, koennte sich selber de-registrieren.
+
+
+BEISPIELE
+=========
+
+    <int|<string|closure>* >* GuardExit(object room, int hookid,
+                                        <string|closure>* hdata)
+    {
+      // Nur in Gefaengnisraeumen Wache halten
+      if (strstr(object_name(environment()), "/room/jail")==0)
+      {
+        // Hier gehts nicht raus. ;-)
+        if (hdata[0] == "raus") {
+            tell_object(this_player(), ...);
+            return ({H_CANCELLED, hdata});
+        }
+        // Special exits ersetzen wir durch einen eigenen
+        else if (closurep(hdata[1])) {
+          hdata[1] = #'my_special_exit;
+          return ({H_ALTERED, hdata});
+        }
+        // alle anderen Ausgaenge in die persoenliche Zelle
+        else {
+          tell_object(this_player(), ...);
+          hdata[1] = "/room/jail_"+getuid(this_player());
+          hdata[2] = "Sueden";
+          return ({H_ALTERED, hdata});
+        }
+     }
+     // in allen anderen Raeumen nicht eingreifen
+     return ({H_NO_MOD, hdata});
+   }
+
+
+SIEHE AUCH
+==========
+
+   AddExit, AddSpecialExit, RemoveExit
+   HRegisterToHook, HRegisterModifier, HUnregisterFromHook
+   /doc/std/hooks
+
+20.02.2016, Zesstra 22.05.2016, Mupfel (Beispiel korrigiert)
