diff --git a/doc/lfun/command_me b/doc/lfun/command_me
index cdb1ef2..77a3cc5 100644
--- a/doc/lfun/command_me
+++ b/doc/lfun/command_me
@@ -1,81 +1,110 @@
+
 command_me()
-FUNKTION:
-    int command_me(string str)
+************
 
-ARGUMENTE:
-    string str - auszufuehrendes Kommando
 
-DEFINIERT IN:
-    /std/npc.c, /std/player/command.c
+FUNKTION
+========
 
-BESCHREIBUNG:
-    Fuehrt 'str' wie ein Kommando aus, welches direkt vom Living
-    abgegeben wurde.
+   int command_me(string str)
 
-    Der Rueckgabewert ist >=1 fuer Erfolg und 0 fuer Misserfolg. 
-    Rueckgabewert ist im Erfolgsfall die Hoehe der EvalCost in Ticks. 
 
-    command_me() leitet den Befehl an command()(E) weiter und erlaubt
-    dadurch auch den Aufruf von sonst durch "static", "protected" oder
-    "private" vor externem Aufruf geschuetzten Kommando-Funktionen.
+ARGUMENTE
+=========
 
-    Kommandos mit oeffentlichen Kommandofunktionen (also damit alle mit
-    AddCmd definierten Kommandos) koennen auch durch command()(E)
-    von aussen ausgeloest werden.
+   string str - auszufuehrendes Kommando
 
-BEMERKUNGEN:    
-    - beruecksichtigt Aliase, d.h. wenn man Aliase eines Spielers
-      ignorieren will, muss man ein \\ (fuer ein \ im Eingabestring)
-      vor den Befehl stellen
-    - fuer objektinterne Kommandos funktioniert also auch command()(E)
 
-BEISPIEL:
-    (Code des Testraum ist in /doc/beispiele/testobjekte/command_me_testraum)
-    // #1: Testraum, zwinge Spieler bei "schleiche heran" zum Furzen
-    //     command_me() ist hier noetig, da das Furzen eine geschuetzte
-    //     Kommandofunktion hat
-    inherit "/std/room";
+DEFINIERT IN
+============
 
-    void create() {
-      ::create();
-      AddCmd("schleiche&heran|herum", "action_schleichen");
-    }
-    
-    void init() {
-      ::init();
-      add_action("action_kriechen", "kriech", 1);
-    }
+   /std/npc.c, /std/player/command.c
 
-    static int action_schleichen(string str) {
-      string tmp = this_player()->QueryProp(P_RACE);
-      // ... 
-      if(tmp[<1]=='e') tmp=tmp[0..<2];
-      write(break_string("Du versuchst leise zu schleichen, dabei passiert "
-        "dir aber ein allzu "+
-        (tmp=="Mensch"?"menschliches":lower_case(tmp)+"isches")+
-        " Missgeschick. Verflucht!", 78));
-      this_player()->command_me("\\furze");
-      return 1;
-    }
-    
-    static int action_kriechen(string str) {
-      write(break_string("Deine Knie tun zu sehr weh dafuer.", 78));
-      tell_room(this_object(), break_string(this_player()->Name(WER)+
-        " knackt mit den Knien.", 78));
-      return 1;
-    }
-    
-    // #2 (in obigem Raum): zwinge Spieler in Raum zu obigem Kommando
-    //    Beide Kommandos gelingen, da Kommando mit AddCmd definiert.
-    find_player("naddl")->command_me("schleiche herum")
-    command("schleiche herum", find_player("naddl")); 
 
-    // #3 (in obigem Raum): zwinge Spieler in Raum zu obigem Kommando
-    find_player("naddl")->command_me("krieche")
-    //    Folgendes Kommando schlaegt fehl, da Kommandofunktion static ist.
-    command("krieche", find_player("naddl"));
-    
-SIEHE AUCH:
-     enable_commands(E), command(E)
+BESCHREIBUNG
+============
+
+   Fuehrt 'str' wie ein Kommando aus, welches direkt vom Living
+   abgegeben wurde.
+
+   Der Rueckgabewert ist >=1 fuer Erfolg und 0 fuer Misserfolg.
+   Rueckgabewert ist im Erfolgsfall die Hoehe der EvalCost in Ticks.
+
+   command_me() leitet den Befehl an command()(E) weiter und erlaubt
+   dadurch auch den Aufruf von sonst durch "static", "protected" oder
+   "private" vor externem Aufruf geschuetzten Kommando-Funktionen.
+
+   Kommandos mit oeffentlichen Kommandofunktionen (also damit alle mit
+   AddCmd definierten Kommandos) koennen auch durch command()(E)
+   von aussen ausgeloest werden.
+
+BEMERKUNGEN:
+   * beruecksichtigt Aliase, d.h. wenn man Aliase eines Spielers
+     ignorieren will, muss man ein \ (fuer ein im Eingabestring) vor
+     den Befehl stellen
+
+   * fuer objektinterne Kommandos funktioniert also auch
+     command()(E)
+
+
+BEISPIEL
+========
+
+   (Code des Testraum ist in /doc/beispiele/testobjekte/command_me_testraum)
+   // #1: Testraum, zwinge Spieler bei "schleiche heran" zum Furzen
+   //     command_me() ist hier noetig, da das Furzen eine geschuetzte
+   //     Kommandofunktion hat
+   inherit "/std/room";
+
+   void create() {
+     ::create();
+     AddCmd("schleiche&heran|herum", "action_schleichen");
+   }
+
+
+
+   void init() {
+     ::init();
+     add_action("action_kriechen", "kriech", 1);
+   }
+
+   static int action_schleichen(string str) {
+     string tmp = this_player()->QueryProp(P_RACE);
+     // ...
+     if(tmp[<1]=='e') tmp=tmp[0..<2];
+     write(break_string("Du versuchst leise zu schleichen, dabei passiert "
+       "dir aber ein allzu "+
+       (tmp=="Mensch"?"menschliches":lower_case(tmp)+"isches")+
+       " Missgeschick. Verflucht!", 78));
+     this_player()->command_me("\\furze");
+     return 1;
+   }
+
+
+
+   static int action_kriechen(string str) {
+     write(break_string("Deine Knie tun zu sehr weh dafuer.", 78));
+     tell_room(this_object(), break_string(this_player()->Name(WER)+
+       " knackt mit den Knien.", 78));
+     return 1;
+   }
+
+
+
+   // #2 (in obigem Raum): zwinge Spieler in Raum zu obigem Kommando
+   //    Beide Kommandos gelingen, da Kommando mit AddCmd definiert.
+   find_player("naddl")->command_me("schleiche herum")
+   command("schleiche herum", find_player("naddl"));
+
+   // #3 (in obigem Raum): zwinge Spieler in Raum zu obigem Kommando
+   find_player("naddl")->command_me("krieche")
+   //    Folgendes Kommando schlaegt fehl, da Kommandofunktion static ist.
+   command("krieche", find_player("naddl"));
+
+
+SIEHE AUCH
+==========
+
+   enable_commands(E), command(E)
 
 06 Sep 2012 Gloinson
