diff --git a/std/player/soul.c b/std/player/soul.c
new file mode 100644
index 0000000..438f2c6
--- /dev/null
+++ b/std/player/soul.c
@@ -0,0 +1,3218 @@
+// MorgenGrauen MUDlib
+//
+// player/soul.c -- Die Seele des Spielers
+//
+// $Id: soul.c 9527 2016-03-12 11:37:54Z Arathorn $
+
+// Letzte Aenderung vom 08.09.95  Wargon
+
+// Set TabStop to 2 characters
+
+/* Version 1.41 MG, September 95
+   - Bei "frage" und "antworte" Test auf P_PERM_STRING fuer Sprachflueche.
+   - bugfix bei "schweige" (nahm keine Adverbien an)
+   */
+
+/* Version 1.4 MG, August 95
+   - Hilfefunktion eingebaut, siehe auch soulhelp.c
+   - einige kleinere Aenderungen erst jetzt durch eine neue Version gewuerdigt
+   - neue Verben, wie eigentlich fast immer :>
+   - typos und bugs gefixed (und neue eingebaut...)
+   - Funktion zur Abfrage von Adverbien von aussen eingebaut (Hallo, Anthea :>)
+   - so schlimm kann das doch nicht sein, einen TabStop von 2 zu nehmen, fuer
+     dieses eine file, alles andere zerlegt meine Formatierung immer so :<
+   - koenntet ihr bitte mal oben das "Letzte Aenderung" aendern, wenn ihr
+     irgendwo was aendert?
+   */
+
+/* Version 1.35 MG, Dezember 94
+   - Verben
+   - Aenderung des Parsings der quoted adverbs
+   - rknuddel ignorieren wird vom normalen ignore uebernommen
+   */
+
+/* Version 1.32 MG, Juli 94
+   - einige Verben
+   - ignorieren des rknuddel
+   */
+
+/* Version 1.31 MG, Mai 94
+   - einige Verben
+   */
+
+/* Version 1.3 MG, Mai 94
+   - quoted adverbs GEHEN jetzt
+   - ParseRest / ParseRemote neu geschrieben
+   */
+
+/* Version 1.21 MG, April 94
+   - quoted adverbs
+   */
+
+/* Danke an Angus fuer den Text von "liebe" */
+
+/* Version 1.2 MG, Januar 94
+   - Umstellung der Feelings von vielen kleinen Funktionen auf eine grosse,
+     damit der Funktionsoverhead wegfaellt.
+   - neue Ausgabe der Adverbien, mit more und nur noch eines pro Zeile
+   - mal wieder neue Verben.
+   - und das neue Standardadverb "jofi" :)
+   */
+
+/* Version 1.1 MG, November 93
+   Aenderungen:
+   - Ich habe "alle(n)" eingebaut. Die Verwaltung steht, man kann jetzt
+     Verben die Moeglichkeit "alle" geben (Bsp. "wink alle").
+   - inzwischen wieder einige Verben mehr, aber muss ich das noch
+     erwaehnen?
+   - (HASS) Rumata hat mein schoenes System fuer die Ausgabestrings
+     verkompliziert. Statt &a steht da jetzt z.B. @@adverb@@, was in
+     einer weiteren unnoetigen Funktion resultierte. Naja.
+   Highlander ryn Tahar
+   */
+
+/*
+   Ha! Ich nehme jetzt die erste ganze Versionsnummer fuer mich in Anspruch :)
+   So, heute ist's geschafft (Ich auch...). Ich bin fertig - ich mach nur
+   noch neue Verben rein, wenn Ideen kommen.
+   Gegeben an Dienstag, dem 22. Juni 1993 im heimatlichen Horst.
+   Highlander ryn Tahar.
+   P.S.: Kopiere sich das Ding, wer will - unter folgenden Bedingungen:
+   - Den Goettern von MorgenGrauen und
+   - Highlander@TAPPMud     Bescheid sagen und ausserdem
+   *seufz* nehmt Highlander hier in MorgenGrauen!! -HrT
+   Ha! Ihr koennt wieder TAPPMud nehmen :>  Aber sagt's ruhig in MG. -HrT
+   - entweder den ganzen Schwall hier drinlassen oder mich mit einem
+   neuen Text erwaehnen.
+   Das Ganze unter der Voraussetzung, dass ueberhaupt mal jemand eine deutsche
+   Seele braucht und sie nicht selber schreiben will :-) (ersparts euch lieber)
+   Highlander ryn Tahar.
+
+   **Arbeit:
+   Einbau von Adverbien, andere Reaktionen bei Geistern als "Wie bitte?",
+   einige neue Verben, einige alte Verben rausgeschmissen.
+   Weil es Probleme mit dem autoloading der playeradverbs gab, wurde
+   ausserdem die soul vom Objekt zum inheritfile fuer die playershell.
+
+   **Ideen  zum Weitermachen:
+   - (verb) alle, z.B. tritt alle   -- Moeglichkeit eingebaut
+   - Geisterverben mit Adverb
+
+   Version 1.0 fuer MorgenGrauen    Highlander Mai/Juni 93
+   */
+
+
+/* Hier ist sie nun, die DEUTSCHE version der soul,
+   viel Spass damit.
+   Poietix  Mai 1992
+   Vers.: 0.4 fuer JRMud
+   P.S. bitte meckert nicht dran rum , sondern verbessert und
+   erweitert sie.
+
+   Olpp November 1992
+   Vers.: 0.5 fuer MorgenGrauen
+
+   He, Olpp, schreibt man nicht die neueste Aenderung UEBER die alten?
+   *grins*, Highlander
+   */
+#pragma strong_types
+#pragma save_types
+//#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#define SOULHELP "/std/player/soulhelp"
+#define LF "\n"
+#define NOT_SELF 1
+#define NOT_DEAD 1
+
+#define QPP QueryPossPronoun
+#define RETURN return _notify_fail
+#define Return return 0||_notify_fail  // netter Trick, muss ich mir merken -HrT
+#define GHOSTCHECK(sel,oth,vic) if (ghost()) {  write(sel); say(oth,who||ME);\
+                                  if (vic) who->Message(vic); return 1;  }
+#define HELPCHECK(x) if (str && (str=="-h" || str=="-?" || str=="/h" \
+         || str=="/?" || str=="hilfe"))\
+                       { More(SOULHELP->Help(x)); return 1; }
+
+// "schau an" als nicht-Untersuchung. Klappt aber anscheinend nicht, weil
+// ich nicht gegen den GD ankomme. Also besser auskommentiert lassen.
+#ifdef SCHAU_AN
+#undef SCHAU_AN
+#endif
+
+// Anpiepsen mit Text. Im Moment erlaubt, bei Missfallen auskommentieren und
+// in der Hilfe auskommentieren.
+#ifdef WECKE
+#undef WECKE
+#endif
+
+#define WECKE
+
+#define NEED_PROTOTYPES
+#include <thing/description.h>
+#include <thing/properties.h>
+#include <player.h>
+#include <player/comm.h>
+#include <language.h>
+#undef NEED_PROTOTYPES
+
+#include <properties.h>
+
+#include <defines.h>
+#include <moving.h>
+#include <wizlevels.h>
+#include <class.h>
+
+static object who, ofoo;
+static int for_all, flag, ifoo;
+mapping plr_adverbs;
+static string out_sel, out_vic, out_oth, adverb, sfoo;
+
+private void ParseAdverb(string *words);
+private string convert_string(string str);
+varargs mixed More(string str, int fflag, string returnto);
+string MatchAdverb(string str);
+
+mapping
+QueryStdAdverbs()  {
+  return ([
+    "unve" : "unverschaemt",
+    "gutg" : "gutgelaunt",
+    "gutm" : "gutmuetig",
+    "froh" : "froh",
+    "glue" : "gluecklich",
+    "wuet" : "wuetend",
+    "frec" : "frech",
+    "daem" : "daemonisch",
+    "boes" : "boese",
+    "ungl" : "ungluecklich",
+    "lang" : "langsam",
+    "schn" : "schnell",
+    "jamm" : "jammernd",
+    "freu" : "freundlich",
+    "shue" : "schuechtern",
+    "amue" : "amuesiert",
+    "aerg" : "aergerlich",
+    "aner" : "anerkennend",
+    "erst" : "erstaunt",
+    "bitt" : "bitter",
+    "brei" : "breit",
+    "vors" : "vorsichtig",
+    "char" : "charmant",
+    "kalt" : "kalt",
+    "verf" : "verfuehrerisch",
+    "zufr" : "zufrieden",
+    "tief" : "tief",
+    "verz" : "verzweifelt",
+    "drec" : "dreckig",
+    "vert" : "vertraeumt",
+    "uebe" : "ueberzeugt",
+    "frus" : "frustriert",
+    "stra" : "strahlend",
+    "hoff" : "hoffnungsvoll",
+    "unge" : "ungeduldig",
+    "unsi" : "unsinnigerweise",
+    "unsc" : "unschuldig",
+    "unwi" : "unwissend",
+    "iron" : "ironisch",
+    "wiss" : "wissend",
+    "gema" : "gemaechlich",
+    "sehn" : "sehnsuechtig",
+    "laut" : "laut",
+    "lieb" : "liebevoll",
+    "froe" : "froehlich",
+    "dank" : "dankbar",
+    "natu" : "natuerlich",
+    "gedu" : "geduldig",
+    "perf" : "perfekt",
+    "vers" : "verspielt",
+    "hoef" : "hoeflich",
+    "stol" : "stolz",
+    "frag" : "fragend",
+    "rupp" : "ruppig",
+    "trau" : "traurig",
+    "vera" : "veraechtlich",
+    "scha" : "schamlos",
+    "erns" : "ernst",
+    "schu" : "schuechtern",
+    "zaer" : "zaertlich",
+    "sanf" : "sanft",
+    "entg" : "entgeistert",
+    "heim" : "heimtueckisch",
+    "gela" : "gelangweilt",
+    "wild" : "wild",
+    "jofi" : "wie Jof, wenn er mal nicht idlet",
+  ]);
+}
+
+mapping
+QueryAdverbs() {
+  if (extern_call())
+    return deep_copy(plr_adverbs);
+  return plr_adverbs;
+}
+
+string
+MatchAdverb(string a)  {
+  ParseAdverb(explode(a," "));
+  return adverb;
+}
+
+// Verwaltungsroutinen
+
+static void
+add_soul_commands()  {
+  if (!plr_adverbs)
+    plr_adverbs=([]);
+  add_action("SoulComm", "", 1);
+}
+
+static int
+verben_liste()  {
+  More(SOULHELP->Help());
+  return 1;
+}
+
+#define ghost() QueryProp(P_GHOST)
+#define frog() QueryProp(P_FROG)
+#define capname() capitalize(name())
+#define gname() (ghost()?(frog()?"Der Geist eines Frosches"\
+			        :"Der Geist von "+capname())\
+		        :capname())
+
+varargs private void
+ParseRest(string arg, mixed extra)  {
+  string wer,wie,*words,quotea;
+  int num,bis;
+  who = for_all = adverb = 0;
+  if (!arg) return;
+  if (extra)
+    if (!pointerp(extra)) {
+      if (sscanf(arg, extra+" %s", wie)==1)
+      arg=wie;
+    }
+    else
+      for (bis=sizeof(extra),num=0; num<bis; num++)
+        if (sscanf(arg, extra[num]+" %s", wie)==1)
+          arg=wie;
+
+  if ((bis=strstr(arg, "/"))>=0)
+    quotea=arg[bis..],arg=arg[0..bis-1];
+  quotea=quotea||"",arg=arg||"";
+
+  words=explode(implode(explode(arg, ","), " und"), " ");
+  if (!sizeof(words)) return;
+  if (sizeof(words) && (words[0]=="alle" || words[0]=="allen"))
+    for_all=1,wer=words[0],words=words[1..];
+  if (!for_all)  {     /* noch kein Opfer */
+    wer=match_living(lower_case(words[0]));
+    if (stringp(wer)) who=present(wer, environment(ME));
+    if (!who) who=present(words[0], environment(ME));
+    if (who && who->QueryProp(P_INVIS)) who=0;
+    }
+  if (who && sizeof(words))
+    words=words[1..];  /* Opfer gefunden - wenn's eines gibt */
+  words+=explode(quotea, " ");
+  words-=({""});
+  if (sizeof(words)) ParseAdverb(words);
+}
+
+private int
+ParseRemote(string arg)  {
+  string wer,*words; 
+
+  adverb = 0; // Adverb vom letzten Mal keinesfalls wiederverwenden. ;-)
+
+  if (!stringp(arg) || !sizeof(arg)) return 0;
+  
+  words=explode(arg," ");
+
+  mixed liv = match_living(lower_case(words[0]));
+  if (stringp(liv))
+      who=find_player(liv);
+  
+  if (who) {
+    // Ziel ist ein Spieler.
+    if (!who->QueryProp(P_INVIS) || IS_WIZARD(ME))
+    {
+      // Spieler ist nicht Invis oder ich bin Magier.
+      string nam = (query_once_interactive(ME) ? getuid() : 
+	             lower_case(name(RAW)));
+      if (query_verb()[0..5]=="rknudd" &&
+	  who->TestIgnore(nam+".rknuddel") )
+      {
+        // ich oder das Kommando werde ignoriert.
+        write(who->Name(WER)+" ignoriert Deinen Knuddelversuch.\n");
+        return 1;
+      }
+    }
+    else
+      // Spieler ist invis und ich bin kein Magier.
+      who = 0;
+  }
+  // kein eingeloggter und sichtbarer Spieler. Vielleicht ein NPC? (BTW: kein
+  // else if, weil im if fuer Spieler oben who genullt werden kann und dann
+  // nochmal nach nem NPC gesucht werden soll.)
+  if (!who) {
+    wer = match_living(lower_case(words[0]));
+    if(stringp(wer)) 
+      who=present(wer,environment(ME));
+    if (!who) who=present(words[0], environment(ME));
+    if (who && who->QueryProp(P_INVIS)) who=0;
+  }
+
+  if (!who || sizeof(words)==1) return 0;
+  words=words[1..];
+  ParseAdverb(words);
+  return(0);
+}
+
+/**
+ Gibt den passenden Adverb-Text zu einem key zurueck
+ \param s Danach wird in der Adverbien-Liste gesucht
+ \param fuzzy 
+ \return Der gefundene Adverbientext oder 0
+ */
+varargs string GetPlayerAdverb( string s, int fuzzy ) {
+  int i, j; 
+  string *search_pattern,
+         *search_result, 
+          result;
+
+  // Erstmal gucken, ob der String direkt gefunden werden kann
+  // das geht am schnellsten
+  result = QueryStdAdverbs()[s] || plr_adverbs[s];
+
+  // Wenn noch kein Ergebnis gefunden, und man unscharf suchen will
+  if ( fuzzy && !result) {
+
+    // Suchmuster fuer das Intersect erzeugen
+    search_pattern=({s});
+
+    j = sizeof(s)-1;
+    for ( i=2;  i < j ;i++) {
+      search_pattern += ({s[0..<i]});
+    }
+
+    // Intersect zwischen allen bekannten Abkuerzungen und Search-Pattern
+    // erzeugen. Dieses wird dann gleichzeitig nach Laenge sortiert
+    // genauester Treffer = String mit groesster Laenge
+    search_result = sort_array(
+      (m_indices(QueryStdAdverbs()) | m_indices(plr_adverbs))&search_pattern, 
+         #'>);
+
+    // Adverb zum genauesten Treffer zurueckgeben
+    if (sizeof(search_result)) 
+      result = QueryStdAdverbs()[search_result[0]] || 
+               plr_adverbs[search_result[0]];
+  }
+
+  return result;
+}
+
+/**
+  Parst die Adverbienparameter fuer Verben und speichert die
+  passende Textausgabe in der globalen Variable "adverb"
+  \param words Array mit den zu parsenden Adverbien-Strings
+*/
+private void
+ParseAdverb(string *words)  {
+  int num,andsign,bis;
+  string qadv,*adv,cnt;
+
+  adv=({});
+  qadv=0;
+
+  bis=sizeof(words);
+  // Sonderfall Gequotetes Adverb (alles nach dem Quote) speichern und aus 
+  // Words rausschneiden.
+  for (num=0; num<bis; num++)
+    if (words[num][0..0]=="/")  {
+      words[num]=words[num][1..];
+      qadv=implode(words[num..], " ");
+      words=words[0..num-1];
+      break;
+    }
+
+  // Es kann sein, dass vor dem Quote noch eine und steht. Das wird jetzt auch 
+  // noch entfernt, muss aber spaeter wieder eingefuegt werden.
+  if (sizeof(words) && words[<1]=="und")  {
+    words=words[0..<2];
+    andsign=1;
+  }
+
+  // Weitersuchen?
+  if (bis=sizeof(words))
+    for (num=0; num<bis; num+=2)
+       adv+=({GetPlayerAdverb(words[num], 1)});
+  cnt=CountUp(adv-({0}));
+
+  // Ausgabe zusammenbauen
+  if (andsign)
+    adverb=CountUp((sizeof(adv) ? adv : ({}))+(qadv ? ({qadv}) : ({})));
+  else if (sizeof(cnt) && sizeof(qadv))
+    adverb = cnt + " " + qadv;
+  else if (sizeof(qadv))
+    adverb = qadv;
+  else if (sizeof(cnt))
+    adverb = cnt; 
+  if (adverb=="") adverb=0;
+}
+
+private mixed MixedOut(int casus)  {
+  object *envs,*vics;
+  string *names,out,aufz;
+  int count,msg;
+
+  for_all=0;
+  vics=({});
+  names=({});
+  envs=all_inventory(environment())-({this_player()});
+  if (!(count=sizeof(envs)))
+    RETURN("Nichts und niemand da. Schau Dich naechstes Mal besser um.\n");
+  for ( ; count--; )
+    if (living(envs[count]) && !envs[count]->QueryProp(P_INVIS))  {
+      vics+=({envs[count]});
+      names+=({envs[count]->name(casus)});
+    }
+  if (!sizeof(vics))
+    RETURN("Keiner da. Schau Dich naechstes Mal besser um.\n");
+  aufz=CountUp(names);
+  for (count=sizeof(vics); count--;)
+  {
+    out=implode(explode(out_vic, "@@alle@@"),aufz);
+        out = regreplace( out, "\\<"+vics[count]->name(casus)+"\\>",
+                          capitalize(vics[count]->QueryDu(casus)), 0 );
+
+    msg=vics[count]->ReceiveMsg(convert_string(out),MT_COMM,MA_EMOTE,
+                                0,this_object());
+    switch(msg)
+    {
+      case MSG_DELIVERED:
+      case MSG_BUFFERED:
+        break;
+      case MSG_IGNORED:
+      case MSG_VERB_IGN:
+      case MSG_MUD_IGN:
+        write(vics[count]->Name()+" ignoriert Dich oder diesen Befehl.\n");
+        break;
+      default:
+        write(vics[count]->Name()+" konnte Dich gerade nicht lesen.\n");
+    }
+  }
+  write(break_string(convert_string(implode(explode(out_sel,"@@alle@@"),aufz)
+    +LF), 78));
+  return 1;
+}
+
+varargs private int
+CheckLife(int no_self,int no_dead, string no_self_text, string no_dead_text)  {
+  if (who && living(who) && who!=this_player()) return 0;
+  if (no_self && who && who==this_player())  {
+    if (no_self_text)
+      write(no_self_text+LF);
+    else
+      write("Mach das mit anderen, nicht mit Dir selber.\n");
+    return 1;
+  }
+  if (who && !living(who) && no_dead)  {
+    if (no_dead_text)
+      write(no_dead_text+LF);
+    else
+      write("Das darfst Du nur mit Lebewesen.\n");
+    return 2;
+  }
+  if (!who)  {
+    write("Schau Dich erst mal um - das angegebene Objekt ist nicht da.\n");
+    return 3;
+  }
+  return(0); //non-void. Fall-through, alles OK.
+}
+
+private string
+convert_string(string str)  {
+  /* Ich bin unschuldig, ich hatte das viel einfacher und schoener :)
+     Rumata wollte das so ;)  -HrT                                     */
+  str = implode( explode( str, "@@name@@" ), capname() );
+  str = implode( explode( str, "@@gname@@" ), gname() );
+  str = implode( explode( str, "@@wer@@" ),
+    (who?capitalize(who->name(WER,2)||""):"" ));
+  str = implode( explode( str, "@@ wen@@" ),
+    (who?" "+who->name(WEN,2):""));
+  str = implode( explode( str, "@@ wem@@" ),
+    (who?" "+who->name(WEM,2):""));
+  str = implode( explode( str, "@@wen@@" ),
+    (who?who->name(WEN,2):""));
+  str = implode( explode( str, "@@wem@@" ),
+    (who?who->name(WEM,2):""));
+  str = implode( explode( str, "@@wessen@@" ),
+    (who?who->name(WESSEN,2):""));
+  str = implode( explode( str, "@@adverb@@" ),
+    (adverb?" "+adverb:"") );
+  return str;
+}
+
+private int
+FeelIt()  {
+  int msg, flg;
+
+  flg = MSGFLAG_SOUL;
+  if (query_verb() && (query_verb()[0..3]=="frag" || query_verb()[0..3]=="antw"))
+    flg |= MSGFLAG_SAY;
+  if (query_verb() && (query_verb()[0..5]=="rknudd" || query_verb()=="rwink"))
+    flg |= MSGFLAG_REMOTE;
+
+  // NPC haben keine TM-Hist (comm.c). Leider erben aber div. Magier die Soul
+  // (trotzdem sie in /std/player/ liegt) in ihren NPC... *fluch*
+  if (query_once_interactive(ME))
+    _recv(who, break_string(convert_string(out_sel),78), flg);
+  else
+    tell_object(ME, break_string(convert_string(out_sel),78));
+
+  if (out_vic && who)  {
+    if (query_once_interactive(who))  {
+      msg=who->Message( break_string(convert_string( out_vic ),78), flg);
+      if (msg==-1)
+        write(who->name()+" ignoriert Dich oder diesen Befehl.\n");
+    } else
+      tell_object(who,break_string(convert_string( out_vic ),78));
+  }
+  if (out_oth)
+  say( break_string(convert_string( out_oth ),78), ({who,this_player()}) );
+  out_sel=out_vic=out_oth=0;
+  return 1;
+}
+
+/**
+  Die Funktion stellt einen Hilfetext zur Verfuegung und listet die 
+  definierten Adverbien auf.
+  \param mine 0 = alle Adverbien, 
+              1=nur selbst definierte Adverbien 
+              2=nur die vom System bereitgestellten
+ */
+private int zeige_adverbs(int mine)  {
+  mapping adverb_list;
+  string out,s;
+
+  // Parameter auswerten
+  switch (mine){
+    case 1:
+      adverb_list=plr_adverbs;
+      out = "Du hast folgende Adverbien definiert:\n";
+      break;
+    case 2:
+      adverb_list=QueryStdAdverbs();
+      out = "Systemseitig sind folgende Adverbien definiert:\n";
+      break;
+    default:
+      adverb_list=QueryStdAdverbs()+plr_adverbs;
+      out = "Folgende Adverbien stehen Dir zur Verfuegung:\n";
+  }
+
+  out +="  Abk.    Adverb\n  ======  ======\n";
+
+  if ( sizeof(adverb_list) == 0) 
+    out += " keine.\n";
+  else
+    // Ueber alle Elemente der indizies der Adverbienliste gehen
+   foreach ( s : sort_array(m_indices(adverb_list), #'> ) ) {
+      out += break_string(adverb_list[s],78,
+                          sprintf("  %-6s  ",s),BS_INDENT_ONCE);
+    }
+
+  More(out+"\nWie diese Adverbien benutzt werden ist in <hilfe adverb> "
+    "beschrieben.\n");
+
+  return 1;
+}
+
+varargs static int
+SoulComm(string str, string _verb)  {
+  int t_g,t_n,flag;
+  string str1,str2,str3,*taenze,vb;
+  out_sel=out_vic=out_oth=who=0;
+//  if (this_interactive()!=ME) return 0;
+  if (interactive(ME)) str=_unparsed_args(); // NPCs haben das nicht :(
+  if (str=="") str=0;
+  vb=_verb||query_verb();
+  if (sizeof(vb)>1 && vb[<1]=='e' && vb!="noe") vb=vb[0..<2];
+  sfoo = 0;
+  switch (vb)  {
+    /**************** Aechzen ***************/
+    case "aechz":
+    HELPCHECK("aechz");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Aechze wie?\n");
+    out_sel="Du aechzt@@adverb@@.";
+    out_oth="@@gname@@ aechzt@@adverb@@.";
+    return FeelIt();
+
+    /**************** Anschmiegen ***************/
+    case "schmieg":
+    HELPCHECK("schmieg");
+    ParseRest(str);
+    if (!who)
+      Return("An wen willst Du Dich anschmiegen?\n");
+    if (CheckLife(NOT_SELF,NOT_DEAD,
+      "Das geht doch nicht.",
+      "Nein, das macht keinen Spass. Lebt ja nicht mal."))
+        return 1;
+    out_sel="Du schmiegst Dich@@adverb@@ an@@ wen@@ an.";
+    out_vic="@@gname@@ schmiegt sich@@adverb@@ an Dich.";
+    out_oth="@@gname@@ schmiegt sich@@adverb@@ an@@ wen@@ an.";
+    return FeelIt();
+
+    /**************** Antworten ***************/
+    case "antwort":
+    HELPCHECK("antwort");
+    if (!str)
+      Return("Antworte [WEM] WAS?\n");
+    ParseRest(str);
+    if (!who)
+      str1=capitalize(str);
+    else
+      if (sscanf(str,"%s %s",str1,str1)!=2)
+        Return("Antworte was?\n");
+      else
+        str1=capitalize(str1);
+    out_sel="Du antwortest@@ wem@@: "+str1;
+    /* Sprachflueche beruecksichtigen -Wargon, 8. 9. 95 */
+    if (QueryProp(P_PERM_STRING))
+      str1 = call_other(QueryProp(P_PERM_STRING),"permutate_string",str1)||"";
+    if (who) out_vic="@@gname@@ antwortet Dir: "+str1;
+    out_oth="@@gname@@ antwortet@@ wem@@: "+str1;
+    return FeelIt();
+
+    /**************** Applaudieren ***************/
+    case "applaudier":
+    HELPCHECK("applaudier");
+    GHOSTCHECK("Deine Haende fahren durcheinander durch - war wohl nix.\n",
+      gname()+" will applaudieren, aber "+QPP(FEMALE,WER,PLURAL)
+        +" Haende sausen\ndurcheinander durch.\n", 0);
+    if (!str)  {
+      out_sel="Du applaudierst von ganzem Herzen.";
+      out_oth="@@name@@ gibt eine Runde Applaus.";
+    }
+    else  {
+      ParseRest(str);
+      if (for_all)  {
+        out_sel="Du applaudierst @@alle@@@@adverb@@.";
+        out_vic="@@name@@ applaudiert @@alle@@@@adverb@@.";
+        return MixedOut(WEM);
+      }
+      if (!who && !adverb)
+        Return("Applaudiere wem oder wie oder so aehnlich.\n");
+      if (who && CheckLife(NOT_SELF,NOT_DEAD,
+        "Nein, das gehoert sich nicht.",
+        "Sachen wird hier nicht applaudiert, OK?"))
+          return 1;
+      out_sel="Du applaudierst@@ wem@@@@adverb@@.";
+      if (who) out_vic="@@name@@ applaudiert Dir@@adverb@@.";
+      out_oth="@@name@@ applaudiert@@ wem@@@@adverb@@.";
+    }
+    return FeelIt();
+
+    /**************** Argln ***************/
+    case "argl":
+    HELPCHECK("argl");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Argle wie?\n");
+    out_sel="Du arglst"+(adverb ? "@@adverb@@." : " ein wenig vor Dich hin.");
+    out_oth="@@gname@@ arglt"
+      +(adverb ? "@@adverb@@." : " ein wenig vor sich hin.");
+    return FeelIt();
+
+    /**************** Aufatmen ***************/
+    case "atm":
+    HELPCHECK("atm");
+    if (!str || sscanf(str,"%sauf",str1)!=1)
+      Return("Atme wie auf?\n");
+    ParseRest(str1);
+    out_sel="Du atmest"+(adverb ? "@@adverb@@" : " erleichtert")+" auf.";
+    out_oth="@@gname@@ atmet"+(adverb ? "@@adverb@@" : " erleichtert")+" auf.";
+    return FeelIt();
+
+    /**************** Begruessen ***************/
+    case "hallo":
+    case "hi":
+    case "begruess":
+    HELPCHECK("begruess");
+    ParseRemote(str);
+    if (!who)
+      Return("Wen willst Du begruessen?\n");
+    if (present(who, environment()))  {
+      out_sel="Du heisst @@wen@@@@adverb@@ willkommen.";
+      out_vic="@@gname@@ heisst Dich@@adverb@@ willkommen.";
+      out_oth="@@gname@@ heisst @@wen@@@@adverb@@ willkommen.";
+    }
+    else  {
+      out_sel="Du heisst @@wen@@@@adverb@@ aus der Ferne willkommen.";
+      out_vic="@@gname@@ heisst Dich@@adverb@@ aus der Ferne willkommen.";
+    }
+    return FeelIt();
+
+    /**************** Betasten ***************/
+    case "betast":
+    HELPCHECK("betast");
+    ParseRest(str);
+    if (!who)
+      Return("Begrabsche wen?\n");
+    out_sel="Du grabbelst@@adverb@@ an "+who->name(WEM)+" herum.";
+    out_vic="@@gname@@ grabbelt@@adverb@@ an Dir herum.";
+    out_oth="@@gname@@ grabbelt@@adverb@@ an "+who->name(WEM)+" herum.";
+    return FeelIt();
+
+    /**************** Bewundern ***************/
+    case "bewunder":
+    HELPCHECK("bewunder");
+    ParseRest(str);
+    if (!who)
+      Return("Bewundere wen?\n");
+    out_sel="Du bewunderst @@wen@@@@adverb@@.";
+    out_vic="@@gname@@ bewundert Dich@@adverb@@.";
+    out_oth="@@gname@@ bewundert @@wen@@@@adverb@@.";
+    return FeelIt();
+
+    /**************** Bibbern ***************/
+    case "bibber":
+    HELPCHECK("bibber");
+    if (ghost())
+      Return("Als Geist fuehlst Du keine Kaelte.\n");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Bibbere wie?\n");
+    out_sel="Du bibberst@@adverb@@ vor Kaelte.";
+    out_oth="@@name@@ bibbert@@adverb@@ vor Kaelte.";
+    return FeelIt();
+
+    /**************** Bohre Nase ***************/
+    case "bohr":
+    HELPCHECK("bohr");
+    ParseRest(str, ({"nase","in der nase","in nase"}));
+    if (str && str!="nase" && str!="in nase" && str!="in der nase" && !adverb)
+      Return("Bohre wie Nase?\n");
+    out_sel="Du bohrst@@adverb@@ in Deiner Nase.";
+    out_oth="@@gname@@ bohrt@@adverb@@ in der Nase.     Igitt! :)";
+    return FeelIt();
+
+    /**************** Brummeln ***************/
+    case "brummel":
+    HELPCHECK("brummel");
+    ParseRest(str);
+    out_sel="Du brummelst"
+      +(adverb ? "@@adverb@@." : (str ? " kaum verstaendlich: "+str+"." : "."));
+    out_oth="@@gname@@ brummelt"
+      +(adverb ? "@@adverb@@." : (str ? " kaum verstaendlich: "+str+"." : "."));
+    return FeelIt();
+
+    /**************** cls ***************/
+    case "cls":
+    HELPCHECK("cls");
+    write("[2J[H");
+    return 1;
+
+    /**************** Daeumchendrehen ***************/
+    case "dreh":
+    HELPCHECK("dreh");
+    if (!str)
+      Return("Drehe was?\n");
+    if(strstr(str,"daeumchen")<0 && strstr(str,"daumen")<0)
+      Return("Drehe was?\n");
+    ParseRest(str,({"daeumchen","daumen"}));
+    out_sel="Du drehst@@adverb@@ Daeumchen.";
+    out_oth="@@gname@@ dreht@@adverb@@ Daeumchen.";
+    return FeelIt();
+
+    /**************** Danken ***************/
+    case "dank":
+    HELPCHECK("dank");
+    ParseRest(str);
+    if (!who)
+      Return("Bei wem willst Du Dich bedanken?\n");
+    if (CheckLife(NOT_SELF, NOT_DEAD,
+      "Leidest Du jetzt schon an Persoenlickeitsspaltung? Ne, ne...",
+      "Keine Reaktion. Ist wohl befriedigender, sich bei Lebewesen zu "
+        +"bedanken."))
+        return 1;
+    out_sel="Du bedankst Dich@@adverb@@ bei@@ wem@@.";
+    out_vic="@@gname@@ bedankt sich@@adverb@@ bei Dir.";
+    out_oth="@@gname@@ bedankt sich@@adverb@@ bei@@ wem@@.";
+    return FeelIt();
+
+    /**************** Denken ***************/
+    case "denk":
+    HELPCHECK("denk");
+    if (ghost())
+      Return("Womit willst Du denn denken? Du hast keine grauen Zellen...\n");
+//    ParseRest(str);
+    str2=old_explode(str||""," ")[0];
+    if (str
+    && (!adverb||((QueryStdAdverbs()[str2]||plr_adverbs[str2]))!=adverb))  {
+      out_sel="Du denkst   . o O ("+str+")";
+      out_oth="@@name@@ denkt   . o O ("+str+")";
+      out_vic="@@name@@ denkt   . o O ("+str+")";
+    }
+    else  {
+      out_sel="Du faengst@@adverb@@ an zu denken.\nKleine "
+        +"Rauchwoelkchen steigen auf...";
+      out_oth="@@name@@ faengt@@adverb@@ an zu denken.\nKleine "
+        +"Rauchwoelkchen steigen auf...";
+    }
+    return FeelIt();
+
+    /**************** Deuten ***************/
+    case "deut":
+    HELPCHECK("deut");
+    ParseRest(str,"auf");
+    if (for_all)  {
+      out_sel="Du deutest@@adverb@@ auf @@alle@@.";
+      out_vic="@@gname@@ deutet@@adverb@@ auf @@alle@@.";
+      return MixedOut(WEN);
+    }
+    if (!who)
+      Return("Auf wen oder was willst Du deuten?\n");
+    out_sel="Du deutest@@adverb@@ auf"
+      +(who==this_object()?" Dich." : "@@ wen@@.");
+    if (who != this_object()) out_vic="@@gname@@ deutet@@adverb@@ auf Dich.";
+    out_oth="@@gname@@ deutet@@adverb@@ auf"
+      +(who==this_object() ? " sich selber.": "@@ wen@@.");
+    return FeelIt();
+
+    /**************** Druecken ***************/
+    case "drueck":
+    HELPCHECK("drueck");
+    ParseRest(str);
+    if (for_all)  {
+      out_sel="Du drueckst @@alle@@"+(adverb ? "@@adverb@@" : " zaertlich")
+        +" an Dich.";
+      out_vic="@@gname@@ drueckt @@alle@@"+
+        (adverb ? "@@adverb@@" : " zaertlich")+" an sich.";
+      return MixedOut(WEN);
+    }
+    if (!who)
+      Return("Wen willst Du denn druecken?\n");
+    if (CheckLife(NOT_SELF,NOT_DEAD,
+      "Das macht doch keinen Spass.",
+      "Ich druecke nur jemanden, nicht etwas."))
+        return 1;
+    GHOSTCHECK("Du willst "+who->name(WEN)+" an Dich druecken - nur hast Du "
+        +"schon\nwieder nicht daran gedacht, dass so was als Geist nicht "
+        +"geht.\n",
+      gname()+" will "+who->name(WEN)+" an sich druecken - hat aber\n"
+        +"mal wieder nicht an die Nachteile des Geisterdaseins gedacht.\n",
+      gname()+" will Dich an sich druecken - hat aber mal wieder\n"
+        +"nicht an die Nachteile des Geisterdaseins gedacht.\n");
+    out_sel="Du drueckst @@wen@@"+(adverb ? "@@adverb@@" : " zaertlich")
+      +" an Dich.";
+    out_vic="@@name@@ drueckt Dich"+(adverb ? "@@adverb@@" : " zaertlich")
+      +" an sich.";
+    out_oth="@@name@@ drueckt @@wen@@"+(adverb ? "@@adverb@@" : " zaertlich")
+      +" an sich.";
+    return FeelIt();
+
+    /**************** Entschuldige ***************/
+    case "entschuldig":
+    HELPCHECK("entschuldig");
+    ParseRest(str);
+    if (str && !who && !adverb)
+      Return("Entschuldige Dich wie oder bei wem?\n");
+    out_sel="Du bittest"+(who ? " @@wen@@" : "")
+      +"@@adverb@@ um Entschuldigung.";
+    if (who) out_vic="@@gname@@ bittet Dich@@adverb@@ um Entschuldigung.";
+    out_oth="@@gname@@ bittet"+(who ? " @@wen@@" : "")
+      +"@@adverb@@ um Entschuldigung.";
+    return FeelIt();
+
+    /**************** Erbleichen ***************/
+    case "erbleich":
+    HELPCHECK("erbleich");
+    GHOSTCHECK("Ich weiss zwar nicht, wie Du das schaffst, aber Du wirst "
+        +"noch bleicher.\n",
+      break_string("Wie unwahrscheinlich das auch ist, aber "+gname()
+        +" schafft es tatsaechlich, noch bleicher zu werden.",78), 0 );
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Wie willst Du erbleichen?\n");
+    out_sel="Du erbleichst@@adverb@@.";
+    out_oth="@@name@@ erbleicht@@adverb@@.";
+    return FeelIt();
+
+    /**************** Erroeten ***************/
+    case "erroet":
+    HELPCHECK("erroet");
+    GHOSTCHECK("Du schaffst es nur bis zu einem blassen Rosa, aber immerhin.\n",
+      "Die Wangen des Geistes von "+capname()+" werden leicht rosa.\n", 0);
+    ParseRest(str);
+    if (!adverb && str)
+      Return("Erroete wie?\n");
+    out_sel="Deine Wangen gluehen@@adverb@@.";
+    out_oth="@@name@@ erroetet@@adverb@@.";
+    return FeelIt();
+
+    /**************** Erschrecken ***************/
+    case "erschreck":
+    case "erschrick":
+    if (!ghost())
+      Return("Du bist zu harmlos, Geist muesste man sein...\n");
+    HELPCHECK("erschreck");
+    ParseRest(str);
+    if (!who)
+      Return("Wen willst Du denn erschrecken?\n");
+    out_sel="Mit einem lauten BUH! erschreckst Du @@wen@@"
+      +(adverb ? "@@adverb@@." : " fuerchterlich.");
+    out_vic="BUH! Du zuckst vor Schreck zusammen. Muss dieser Geist von "
+      +"@@gname@@ Dich auch@@adverb@@ erschrecken.";
+    out_oth="BUH! @@gname@@ erschreckt @@wen@@"
+      +(adverb ? "@@adverb@@." : " fuerchterlich.");
+    return FeelIt();
+
+    /**************** Flippen ***************/
+    case "flipp":
+    HELPCHECK("flipp");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Ausflippen wollen wir also, so so. Und wie, wenn ich "
+        +"fragen darf?\n");
+    out_sel="Du flippst"+(adverb ? "@@adverb@@ aus." : " total aus.");
+    out_oth="@@gname@@ flippt"+(adverb ? "@@adverb@@ aus." : " total aus.");
+    return FeelIt();
+
+    /**************** Fluchen ***************/
+    case "fluch":
+    HELPCHECK("fluch");
+    GHOSTCHECK("Du faengst mangels Resonanzkoerper leise an zu fluchen.\n",
+      gname()+" faengt leise an zu fluchen. Laut kann er nicht,\n"
+        +"mangels Luft und Resonanzkoerper.\n", 0);
+    if (!str)  {
+      out_sel="Du fluchst lautstark.";
+      out_oth="@@name@@ faengt an, fuerchterlich zu fluchen.";
+    }
+    else  {
+      ParseRest(str);
+      if (!adverb)
+        Return("Wie willst Du fluchen?\n");
+      out_sel="Du fluchst@@adverb@@.";
+      out_oth="@@name@@ flucht auf einmal@@adverb@@.";
+    }
+    return FeelIt();
+
+    /**************** Fragen ***************/
+    case "frag":
+    HELPCHECK("frag");
+    if (!str)
+      Return("Frage wen was?\n");
+    ParseRest(str);
+    if (who && CheckLife(NOT_SELF,NOT_DEAD,
+      "Du faengst zu gruebeln an...",
+      "Frage jemand, der lebt."))
+        return 1;
+    if (who)
+      sscanf(str,"%s %s", str1,str1);
+    else
+      str1=str;
+    if (!str1)
+      Return("Frage "+who->name(WEN)+" WAS?\n");
+    str1=capitalize(str1);
+    if (str1[<1] != '?')
+      str1 += "?";
+    out_sel="Du fragst@@ wen@@: "+str1;
+    /* Sprachfluch beruecksichtigen -Wargon, 8. 9. 95 */
+    if (objectp(QueryProp(P_PERM_STRING)))
+      str1 = call_other(QueryProp(P_PERM_STRING), "permutate_string", str1)||"";
+    if (who) out_vic=(ghost() ? "Der Geist von " : /* IS_LEARNER(ME) ?
+      QueryProp(P_PRESAY)||"" : */ "")+capname()+" fragt Dich: "+str1;
+    out_oth=(ghost() ? "Der Geist von " : /* IS_LEARNER(ME) ?
+      QueryProp(P_PRESAY)||"" : */ "")+capname()+" fragt@@ wen@@: "+str1;
+    return FeelIt();
+
+    /**************** Freuen ***************/
+    case "freu":
+    HELPCHECK("freu");
+    ParseRest(str);
+    if (str && !who && !adverb)
+      Return("Freue Dich wie?\n");
+    out_sel="Du "+(who ? "grinst @@wen@@ an und " : "")
+      +"freust Dich@@adverb@@.";
+    if (who) out_vic="@@gname@@ grinst Dich an und freut sich@@adverb@@.";
+    out_oth="@@gname@@ "+(who ? "grinst @@wen@@ an und " : "")
+      +"freut sich@@adverb@@.";
+    return FeelIt();
+
+    /**************** Furzen ***************/
+    case "furz":
+    HELPCHECK("furz");
+    GHOSTCHECK("Du laesst einen fahren - aber er riecht nach gar nix.\n",
+      gname()+" laesst einen fahren. Man riecht aber nix.\n", 0);
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Furze wie?\n");
+    out_sel="Du furzt"+(adverb ? "@@adverb@@." : " hemmungslos.");
+    out_oth="@@name@@ laesst@@adverb@@ einen Stinkefurz fahren.";
+    ofoo=clone_object("/items/furz");
+    ofoo->set_furzer(this_player());
+    ofoo->move(environment(this_player()));
+    return FeelIt();
+// DEBUG Furz testen!
+
+    /**************** Gaehnen ***************/
+    case "gaehn":
+    HELPCHECK("gaehn");
+    if (ghost())
+      Return("Als Geist wirst Du nicht muede - also nicht gaehnen.\n");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Wie willst Du gaehnen?\n");
+    if (!adverb)
+      out_sel="Kannst Du aber Dein(en) Mund/Maul/Schnabel weit aufreissen!";
+    else
+      out_sel="Du gaehnst@@adverb@@.";
+    out_oth="@@gname@@ gaehnt@@adverb@@.";
+    return FeelIt();
+
+    /**************** Glucksen ***************/
+    case "glucks":
+    HELPCHECK("glucks");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Gluckse wie?\n");
+    out_sel="Du gluckst"+(adverb ? "@@adverb@@." : " wie ein Huhn.");
+    out_oth="@@gname@@ gluckst"+(adverb ? "@@adverb@@." : " wie ein Huhn.");
+    return FeelIt();
+
+    /**************** Gratulieren ***************/
+    case "gratulier":
+    case "beglueckwuensch":
+    HELPCHECK("gratulier");
+    ParseRest(str);
+    if (!who)
+      Return("Wem willst Du gratulieren?\n");
+    if (CheckLife(NOT_SELF, NOT_DEAD,
+      "Na, meinst Du nicht, dass Eigenlob stinkt?",
+      "Soll ich dem Ding vielleicht zum Totsein gratulieren? Nee nee."))
+        return 1;
+    out_sel="Du gratulierst @@wem@@@@adverb@@.";
+    out_vic="@@gname@@ gratuliert Dir@@adverb@@.";
+    out_oth="@@gname@@ gratuliert @@wem@@@@adverb@@.";
+    return FeelIt();
+
+    /**************** Grinsen ***************/
+    case "grins":
+    HELPCHECK("grins");
+    GHOSTCHECK("Als Du grinst, siehst Du regelrecht, wie die anderen eine "
+        +"Gaensehaut bekommen.\n",
+      "Du bekommst eine Gaensehaut, als der Geist von "+capname()
+        +" zu grinsen anfaengt.\n", 0);
+    ParseRest(str);
+    if (for_all)  {
+      out_sel="Du grinst @@alle@@@@adverb@@ an.";
+      out_vic="@@name@@ grinst @@alle@@@@adverb@@ an.";
+      return MixedOut(WEN);
+    }
+    if (!who && !adverb && str)
+      Return("Grinsen - schoen und gut. Aber wen oder wie (an)grinsen?\n");
+    if (who && CheckLife(NOT_SELF,NOT_DEAD,
+      "Du grinst Dir was, aber so, dass es kein anderer sieht.",
+      "Nicht mal einen Spiegel darf man hier angrinsen, nur Lebewesen!"))
+        return 1;
+    out_sel="Du grinst@@ wen@@@@adverb@@"+(who ? " an" : "")+".";
+    if (who) out_vic="@@name@@ grinst Dich@@adverb@@ an.";
+    out_oth="@@name@@ grinst@@ wen@@@@adverb@@"+(who ? " an" : "")+".";
+    return FeelIt();
+
+    /**************** Gruebeln ***************/
+    case "gruebel":
+    case "gruebl":
+    HELPCHECK("gruebel");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Grueble wie?\n");
+    out_sel="Du gruebelst@@adverb@@ eine Weile vor Dich hin.";
+    out_oth="@@gname@@ gruebelt@@adverb@@ eine Weile vor sich hin.";
+    return FeelIt();
+
+    /**************** Grummeln ***************/
+    case "grummel":
+    case "grumml":
+    HELPCHECK("grummel");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Grummle wie?\n");
+    out_sel="Du grummelst@@adverb@@.";
+    out_oth="@@gname@@ grummelt@@adverb@@.";
+    return FeelIt();
+
+    /**************** Grunzen ***************/
+    case "grunz":
+    HELPCHECK("grunz");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Grunze wie?\n");
+    out_sel="Du grunzt@@adverb@@.";
+    out_oth="@@gname@@ grunzt@@adverb@@.";
+    return FeelIt();
+
+    /**************** Gucken ***************/
+    case "guck":
+    HELPCHECK("guck");
+    ParseRest(str);
+    if (!adverb)
+      Return("Gucke wie aus der Waesche?\n");
+    out_sel="Du guckst@@adverb@@ aus der Waesche.";
+    out_oth="@@gname@@ guckt@@adverb@@ aus der Waesche.";
+    return FeelIt();
+
+    /**************** Jammern ***************/
+    case "jammer":
+    HELPCHECK("jammer");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Wie willst Du jammern?\n");
+    out_sel="Du jammerst@@adverb@@.";
+    out_oth="@@gname@@ jammert@@adverb@@.";
+    return FeelIt();
+
+    /**************** Haetscheln ***************/
+    case "haetschel":
+    case "haetschl":
+    HELPCHECK("haetschel");
+    GHOSTCHECK("Du ueberlegst es Dir anders - mit Deinen durchlaessigen "
+        +"Haenden...",
+      gname()+" will anscheinend jemand haetscheln, ueberlegt\n"
+        +"es sich nach einem kurzen Blick auf seine Haende anders.\n", 0);
+    ParseRest(str);
+    if (for_all)  {
+      out_sel="Du haetschelst @@alle@@@@adverb@@.";
+      out_vic="@@name@@ haetschelt @@alle@@@@adverb@@.";
+      return MixedOut(WEN);
+    }
+    if (!str || !who)
+      Return("Wen willst Du haetscheln?\n");
+    if (who && CheckLife(NOT_SELF, NOT_DEAD,
+      "Das sieht viel zu albern aus - Du laesst es bleiben.",
+      "Ist da ueberhaupt was zu haetscheln? Nein, da lebt doch nix."))
+        return 1;
+    out_sel="Du haetschelst@@ wen@@@@adverb@@.";
+    out_vic="@@name@@ haetschelt Dich@@adverb@@.";
+    out_oth="@@name@@ haetschelt@@ wen@@@@adverb@@.";
+    return FeelIt();
+
+    /**************** Hicksen ***************/
+    case "hicks":
+    HELPCHECK("hicks");
+    GHOSTCHECK("Hoppla! Dieser Hickser zieht Dich ganz schoen zusammen!\n",
+      gname()+" hat anscheinend Schluckauf.\n"
+        +"Und was fuer einen! Fuer einen Moment zieht es "+QueryPronoun(WEN)
+        +" ziemlich zusammen.\n", 0);
+    if (!str)  {
+      out_sel="Hicks!";
+      out_oth="@@name@@ muss hicksen. Wahrscheinlich zu viel Alkohol...";
+    }
+    else  {
+      ParseRest(str);
+      if (!adverb)
+        Return("Hickse wie?\n");
+      out_sel="Du hickst@@adverb@@.";
+      out_oth="@@name@@ hickst@@adverb@@.";
+    }
+    return FeelIt();
+
+    /**************** Huepfen ***************/
+    case "huepf":
+    HELPCHECK("huepf");
+    GHOSTCHECK("Du schwebst durch die Gegend.\n",
+      gname()+" schwebt durch die Gegend.\n", 0);
+    if (!str)  {
+      out_sel="B O I N G !! Du huepfst in der Gegend herum.";
+      out_oth="@@name@@ huepft in der Gegend herum.";
+    }
+    else  {
+      ParseRest(str);
+      if (!who && !adverb)
+        Return("Huepfe wie oder um wen oder wie oder was oder haeh?\n");
+      out_sel="Du huepfst@@adverb@@"+(who ? " um@@ wen@@" : "")+" herum.";
+      if (who) out_vic="@@name@@ huepft@@adverb@@ um Dich herum.";
+      out_oth="@@name@@ huepft@@adverb@@"+(who ? " um@@ wen@@" : "")+" herum.";
+    }
+    return FeelIt();
+
+    /**************** Husten ***************/
+    case "hust":
+    HELPCHECK("hust");
+    GHOSTCHECK("Du verstreust ein paar Geisterbazillen im Raum.\n",
+      gname()+" macht ufff, ufff und verteilt ein paar Geister-\n"
+        +"bazillen im Raum.\n", 0);
+    if (!str)  {
+      out_sel="Hust! Keuch! Halt dir doch wenigstens die Hand vor den Mund!";
+      out_oth="@@name@@ hustet sich fast die Seele aus dem Leib.";
+    }
+    else  {
+      ParseRest(str);
+      if (!who && !adverb)
+        Return("Wenn Du schon was hinter huste tippst, dann bitte was "
+          +"vernuenftiges!\n");
+      if (who && CheckLife(NOT_SELF,NOT_DEAD,
+        "Dir selber koennen nur andere was husten.",
+        "Bitte huste nur Lebewesen was."))
+          return 1;
+      out_sel="Du hustest@@ wem@@@@adverb@@"+(who? " was" : "")+".";
+      if (who) out_vic="@@name@@ hustet Dir@@adverb@@was.";
+      out_oth="@@name@@ hustet@@ wem@@@@adverb@@"+(who? " was" : "")+".";
+    }
+    return FeelIt();
+
+    /**************** Jubeln ***************/
+    case "jubel":
+    case "jubl":
+    HELPCHECK("jubel");
+    ParseRest(str);
+    if (str && !who && !adverb)
+      Return("Juble wie? Oder wem zu?\n");
+    out_sel="Du jubelst@@ wem@@@@adverb@@"+(who ? " zu." : ".");
+    if (who) out_vic="@@gname@@ jubelt Dir@@adverb@@ zu.";
+    out_oth="@@gname@@ jubelt@@ wem@@@@adverb@@"+(who ? " zu." : ".");
+    return FeelIt();
+
+    /**************** Keuchen ***************/
+    case "keuch":
+    HELPCHECK("keuch");
+    if (ghost())
+      Return("Als Geist strengt Dich nix an - also wird auch nicht "
+        +"gekeucht.\n");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Keuche wie?\n");
+    out_sel="Du keuchst"+(adverb ? "@@adverb@@." : " vor Anstrengung.");
+    out_oth="@@name@@ keucht"+(adverb ? "@@adverb@@." : " vor Anstrengung.");
+    return FeelIt();
+
+    /**************** Kichern ***************/
+    case "kicher":
+    HELPCHECK("kicher");
+    if (!str)  {
+      out_sel="Du kicherst. (Wie albern von Dir)";
+      out_oth="@@gname@@ gibt ein albernes Kichern von sich.";
+    }
+    else  {
+      ParseRest(str);
+      if (!who && !adverb)
+        Return("Das haut so nicht hin, gib vernuenftige Parameter.\n");
+      if (who && CheckLife(NOT_SELF,NOT_DEAD,
+        "In diesem Fall nimm bitte nur kicher.",
+        "Musst schon etwas Lebendes angeben, nichts Totes."))
+          return 1;
+      out_sel="Du kicherst@@adverb@@"+(who ? " hinter "+who->name(WESSEN)+
+        " Ruecken." : ".");
+      if (who)  out_vic="Jemand kichert@@adverb@@ hinter deinem Ruecken.";
+      out_oth="@@gname@@ kichert@@adverb@@"+(who ? " hinter "+who->name(WESSEN)
+        +" Ruecken." : ".");
+    }
+    return FeelIt();
+
+    /**************** Kitzeln ***************/
+    case "kitzel":
+    case "kitzl":
+    HELPCHECK("kitzel");
+    GHOSTCHECK("Mit Deinen immateriellen Fingern schaffst Du das nicht.\n",
+      gname()+" muss gerade feststellen, dass man mit\n"
+        +"immateriellen Fingern nicht kitzeln kann.\n", 0);
+    ParseRest(str);
+    if (!who)
+      Return("Wen willst Du kitzeln?\n");
+    if (who && CheckLife(NOT_SELF,NOT_DEAD,
+      "Du bist doch kein Masochist! Du laesst es bleiben.",
+      "Dinge sind so selten kitzlig. Lass es bleiben."))
+        return 1;
+    if (member(({"highlander","hobo"}), who->query_real_name())>-1)
+      switch (who->query_real_name())  {
+        case "highlander": str1="unter"; str2="Federn"; break;
+        case "hobo"      : str1="an";    str2="Kinn"; break;
+      }
+    else if (who->QueryProp(P_RACE))
+      switch (lower_case(who->QueryProp(P_RACE)))  {
+        case "drache" : str1="unter";str2="Schuppen";
+          t_g=FEMALE; t_n=PLURAL; break;
+        case "greif"  : str1="unter";str2="Federn";
+          t_g=FEMALE; t_n=PLURAL; break;
+        default       : str1="an"; str2="Kinn"; t_g=NEUTER; t_n=SINGULAR;
+      }
+    else  {
+      str1="an"; str2="Kinn"; t_g=NEUTER; t_n=SINGULAR;
+    }
+    if (getuid(who)=="trest" || getuid(who)=="woelkchen")  {
+      str1="an"; str2="Fuessen"; t_g=MALE; t_n=PLURAL;
+    }
+    out_sel="Du kitzelst@@ wen@@@@adverb@@ "+str1+" "+who->QPP(t_g,WEM,t_n)
+      +" "+str2+".\n@@wer@@ versucht, sich zu beherrschen, muss aber "
+      +"doch lachen.";
+    out_vic="@@name@@ kitzelt Dich@@adverb@@ "+str1+" Deine"
+      +(t_n ? "n" : (t_g==FEMALE ? "r" : "m"))+" "+str2
+      +".\nDu versuchst, Dich zu beherrschen, musst aber doch lachen.";
+    out_oth="@@name@@ kitzelt@@ wen@@@@adverb@@ "+str1+" "
+      +who->QPP(t_g,WEM,t_n)+" "+str2
+      +".\n@@wer@@ versucht, sich zu beherrschen, muss aber doch lachen.";
+    return FeelIt();
+
+    /**************** Klatschen ***************/
+    case "klatsch":
+    HELPCHECK("klatsch");
+    GHOSTCHECK("Deine Haende sausen durcheinander durch.\n",
+      gname()+" will in die Haende klatschen - aber sie\n"
+        +"sausen durcheinander durch.\n", 0);
+    ParseRest(str);
+    if (!adverb && str)
+      Return("Klatsche wie?\n");
+    out_sel="Du klatschst@@adverb@@ in die Haende.";
+    out_oth="@@name@@ klatscht@@adverb@@ in die Haende.";
+    return FeelIt();
+
+    /**************** Klopfen ***************/
+    case "klopf":
+    HELPCHECK("klopf");
+    if (!str||sscanf(str,"%s auf schulter",sfoo)!=1)
+      if (!str||sscanf(str,"%s auf die schulter",sfoo)!=1)
+        Return("Klopfe wie wem wieso was?\n");
+    if (ghost())
+      Return("Das geht leider nicht mit durchlaessigen Haenden.\n");
+    str=sfoo;
+    if (str=="") str=0;
+    ParseRest(str);
+    if (!who)
+      Return("Klopfe wem auf die Schulter?\n");
+    out_sel="Du klopfst @@wem@@@@adverb@@ auf die Schulter.";
+    out_vic="@@name@@ klopft Dir@@adverb@@ auf die Schulter.";
+    out_oth="@@name@@ klopft @@wem@@@@adverb@@ auf die Schulter.";
+    return FeelIt();
+
+    /**************** Knabbern ***************/
+    case "knabber":
+    HELPCHECK("knabber");
+    if (ghost())
+      Return("Sorry, aber dafuer fehlt Dir im Moment der noetige "
+        +"\"Biss\"...\n");
+    ParseRest(str);
+    if (!who)
+      Return("Knabbere wen an?\n");
+    if (CheckLife(NOT_SELF,NOT_DEAD,
+      "Du kommst nicht an dein eigenes Ohr ran...",
+      "Noe, noe, das schmeckt bestimmt nicht gut."))
+        return 1;
+    out_sel="Du knabberst@@adverb@@ an "+who->name(WESSEN)+" Ohr.";
+    out_vic="@@name@@ knabbert@@adverb@@ an Deinem Ohr.";
+    out_oth="@@name@@ knabbert@@adverb@@ an "+who->name(WESSEN)+" Ohr.";
+    return FeelIt();
+
+    /**************** Knicksen ***************/
+    case "knicks":
+    HELPCHECK("knicks");
+    GHOSTCHECK("Du knickst in der Mitte ab, kriegst Dich aber schnell wieder "
+        +"zusammen.\n",
+      gname()+" knick(s)t in der Mitte ab, kriegt sich aber\n"
+        +"zum Glueck schnell wieder zusammen.\n", 0);
+    if (!str) {
+      out_sel="Du machst einen anmutigen Knicks.";
+      out_oth="@@name@@ macht einen anmutigen Knicks.";
+    }
+    else  {
+      ParseRest(str,"vor");
+      if (for_all)  {
+        out_sel="Du knickst@@adverb@@ vor @@alle@@.";
+        out_vic="@@name@@ knickst@@adverb@@ vor @@alle@@.";
+        return MixedOut(WEM);
+      }
+      if (!who && !adverb)
+        Return("Knickse irgendwie oder vor jemandem.\n");
+      if (who && CheckLife(NOT_SELF,NOT_DEAD,
+        "Wie willst Du das denn schaffen?",
+        "Vor Sachen wird hier nicht geknickst!"))
+          return 1;
+      out_sel="Du knickst@@adverb@@"+(who ? " vor" : "")+"@@ wem@@.";
+      if (who ) out_vic="@@name@@ knickst@@adverb@@ vor Dir.";
+      out_oth="@@name@@ knickst@@adverb@@"+(who ? " vor" : "")+"@@ wem@@.";
+    }
+    return FeelIt();
+
+    /**************** Knirschen ***************/
+    case "knirsch":
+    HELPCHECK("knirsch");
+    if (ghost())
+      Return("Du kannst mit nichts knirschen, so als Geist. Versuche doch "
+        +"dafuer\nmal, zu rasseln...\n");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Knirsche wie?\n");
+    switch (QueryProp(P_RACE))  {
+      case "greif"  : str1="dem Schnabel."; break;
+      case "sandtiger" : str1="den Fangzaehnen."; break;
+      case "drache" : str1="den Fangzaehnen."; break;
+      default       : str1="den Zaehnen.";
+    }
+    out_sel="Du knirschst@@adverb@@ mit "+str1;
+    out_oth="@@name@@ knirscht@@adverb@@ mit "+str1;
+    return FeelIt();
+
+    /**************** Knuddeln ***************/
+    case "knuddel":
+    case "knuddl":
+    HELPCHECK("knuddel");
+    if (ghost())
+      Return("Sorry, nicht als Geist.\n");
+    ParseRest(str);
+    if (for_all)  {
+      out_sel="Du knuddelst @@alle@@@@adverb@@.";
+      out_vic="@@name@@ knuddelt @@alle@@@@adverb@@.";
+      return MixedOut(WEN);
+    }
+    if (!who)
+      Return("Knuddle wen?\n");
+    if (CheckLife(NOT_SELF,NOT_DEAD,
+      "Das bringt doch nix, lass es halt.",
+      "Du kannst soviel ich weiss ausser Lebewesen nur Teddys knuddeln."))
+        return 1;
+    out_sel="Du knuddelst@@ wen@@@@adverb@@.";
+    out_vic="@@name@@ knuddelt Dich@@adverb@@.";
+    out_oth="@@name@@ knuddelt@@ wen@@@@adverb@@.";
+    return FeelIt();
+
+    /**************** Knurren ***************/
+    case "knurr":
+    HELPCHECK("knurr");
+    ParseRest(str);
+    if (for_all)  {
+      out_sel="Du knurrst @@alle@@@@adverb@@ an.";
+      out_vic="@@gname@@ knurrt @@alle@@@@adverb@@ an.";
+      return MixedOut(WEN);
+    }
+    if (str && !who && !adverb)
+      Return("Wen anknurren oder wie knurren?\n");
+    if (who && CheckLife(NOT_SELF,NOT_DEAD,
+      "Du knurrst in Dich hinein.",
+      "Reagiert nicht. Solltest wohl besser Lebwesen anknurren."))
+        return 1;
+    out_sel="Du knurrst@@ wen@@@@adverb@@"+(who ? " an." : ".");
+    if (who) out_vic="@@gname@@ knurrt Dich@@adverb@@ an.";
+    out_oth="@@gname@@ knurrt@@ wen@@@@adverb@@"+(who ? " an." : ".");
+    return FeelIt();
+
+    /****************  Knutschen ***************/
+    case "knutsch":
+    HELPCHECK("knutsch");
+    if (ghost())
+      Return("Das kannst Du als Geist leider nicht. Irgendwie fehlt Dir "
+        +"dazu das Herz.\n");
+    ParseRest(str);
+    if (!who)
+      Return("Knutsche wen ab?\n");
+    if (CheckLife(NOT_SELF,NOT_DEAD,
+      "Das geht nicht.",
+      "Igitt! Lieber nicht!"))
+        return 1;
+    out_sel="Du gibst @@wem@@@@adverb@@ einen RICHTIGEN Kuss.";
+    out_vic="@@name@@ gibt Dir@@adverb@@ einen tiefen und hingebungsvollen "
+      +"Kuss.\nDu schwebst im 7. Himmel.";
+    out_oth="@@name@@ gibt @@wem@@@@adverb@@ einen tiefen und "
+      +"hingebungsvollen Kuss.";
+    return FeelIt();
+
+    /**************** Kotzen ***************/
+    case "kotz":
+    HELPCHECK("kotz");
+    if (ghost())
+      Return("Ne, das ist eins von den Sachen, die als Geist nicht gehen.\n");
+    ParseRest(str);
+    if (str && !who && !adverb)
+      Return("Kotze wie? Kotze auf wen?\n");
+    if (who && CheckLife(NOT_SELF,0,
+      "Igitt, nein danke."))
+        return 1;
+    if(!str) {
+      out_sel="Du kotzt ueber deine Schuhe.";
+      out_oth="@@name@@ verdreht die Augen und kotzt.";
+    }
+    else  {
+      out_sel="Du kotzt@@adverb@@"+(who ? " auf @@wen@@." : ".");
+      if (who) out_vic="@@name@@ kotzt@@adverb@@ auf Dich.";
+      out_oth="@@name@@ kotzt@@adverb@@"+(who ? " auf @@wen@@." : ".");
+    }
+    return FeelIt();
+
+    /**************** Kratzen ***************/
+    case "kratz":
+    HELPCHECK("kratz");
+    ParseRest(str);
+    if (who && (who!=this_player()))
+      Return("Das mach mal schoen nur mit Dir selber.\n");
+    if (str && !adverb)
+      Return("Wie willst Du Dich kratzen?\n");
+    out_sel="Du kratzt dich@@adverb@@ am Kopp.";
+    out_oth="@@gname@@ kratzt sich@@adverb@@ am Kopp.";
+    return FeelIt();
+
+    /**************** Krieche ***************/
+    case "kriech":
+    HELPCHECK("kriech");
+    ParseRest(str);
+    out_sel="Du kriechst"+(who ? " vor @@wem@@" : "")+"@@adverb@@ im Staub.";
+    if (who) out_vic="@@gname@@ kriecht@@adverb@@ vor Dir im Staub.";
+    out_oth="@@gname@@ kriecht"+(who ? " vor @@wem@@" : "")
+      +"@@adverb@@ im Staub.";
+    return FeelIt();
+
+    /**************** Kuessen ***************/
+    case "kuess":
+    HELPCHECK("kuess");
+    if (ghost())
+      Return("Als Geist kannst Du leider niemanden kuessen.\n");
+    ParseRest(str);
+    if (!who)
+      Return("Wen willst Du kuessen?\n");
+    if (CheckLife(NOT_SELF,NOT_DEAD,
+      "Da hast Du aber Schwierigkeiten... Du gibst es schliesslich auf.",
+      "Nix. Absolut nix. Kuesse lieber Lebewesen - die reagieren\n"
+        +"wenigstens (und sei es, dass sie Dich fressen...)."))
+        return 1;
+    out_sel="Du kuesst@@ wen@@@@adverb@@.";
+    out_vic="@@name@@ kuesst Dich@@adverb@@.";
+    out_oth="@@name@@ kuesst@@ wen@@@@adverb@@.";
+    FeelIt();
+    if (who->QueryProp(P_FROG)&&QueryProp(P_LEVEL)>who->QueryProp(P_LEVEL)) {
+      tell_room(environment(this_player()),"PLOPP!\n");
+      write("Huch! Du wirst auf einmal so gruen und klein und kriegst auf\n"
+        +"einmal furchtbar Hunger auf Fliegen und so...\n");
+      who->Message("Auf einmal wird die Welt um Dich wieder so klein, wie sie\n"
+        +" frueher mal war - und vor Dir sitzt ein kleiner gruener Frosch.\n");
+      say(who->name(WER)+" steht auf einmal da und schaut dumm aus der "
+        +"Waesche. Dafuer fehlt\njetzt seltsamerweise "+capname()
+        +". Die Gesamtzahl an kleinen gruenen\nFroeschen im Raum hat sich "
+        +"jedoch nicht geaendert...\n",({who,this_player()}));
+      who->SetProp(P_FROG,0);
+      SetProp(P_FROG,1);
+    }
+    return 1;
+
+    /**************** Kuscheln ***************/
+    case "kuschel":
+    case "kuschl":
+    HELPCHECK("kuschel");
+    GHOSTCHECK("Dazu bist Du als Geist viel zu kalt und gar "
+        +"schroecklich anzusehen.\n",
+      gname()+" scheint Anwandlungen zu haben, sich an jemand "
+        +"ankuscheln zu wollen.\nEntsetzt springen alle zurueck, weil "
+        +"dazu ist er doch zu kalt und schroecklich\nanzusehen.\n", 0);
+    ParseRest(str);
+    if (!who)
+      Return("An wen willst Du Dich ankuscheln?\n");
+    out_sel="Du kuschelst Dich@@adverb@@ an @@wen@@ an.";
+    out_vic="@@name@@ kuschelt sich@@adverb@@ an Dich an.";
+    out_oth="@@name@@ kuschelt sich@@adverb@@ an @@wen@@ an.";
+    return FeelIt();
+
+    /**************** Lachen ***************/
+    case "lach":
+    HELPCHECK("lach");
+    GHOSTCHECK("Du lachst mit hohler Stimme. Den Umstehenden (sind doch welche"
+        +" da, oder?)\nlaeuft es kalt den Ruecken runter.\n",
+      gname()+" lacht mit hohler Stimme.\nDir laeuft es eiskalt den Ruecken"
+        +" runter.\n", 0);
+    if (!str)  {
+      out_sel="Du brichst vor Lachen zusammen.";
+      out_oth="@@name@@ bricht vor Lachen zusammen.";
+    }
+    else  {
+      ParseRest(str);
+      if (for_all)  {
+        out_sel="Du lachst@@adverb@@ ueber @@alle@@.";
+        out_vic="@@name@@ lacht@@adverb@@ ueber @@alle@@.";
+        return MixedOut(WEN);
+      }
+      if (!who && !adverb)
+        Return("Lache wie, lache ueber wen?\n");
+      if (who && CheckLife(NOT_SELF,NOT_DEAD,
+        "Lach Dich doch nicht selber aus - das machen schon andere...",
+        "Gelacht wird nur ueber Lebewesen (die koennen sich drueber aergern)."))
+          return 1;
+      out_sel="Du lachst@@adverb@@"+(who?" ueber@@ wen@@":"")+".";
+      if (who) out_vic="@@name@@ lacht@@adverb@@ ueber Dich.";
+      out_oth="@@name@@ lacht@@adverb@@"+(who?" ueber@@ wen@@":"")+".";
+    }
+    return FeelIt();
+
+    /**************** Laecheln ***************/
+    case "laechel":
+    case "laechl":
+    HELPCHECK("laechel");
+    if (ghost()) {
+      write("Du laechelst innerlich.\n");
+      return 1;
+    }
+    if(!str) {
+      out_sel="Du laechelst.";
+      out_oth="@@name@@ laechelt.";
+    }
+    else  {
+      ParseRest(str);
+      if (for_all)  {
+        out_sel="Du laechelst @@alle@@@@adverb@@ an.";
+        out_vic="@@name@@ laechelt @@alle@@@@adverb@@ an.";
+        return MixedOut(WEN);
+      }
+      if (!who && !adverb && str)
+        Return("Wie oder wen?\n");
+      if (who && CheckLife(NOT_SELF,NOT_DEAD,
+        "Musst schon jemand anders anlaecheln.",
+        "Bitte ein Lebewesen anlaecheln."))
+          return 1;
+      out_sel="Du laechelst@@ wen@@@@adverb@@"+(who ? " an." : ".");
+      if (who) out_vic="@@name@@ laechelt Dich@@adverb@@ an.";
+      out_oth="@@name@@ laechelt@@ wen@@@@adverb@@"+(who ? " an." : ".");
+    }
+    return FeelIt();
+
+    /**************** Liebe ***************/
+    /* These lines appear Courtesy of Angus@MorgenGrauen. So long, and thanks */
+    /* for all the fish, errr, text, Angus :) */
+    case "lieb":
+    HELPCHECK("lieb");
+    if (ghost())
+      Return("Auf diese Freuden musst Du als Geist leider verzichten.\n");
+    ParseRest(str);
+    if (!who)
+      Return("Wen hast Du lieb?\n");
+    if (CheckLife(NOT_SELF,NOT_DEAD,
+      "Ja, ich weiss, Du magst Dich, aber das musst Du nicht zur Schau"
+        +"stellen.",
+      "Du entwickelst seltsame Neigungen, finde ich."))
+        return 1;
+    str1=(who->QueryProp(P_GENDER)==FEMALE ? "ihr" : "ihm");
+    /* old version:
+      out_sel="Du fluesterst @@wem@@@@adverb@@ liebevolle Worte ins Ohr.";
+      out_vic=gname()+" fluestert Dir@@adverb@@ liebevolle Worte ins Ohr.";
+      out_oth=gname()+" fluestert@@adverb@@ sanfte Worte zu @@wem@@.";
+    */
+    out_sel="Du schliesst die Augen, schmiegst Dich eng an @@wen@@ und gibst"
+      +LF+str1+" einen zaertlichen und leidenschaftlichen Kuss.\n"
+      +"Um Dich herum versinkt die Welt und Du glaubst, auf Wolken zu "
+      +"schweben.";
+    out_vic="@@name@@ drueckt Dich zaertlich an sich und gibt Dir\n"
+      +"einen zaertlichen und leidenschaftlichen Kuss. Du schliesst die\n"
+      +"Augen und traeumst ein wenig......Du schwebst auf Wolken direkt\n"
+      +"in den siebten Himmel.";
+    out_oth="Du schaust dezent weg, als sich @@name@@ und "+who->name()
+      +" verliebt in die Arme\nsinken.";
+    return FeelIt();
+
+    /**************** Loben ***************/
+    case "lob":
+    HELPCHECK("lob");
+    if (!str)
+      Return("Wen oder was willst Du loben?\n");
+    ParseRest(str);
+    if (who==ME)  {
+      ofoo=clone_object("/items/furz");
+      ofoo->set_furzer(this_player());
+      ofoo->set_eigenlob();
+      ofoo->move(environment(this_player()));
+      //DEBUG Furz zum Eigenlob patchen :>
+      out_sel="Du lobst Dich selber@@adverb@@. Die Folgen kennst Du ja...";
+      out_oth="@@gname@@ lobt sich selber@@adverb@@, mit den bekannten Folgen.";
+    } else if (who) {
+      out_sel="Du lobst @@wen@@@@adverb@@.";
+      out_vic="@@gname@@ lobt Dich@@adverb@@.";
+      out_oth="@@gname@@ lobt @@wen@@@@adverb@@.";
+    } else  {
+      out_sel="Du lobst "+str+".";
+      out_oth="@@gname@@ lobt "+str+".";
+    }
+    return FeelIt();
+
+    /**************** Moppern ***************/
+    case "mopper":
+    HELPCHECK("mopper");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Moppere wie?\n");
+    out_sel="Du mopperst@@adverb@@.";
+    out_oth="@@gname@@ moppert@@adverb@@.";
+    return FeelIt();
+
+    /**************** Mustern ***************/
+    case "muster":
+    HELPCHECK("muster");
+    ParseRest(str);
+    if (!who)
+      Return("Mustere wen?\n");
+    out_sel="Du musterst @@wen@@@@adverb@@.";
+    out_vic="@@gname@@ mustert Dich@@adverb@@.";
+    out_oth="@@gname@@ mustert @@wen@@@@adverb@@.";
+    return FeelIt();
+
+    /**************** Nicken ***************/
+    case "ja":
+    case "nick":
+    HELPCHECK("nick");
+    ParseRest(str);
+    if (for_all)  {
+      out_sel="Du nickst @@alle@@@@adverb@@ zu.";
+      out_vic="@@gname@@ nickt @@alle@@@@adverb@@ zu.";
+      return MixedOut(WEM);
+    }
+    if (str && !who && !adverb)
+      Return("Nicke wie oder wem zu oder wem wie zu?\n");
+    if (who && CheckLife(NOT_SELF,NOT_DEAD,
+      "Du willst Dir selber zunicken? Lieber nicht, das sieht so albern aus.",
+      "Hm. Nix passiert. Von Lebewesen bekommt man meistens mehr Feedback."))
+        return 1;
+    out_sel="Du nickst@@ wem@@@@adverb@@"
+      +(who ? " zu." : (adverb ? "." : " zustimmend."));
+    if (who) out_vic="@@gname@@ nickt Dir@@adverb@@ zu.";
+    out_oth="@@gname@@ nickt@@ wem@@@@adverb@@"
+      +(who ? " zu." : (adverb ? "." : " zustimmend."));
+    return FeelIt();
+
+    /**************** Niesen ***************/
+    case "nies":
+    HELPCHECK("nies");
+    if (ghost())
+      Return("Du hast keine Nase mehr, in der es Dich jucken koennte...\n");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Niese wie?\n");
+    out_sel="Haaaaaa-tschi! Gesundheit!"+(adverb ? " Du niest@@adverb@@." : "");
+    out_oth="Haaaaaa-tschi! @@name@@ niest@@adverb@@.";
+    return FeelIt();
+
+    /**************** Ohrfeigen ***************/
+    case "gib":
+    HELPCHECK("gib");
+    if (!str)
+      Return("Gib wem was?\n");
+    if (sscanf( str,"%s ohrfeige",str1)==0)
+      return 0;
+    ParseRest(str, ({"ohrfeige", "eine ohrfeige"}));
+    if (for_all)  {
+      out_sel="Du verpasst @@alle@@@@adverb@@ eine Ohrfeige.";
+      out_vic="@@name@@ verpasst @@alle@@@@adverb@@ eine Ohrfeige.";
+      return MixedOut(WEM);
+    }
+    if (!who)
+      Return("Gib wem eine Ohrfeige?\n");
+    if (CheckLife(NOT_SELF,NOT_DEAD,
+      "Dazu sind Dir Deine Backen doch zu schade.",
+      "Du wirst doch nichts schlagen, was sich nicht wehren kann?"))
+        return 1;
+    GHOSTCHECK("Deine Hand saust mit voller Wucht durch dein Opfer durch!",
+      gname()+" will "+who->name(WEM)+" eine Ohrfeige geben - aber die Hand\n"
+        +"saust mit voller Wucht durch das Opfer durch!", 0);
+    out_sel="Du verpasst @@wem@@@@adverb@@ eine schallende Ohrfeige.";
+    out_vic="@@name@@ verpasst Dir@@adverb@@ eine Watsche, dass Dir Hoeren "
+      +"und Sehen vergeht.";
+    out_oth="@@name@@ verpasst @@wem@@@@adverb@@ eine schallende Ohrfeige.";
+    return FeelIt();
+
+    /**************** Pfeifen ***************/
+    case "pfeif":
+    HELPCHECK("pfeif");
+    GHOSTCHECK("Es kommt leider nur (nicht mal heisse) Luft, aber kein "
+        +"Pfiff.\n",
+      gname()+" spitzt den Mund und pustet angestrengt. Nichts passiert.\n", 0);
+    ParseRest(str, "nach");
+    if (str && !who && !adverb)
+      Return("Pfeife wie? Pfeife wem nach? Haeh?\n");
+    if (who && CheckLife(NOT_SELF,NOT_DEAD,
+      "Was willst Du denn damit ausdruecken? Das gibt fuer mich keinen Sinn.",
+      "Ich habe keine Lust dazu."))
+        return 1;
+    out_sel="Du pfeifst@@ wen@@@@adverb@@"
+      +(who ? " nach." : (adverb ? "." : " anerkennend."));
+    if (who) out_vic="@@name@@ pfeift Dir@@adverb@@ nach.";
+    out_oth="@@name@@ pfeift@@ wen@@@@adverb@@"
+      +(who ? " nach." : (adverb ? "." :" anerkennend."));
+    return FeelIt();
+
+    /**************** Philosophieren ***************/
+    case "philosophier":
+    HELPCHECK("philosophier");
+    ParseRest(str);
+    out_sel="Du philosophierst"+(adverb ? "@@adverb@@." :
+      (str ? " ueber "+str+"." : "."));
+    out_oth="@@gname@@ philosophiert"+(adverb ? "@@adverb@@." :
+      (str ? " ueber "+str+"." : "."));
+    return FeelIt();
+
+    /**************** (Nase) Putzen ***************/
+    case "putz":
+    HELPCHECK("putz");
+    if (ghost())
+      Return("Nix da zum Putzen, so nebuloes, wie Du bist.\n");
+    ParseRest(str, ({"nase", "die nase"}));
+    if (str && str!="nase" && !adverb)
+      Return("Putze Deine Nase wie?\n");
+    out_sel="Du putzt Deine Nase@@adverb@@.";
+    out_oth="@@name@@ putzt@@adverb@@ "+QPP(FEMALE,WEN)+" Nase.";
+    return FeelIt();
+
+    /**************** Quaken ***************/
+    case "quak":
+    HELPCHECK("quak");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Quake wie?\n");
+    sfoo="";
+    flag=QueryProp(P_FROG)&&!ghost();
+    for (t_g=0; t_g<=random(flag ? 4 : 2); t_g++)  {
+      sfoo+=(flag ? " Qu" : " kw");
+      for (t_n=0; t_n<=random(flag ? 10 : 5); t_n++)
+        sfoo+="aA"[random(1)..random(1)];
+      sfoo+="k";
+    }
+    if (!flag)
+      sfoo=lower_case(sfoo);
+    else
+      sfoo+="!";
+    out_sel="Du quakst"+(adverb ? "@@adverb@@" : (flag ? " aus voller Kehle"
+      : " in etwa wie ein Frosch"))+":"+sfoo;
+    out_oth="@@gname@@ quakt"+(adverb ? "@@adverb@@" : (flag ? " aus voller Kehle"
+      : " in etwa wie ein Frosch"))+":"+sfoo;
+    return FeelIt();
+
+    /**************** Quietschen ***************/
+    case "quietsch":
+    case "quiek":
+    HELPCHECK("quiek");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Quietsche wie?\n");
+    out_sel="Du quietschst"+(adverb ? "@@adverb@@." : " vergnuegt.");
+    out_oth="@@gname@@ quietscht"+(adverb ? "@@adverb@@." : " vergnuegt.");
+    return FeelIt();
+
+    /**************** Raeuspern ***************/
+    case "raeusper":
+    HELPCHECK("raeusper");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Hm? Wie meinen?\n");
+    out_sel="Du raeusperst Dich@@adverb@@.";
+    out_oth="@@gname@@ raeuspert sich@@adverb@@.";
+    return FeelIt();
+
+    /**************** Reiben ***************/
+    case "reib":
+    HELPCHECK("reib");
+    if (ghost())
+      Return("Du hast nichts zum Reiben, aber auch gar nichts.\n");
+    if (str && (sscanf(str,"%s die Augen",sfoo)==1 || sscanf(str,"%s Augen",sfoo)==1))
+      str=sfoo;
+    else if (str && (sscanf(str,"%s die Haende",sfoo)==1
+    ||sscanf(str,"%s Haende",sfoo)==1))  {
+      flag=2;
+      str=sfoo;
+    }
+    if (str=="") str=0;
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Reibe wie die "+(flag==2 ? "Haende" : "Augen")+"?\n");
+    out_sel="Du reibst Dir"+(adverb ? "@@adverb@@"
+      : (flag==2 ? " vergnuegt" : " muede"))+" die "
+      +(flag==2 ? "Haende." : "Augen.");
+    out_oth="@@name@@ reibt sich"+(adverb ? "@@adverb@@"
+      : (flag==2 ? " vergnuegt" : " muede"))+" die "
+      +(flag==2 ? "Haende." : "Augen.");
+    return FeelIt();
+
+    /**************** Rotfln ***************/
+    case "rotfl":
+    HELPCHECK("rotfl");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Rotfl wie?\n");
+    out_sel="Du rotflst@@adverb@@.";
+    out_oth="@@gname@@ rotflt@@adverb@@.";
+    return FeelIt();
+
+    /**************** Ruelpsen ***************/
+    case "ruelps":
+    HELPCHECK("ruelps");
+    GHOSTCHECK("Ein leichter Windhauch entfaehrt Deinem Mund, mehr nicht.\n",
+      "Dem Mund des Geistes von "+capname()
+        +" entfaehrt ein leichtes Lueftchen.\n", 0);
+    if (!str)  {
+      out_sel="BOOOOEEERRRRPP!  Entschuldige dich gefaelligst!";
+      out_oth="@@name@@ ruelpst unanstaendig.";
+    }
+    else  {
+      ParseRest(str);
+      if (!adverb)  {
+        write("Ruelpse wie (schlimm genug, dass Du Dich nicht beherrschen "
+          +"kannst!)?\n");
+        return 1;
+      }
+      out_sel="Du ruelpst@@adverb@@. Schaem Dich!";
+      out_oth="@@name@@ ruelpst@@adverb@@ und wird nicht mal rot dabei.";
+    }
+    return FeelIt();
+  }
+
+  switch (vb)  {
+    /**************** Runzeln ***************/
+    case "runzel":
+    case "runzl":
+    HELPCHECK("runzel");
+    if (ghost())
+      Return("DAS geht als Geist nun wirklich nicht.\n");
+    ParseRest(str,"stirn");
+    if (str && !adverb)
+      Return("Runzle die Stirn wie?\n");
+    out_sel="Du runzelst@@adverb@@ die Stirn.";
+    out_oth="@@name@@ runzelt@@adverb@@ die Stirn.";
+    return FeelIt();
+
+    /**************** Sabbere ***************/
+    case "sabber":
+    HELPCHECK("sabber");
+    sfoo=ghost() ? "schleim" : "sabber";
+    ParseRest(str);
+    if (str && !adverb && !who)
+      Return("Sabber wie oder wen an?\n");
+    out_sel="Du "+sfoo+"st@@ wen@@@@adverb@@ "
+      +(who ? "an." : "auf den Boden.");
+    if (who) out_vic="@@gname@@ "+sfoo+"t Dich@@adverb@@ an.";
+    out_oth="@@gname@@ "+sfoo+"t@@ wen@@@@adverb@@ "
+      +(who ? "an." : "auf den Boden.");
+    return FeelIt();
+
+    /**************** Schaemen ***************/
+    case "schaem":
+    HELPCHECK("schaem");
+    ParseRest(str);
+    if (str && !adverb && lower_case(str)!="dich")
+      Return("Schaeme Dich wie?\n");
+    out_sel="Du schaemst Dich@@adverb@@.";
+    out_oth="@@gname@@ schaemt sich@@adverb@@.";
+    return FeelIt();
+
+#ifdef SCHAU_AN
+    /**************** Schau an ***************/
+    case "schau":
+    HELPCHECK("schau");
+    if (!str || old_explode(str, " ")[sizeof(old_explode(str, " "))]!="an")
+      return 0;
+    ParseRest(str, "an");
+    if (!who)
+      Return("Schau wen an?\n");
+    out_sel="Du schaust @@wen@@@@adverb@@ an.";
+    out_vic="@@gname@@ schaut Dich@@adverb@@ an.";
+    out_oth="@@gname@@ schaut @@wen@@@@adverb@@ an.";
+    return FeelIt();
+#endif
+
+    /**************** Schluchzen ***************/
+    case "schluchz":
+    HELPCHECK("schluchz");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Schluchze wie?\n");
+    out_sel="Du schluchzt"+(adverb ? "@@adverb@@." : " herzzerreissend.");
+    out_oth="@@gname@@ schluchzt"
+      +(adverb ? "@@adverb@@." : " herzzerreissend.");
+    return FeelIt();
+
+    /**************** Schmollen ***************/
+    case "schmoll":
+    HELPCHECK("schmoll");
+    GHOSTCHECK("Du schwebst beleidigt in die Ecke.\n",
+      gname()+" schwebt beleidigt in die Ecke und schmollt.\n", 0);
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Schmolle wie?\n");
+    out_sel="Du schmollst@@adverb@@.";
+    out_oth="@@name@@ geht in die Ecke und schmollt@@adverb@@.";
+    return FeelIt();
+
+    /**************** Schmunzeln ***************/
+    case "schmunzel":
+    case "schmunzl":
+    HELPCHECK("schmunzel");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Schmunzle wie?\n");
+    out_sel="Du schmunzelst@@adverb@@.";
+    out_oth="@@gname@@ schmunzelt@@adverb@@.";
+    return FeelIt();
+
+    /**************** Schnalzen ***************/
+    case "schnalz":
+    HELPCHECK("schnalz");
+    ParseRest(str, ({"zunge","mit zunge", "mit der zunge"}));
+    out_sel="Du schnalzt@@adverb@@ mit der Zunge.";
+    out_oth="@@gname@@ schnalzt@@adverb@@ mit der Zunge.";
+    return FeelIt();
+
+    /**************** Schnauben ***************/
+    case "schnaub":
+    HELPCHECK("schnaub");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Schnaube wie?\n");
+    out_sel="Du schnaubst"+(adverb ? "@@adverb@@." : " entruestet.");
+    out_oth="@@gname@@ schnaubt"+(adverb ? "@@adverb@@." : " entruestet.");
+    return FeelIt();
+
+    /**************** Schnaufen ***************/
+    case "schnauf":
+    HELPCHECK("schnauf");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Schnaufe wie?\n");
+    out_sel="Du schnaufst"+(adverb ? "@@adverb@@." : " vor Anstrengung.");
+    out_oth="@@gname@@ schnauft"+(adverb ? "@@adverb@@." : " vor Anstrengung.");
+    return FeelIt();
+
+    /**************** Schnippen ***************/
+    case "schnipp":
+    case "schnipps":
+    HELPCHECK("schnipp");
+    GHOSTCHECK("Du schaffst es nicht, weil die Finger durcheinander durch "
+        +"gehen.\n",
+      gname()+" versagt beim Schnippen - die Finger\ngehen durcheinander "
+        +"durch.\n", 0);
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Schnippe wie?\n");
+    out_sel="Du schnippst@@adverb@@ mit deinen Fingern.";
+    out_oth="@@name@@ schnippt@@adverb@@ mit den Fingern.";
+    return FeelIt();
+
+    /**************** Schnarchen ***************/
+    case "schnarch":
+    HELPCHECK("schnarch");
+    if (ghost())
+      Return("Ich glaube, da fehlen Dir irgendwie die physischen "
+        +"Voraussetzungen dazu.\n");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Schnarche wie?\n");
+    out_sel=(str ? "Zzzzzzzzzzz..." : "Du schnarchst@@adverb@@.");
+    out_oth="@@name@@ schnarcht "+(str ? "@@adverb@@." : "laut.");
+    return FeelIt();
+
+    /**************** Schniefen ***************/
+    case "snief":
+    case "schnief":
+    HELPCHECK("schnief");
+    GHOSTCHECK("Du schniefst ganz leise.\n",
+      gname()+" schnieft ganz leise.\n", 0);
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Schniefe wie?\n");
+    out_sel="Du schniefst@@adverb@@.";
+    out_oth="@@name@@ schnieft@@adverb@@.";
+    return FeelIt();
+
+    /**************** Schnurren ***************/
+    case "schnurr":
+    HELPCHECK("schnurr");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Wie willst Du schnurren?\n");
+    out_sel="MMMMIIIIIAAAAAAUUUUUUUU! Du schnurrst"
+      +(adverb ? "@@adverb@@." : " zufrieden.");
+    out_oth="@@gname@@ schnurrt"+(adverb ? "@@adverb@@." : " zufrieden.");
+    return FeelIt();
+
+    /**************** Schreien ***************/
+    case "schrei":
+    HELPCHECK("schrei");
+    GHOSTCHECK("AAAAIIIIIIIIIIIEEEEEEEEEEEEEEEEEEEEEEEEEE! Ja, nur Geister "
+        +"koennen so schreien!\n",
+      gname()+" schreit - das Blut gefriert fast in deinen Ader!\n", 0);
+    if (!str)  {
+      out_sel="AUUUAAAHHHHHH!!!!";
+      out_oth="@@name@@ schreit laut!";
+    }
+    else  {
+      ParseRest(str);
+      if (!who && !adverb)
+        Return("Schreien - wie denn? Oder wen denn anschreien?\n");
+      out_sel="Du schreist@@ wen@@@@adverb@@"+(who ? " an" : "")+".";
+      if (who) out_vic="@@name@@ schreit Dich@@adverb@@ an.";
+      out_oth="@@name@@ schreit@@ wen@@@@adverb@@"+(who? " an" : "")+".";
+    }
+    return FeelIt();
+
+    /**************** Schuetteln ***************/
+    case "schuettel":
+    case "schuettl":
+    HELPCHECK("schuettel");
+    ParseRest(str);
+    if (for_all)  {
+      out_sel="Du schuettelst @@alle@@@@adverb@@ die Haende.";
+      out_vic="@@gname@@ schuettelt @@alle@@@@adverb@@ die Haende.";
+      return MixedOut(WEM);
+    }
+    if (str && !who && !adverb)
+      Return("Schuettle wie? Schuettle wem die Hand?\n");
+    if(!who) {
+      out_sel="Du schuettelst Dich@@adverb@@.";
+      out_oth="@@gname@@ schuettelt sich@@adverb@@.";
+    }
+    else  {
+      if (CheckLife(0,NOT_DEAD,
+        "", "Noe, das mach ich nur mit Lebewesen."))
+          return 1;
+      if (who == this_player())  {
+        out_sel="Du hebst"+(adverb ? "@@adverb@@" : " triumphierend")
+          +" Deine Haende ueber den Kopf und schuettelst sie.";
+        out_oth="@@gname@@ hebt"+(adverb ? "@@adverb@@" : " triumphierend")
+          +" die Haende ueber den Kopf\nund schuettelt sie.";
+      }
+      else  {
+        out_sel="Du schuettelst@@ wem@@@@adverb@@ die Haende.";
+        if (ghost()) out_sel+="\nNaja, Du versuchst es wenigstens - "
+          +"immer diese durchlaessigen Haende...";
+        out_vic="@@gname@@ schuettelt Dir@@adverb@@ die Haende.";
+        if (ghost()) out_vic+="\nNaja, Du versuchst es wenigstens - "
+          +"immer diese durchlaessigen Haende...";
+        out_oth="@@gname@@ schuettelt@@ wem@@@@adverb@@ die Haende.";
+        if (ghost()) out_oth+="\nNaja, Du versuchst es wenigstens - "
+          +"immer diese durchlaessigen Haende...";
+      }
+    }
+    return FeelIt();
+
+    /**************** Schweigen ***************/
+    case "schweig":
+    HELPCHECK("schweig");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Schweige wie?\n");
+    out_sel="Du schweigst@@adverb@@.";
+    out_oth="@@gname@@ schweigt@@adverb@@.";
+    return FeelIt();
+
+    /**************** Seufzen ***************/
+    case "seufz":
+    HELPCHECK("seufz");
+    GHOSTCHECK("Du seufzt geisterhaft.\n",
+      gname()+" seufzt geisterhaft. Naja, wie denn sonst?\n", 0);
+    ParseRest(str);
+    if (!adverb && str)
+      Return("Seufze wie?\n");
+    out_sel="Du seufzst@@adverb@@.";
+    out_oth="@@name@@ seufzt@@adverb@@.";
+    return FeelIt();
+
+    /**************** Singen ***************/
+    case "sing":
+    HELPCHECK("sing");
+    if (!str) {
+      out_sel="Oh sole mio!";
+      out_oth="@@gname@@ singt irgendwas italienisches.";
+    }
+    else  {
+      ParseRest(str);
+      out_sel="Du singst@@adverb@@"+(adverb ? "." : " '"+capitalize(str)+"'.");
+      out_oth="@@gname@@ singt@@adverb@@"+(adverb ? "." : " '"
+        +capitalize(str)+"'.");
+    }
+    return FeelIt();
+
+    /**************** Sniffen ***************/
+    case "sniff":
+    HELPCHECK("sniff");
+    ParseRest(str);
+    if (str && !adverb && !who)
+      Return("Sniffe wie?\n");
+    out_sel="Du sniffst"+(who ? " @@wen@@" : "")
+      +(adverb ? "@@adverb@@" : " traurig")+(who ? " an." : ".");
+    if (who) out_vic="@@gname@@ snifft Dich"
+      +(adverb ? "@@adverb@@" : " traurig")+" an.";
+    out_oth="@@gname@@ snifft"+(who ? " @@wen@@" : "")
+      +(adverb ? "@@adverb@@" : " traurig")+(who ? " an." : ".");
+    return FeelIt();
+
+    /**************** Spucken ***************/
+    case "spuck":
+    HELPCHECK("spuck");
+    GHOSTCHECK("Du bringst nicht genug Spucke zusammen.\n",
+      gname()+" stellt gerade fest, dass man ohne Spucke nicht\n"
+        +"spucken kann.\n", 0);
+    ParseRest(str);
+    if (str && !who && !adverb)
+      Return("Spucke wen wie an?\n");
+    if (who && CheckLife(NOT_SELF,0,
+      "Hast Du Dich so schlecht benommen? Lass es lieber bleiben."))
+        return 1;
+    out_sel="Du spuckst@@ wen@@@@adverb@@ "+(who ? "an." : "auf den Boden.");
+    if (who) out_vic="@@name@@ spuckt Dich@@adverb@@ an.";
+    out_oth="@@name@@ spuckt@@ wen@@@@adverb@@ "
+      +(who ? "an." : "auf den Boden.");
+    return FeelIt();
+
+    /**************** Stampfen ***************/
+    case "stampf":
+    HELPCHECK("stampf");
+    ParseRest(str, "auf");
+    out_sel="Du stampfst@@adverb@@ mit dem Fuss auf.";
+    out_oth="@@gname@@ stampft@@adverb@@ mit dem Fuss auf.";
+    return FeelIt();
+
+    /**************** Starren ***************/
+    case "starr":
+    HELPCHECK("starr");
+    ParseRest(str);
+    if (str && !who && !adverb)
+      Return("Starre wie bzw. wen an?\n");
+    if (who && CheckLife(NOT_SELF,0,
+      "Wie willst Du in Deine eigenen Augen starren? "
+        +"(Spiegel gelten nicht...)"))
+        return 1;
+    out_sel="Du starrst"+(!str ? " ins Leere." : (who ? "@@ wen@@" : "")
+      +(adverb ? "@@adverb@@" : " vertraeumt")+(who ? " an." : "."));
+    if (who) out_vic="@@gname@@ starrt"+(adverb ? "@@adverb@@" : " tief")
+      +" in Deine Augen.";
+    out_oth="@@gname@@ starrt"+(!str ? " ins Leere." : (who ? "@@ wen@@" : "")
+      +(adverb ? "@@adverb@@" : " vertraeumt")+(who ? " an." : "."));
+    return FeelIt();
+
+    /**************** Staunen ***************/
+    case "staun":
+    HELPCHECK("staun");
+    if (!str)  {
+      out_sel="Du bist erstaunt.";
+      out_oth="@@gname@@ ist erstaunt.";
+    }
+    else  {
+      ParseRest(str, "ueber");
+      if (!who && !adverb)
+        Return("Bla bla. Wenn Du nach staune noch was tippst, sollte "
+          +"das ein\nLebewesen sein.\n");
+      if (who == this_player())  {
+        out_sel="Du staunst@@adverb@@ ueber Dich selber.";
+        out_oth="@@gname@@ staunt@@adverb@@ ueber sich selber.";
+      }
+      else  {
+        out_sel="Du staunst@@adverb@@"+(who ? " ueber @@wen@@." : ".");
+        if (who) out_vic="@@gname@@ staunt@@adverb@@ ueber Dich.";
+        out_oth="@@gname@@ staunt@@adverb@@"+(who ? " ueber @@wen@@." : ".");
+      }
+    }
+    return FeelIt();
+
+    /**************** Stieren ***************/
+    case "stier":
+    HELPCHECK("stier");
+    GHOSTCHECK("Du stierst mit hohlem Blick in die Gegend.\n",
+      gname()+" stiert mit hohlem Blick in die Gegend.\n", 0);
+    ParseRest(str);
+    if (str && !who && !adverb)
+      Return("Stiere wie oder wen an?\n");
+    if (who && CheckLife(NOT_SELF,NOT_DEAD,
+      "Du kannst Dich nicht selber anstieren.",
+      "Bitte nur Lebewesen anstieren."))
+        return 1;
+    out_sel="Du stierst@@ wen@@@@adverb@@"
+      +(who ? " an." : " in der Gegend herum.");
+    if (who) out_vic="@@gname@@ stiert Dich@@adverb@@ an.";
+    out_oth="@@gname@@ stiert@@ wen@@@@adverb@@"
+      +(who ? " an." : " in der Gegend herum.");
+    return FeelIt();
+
+    /**************** Stimme zu ***************/
+    case "stimm":
+    HELPCHECK("stimm");
+    ParseRest(str, "zu");
+    if (str && !who && !adverb)
+      Return("Stimme wem zu?\n");
+    out_sel="Du stimmst@@ wem@@@@adverb@@ zu.";
+    if (who) out_vic="@@gname@@ stimmt Dir@@adverb@@ zu.";
+    out_oth="@@gname@@ stimmt@@ wem@@@@adverb@@ zu.";
+    return FeelIt();
+
+    /**************** Stoehnen ***************/
+    case "stoehn":
+    HELPCHECK("stoehn");
+    GHOSTCHECK("Du stoehnst schauderlich.\n",
+      gname()+" stoehnt schauderlich. Zum Glueck\nhast Du ziemlich "
+        +"gute Nerven.\n", 0);
+    ParseRest(str);
+    if (!adverb && str)
+      Return("Wie willst Du stoehnen?\n");
+    out_sel="Du stoehnst@@adverb@@.";
+    out_oth="@@name@@ stoehnt@@adverb@@.";
+    return FeelIt();
+
+    /**************** Stossen ***************/
+    case "stoss":
+    HELPCHECK("stoss");
+    ParseRest(str);
+    if (!who)
+      Return("Stosse wen?\n");
+    if (CheckLife(NOT_SELF,NOT_DEAD,
+      "Was soll der Unsinn? Lass das!",
+      "Das gibt nur bei Lebewesen Sinn."))
+        return 1;
+    GHOSTCHECK("Dein Ellenbogen versinkt in "+who->name(WEM)+".\n",
+      gname()+" will "+who->name(WEM)+" in die Rippen stossen, aber "
+        +QPP(MALE,WER,PLURAL)+"\nEllenbogen verteilen keinen Stoss, "
+        +"sondern versinken.\n",
+      gname()+" will Dich in die Rippen stossen, aber "+QPP(MALE,WER,PLURAL)
+        +" Ellenbogen versinken.\n");
+    out_sel="Du stoesst@@ wen@@@@adverb@@ in die Rippen.";
+    out_vic="@@name@@ stoesst Dir@@adverb@@ in die Rippen.";
+    out_oth="@@name@@ stoesst@@ wen@@@@adverb@@ in die Rippen.";
+    return FeelIt();
+
+    /**************** Streicheln ***************/
+    case "streichel":
+    case "streichl":
+    HELPCHECK("streichel");
+    ParseRest(str);
+    if (!who)
+      Return("Streichle wen?\n");
+    if (for_all)  {
+      out_sel="Du streichelst @@alle@@@@adverb@@.";
+      out_vic="@@gname@@ streichelt @@alle@@@@adverb@@.";
+      return MixedOut(WEN);
+    }
+    if (CheckLife(NOT_SELF,NOT_DEAD,
+      "Lass Dich von anderen streicheln.",
+      "Ich streichle nur Lebewesen."))
+        return 1;
+    GHOSTCHECK("Du willst "+who->name(WEN,2)+" streicheln, aber Deine "
+      +"Haende koennen\nnichts beruehren.\n",
+    gname()+" will "+who->name(WEN,2)+" streicheln, aber diese\n"
+      +"Geisterhaende koennen halt nix beruehren...\n",
+    gname()+" will Dich streicheln, scheitert aber wie so oft an\n"
+      +"diesen dummen durchlaessigen Geisterhaenden.\n");
+    out_sel="Du streichelst @@wen@@@@adverb@@.";
+    out_vic="@@name@@ streichelt Dich@@adverb@@.";
+    out_oth="@@name@@ streichelt @@wen@@@@adverb@@.";
+    return FeelIt();
+
+    /**************** Stupsen ***************/
+    case "stups":
+    HELPCHECK("stups");
+    if (ghost())
+      Return("Das geht nicht ohne Ellenbogen,..\n");
+    ParseRest(str);
+    if (!who)
+      Return("Stupse wen an?\n");
+    out_sel="Du stupst @@wen@@@@adverb@@ an.";
+    out_vic="@@name@@ stupst Dich@@adverb@@ an.";
+    out_oth="@@name@@ stupst @@wen@@@@adverb@@ an.";
+    return FeelIt();
+
+    /**************** Stutzen ***************/
+    case "stutz":
+    HELPCHECK("stutz");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Stutze wie?\n");
+    out_sel="Du stutzt@@adverb@@.";
+    out_oth="@@gname@@ stutzt@@adverb@@.";
+    return FeelIt();
+
+    /**************** Taetscheln ***************/
+    case "taetschel":
+    case "taetschl":
+    HELPCHECK("taetschel");
+    ParseRest(str);
+    if (!who)
+      Return("Taetschle wen?\n");
+    if (CheckLife(NOT_SELF,NOT_DEAD,
+      "Das sieht zu doof aus, das mache ich nicht.",
+      "Ich taetschle nur Lebewesen."))
+        return 1;
+     GHOSTCHECK("Du willst "+who->name(WEN)+" taetscheln - aber Deine "
+        +"Haende gehen\nglatt durch den Kopf durch.\n",
+      gname()+" will "+who->name(WEN)+" den Kopf taetscheln, aber "
+        +"die Geister-\nhaende gehen glatt durch den Kopf durch.\n",
+      gname()+" will Deinen Kopf taetscheln, aber diese Geisterhaende "
+        +"gehen\nglatt durch Deinen Kopf durch - Du hast ein seltsames "
+        +"Gefuehl dabei.\n");
+    out_sel="Du taetschelst @@wem@@@@adverb@@ den Kopf.";
+    out_vic="@@name@@ taetschelt Dir@@adverb@@ den Kopf.";
+    out_oth="@@name@@ taetschelt @@wem@@@@adverb@@ den Kopf.";
+    return FeelIt();
+
+    /**************** Tanzen ***************/
+    case "tanz":
+    HELPCHECK("tanz");
+    GHOSTCHECK("Du tanzt den klassischen GeisterTanz (tm).\n",
+      gname()+" tanzt den klassischen GeisterTanz (tm).\n", 0);
+    if (!str) {
+      out_sel="Kommst Du Dir nicht irgendwie bloed vor? Du tanzt "
+        +"den Ententanz.";
+      out_oth="@@name@@ tanzt den Ententanz.";
+    }
+    else  {
+      taenze=({"Walzer","Polka","Rumba","Tango","Cha cha cha","Foxtrott",
+        "Mambo","Salsa","Slowfox","Breakdance","Pogo","Merengue",
+        "Rock'n'Roll","Ballett","Regentanz","Hexentanz"});
+      ParseRest(str,"mit");
+      if (!who)
+        Return("Mit wem willst Du tanzen?\n");
+      if (who && CheckLife(NOT_SELF,NOT_DEAD,
+        "Mit Dir selber kannst Du nicht tanzen.",
+        "Keine Reaktion - will wahrscheinlich nicht tanzen."))
+          return 1;
+      ifoo=random(sizeof(taenze));
+      out_sel="Du tanzt@@adverb@@ mit @@wem@@ eine Runde "+taenze[ifoo]+".";
+      out_vic="@@name@@ reisst Dich an sich und tanzt@@adverb@@ eine Runde "
+        +taenze[ifoo]+" mit Dir.";
+      out_oth="@@name@@ schnappt sich @@wen@@ und die beiden tanzen"
+        +"@@adverb@@ eine Runde "+taenze[ifoo]+".";
+    }
+    return FeelIt();
+
+    /**************** Traeumen ***************/
+    case "traeum":
+    HELPCHECK("traeum");
+    if (!str)
+      Return("Traeume wovon oder von wem?\n");
+    ParseRest(str);
+    out_sel="Du traeumst"+(who ? "@@adverb@@ von @@wem@@."
+      : (adverb ? "@@adverb@@." : " "+str+"."));
+    if (who) out_vic="@@gname@@ traeumt@@adverb@@ von Dir.";
+    out_oth="@@gname@@ traeumt"+(who ? "@@adverb@@ von @@wem@@."
+      : (adverb ? "@@adverb@@." : " "+str+"."));
+    return FeelIt();
+
+    /**************** Treten (tritt) ***************/
+    case "tritt":
+    case "tret":
+    HELPCHECK("tritt");
+    if (!str)  {
+      GHOSTCHECK("Dein Fuss faehrt durch die beruehmte langvergessene "
+          +"unsichtbare Schildkroete\nhindurch.\n",
+        gname()+" will die beruehmte langvergessene unsichtbare\n"
+          +"Schildkroete treten, aber "+QPP(MALE,WER)
+          +" Fuss faehrt durch sie hindurch.\n", 0);
+      out_sel="Du trittst die beruehmte langvergessene unsichtbare "
+        +"Schildkroete.";
+      out_oth="@@gname@@ tritt die beruehmte langvergessene unsichtbare "
+        +"Schildkroete.";
+    }
+    else  {
+      ParseRest(str);
+      if (for_all)  {
+        out_sel="Du trittst @@alle@@@@adverb@@. Solltest Du nicht langsam "
+          +"an Flucht denken?";
+        out_vic="@@name@@ tritt @@alle@@@@adverb@@. Traut sich ganz "
+          +"schoen was!";
+        return MixedOut(WEN);
+      }
+      if (!who && !adverb)
+        Return("Wenn Du schon was nach tritt tippst, dann sag mir, wen "
+          +"oder wie ich das soll.\n");
+      if (who && CheckLife(NOT_SELF,NOT_DEAD,
+        "Du schaffst es nicht, Dir selber in den Hintern zu treten.",
+        "Tote Sachen tritt man nicht auch noch!"))
+          return 1;
+      if (who)  {
+        out_sel="Du trittst@@ wen@@@@adverb@@.";
+        if (who) out_vic="@@gname@@ tritt Dich@@adverb@@.";
+        out_oth="@@gname@@ tritt@@ wen@@@@adverb@@.";
+      }
+      else  {
+        out_sel="Du trittst die beruehmte langvergessene unsichtbare "
+          +"Schildkroete@@adverb@@.";
+        out_oth="@@gname@@ tritt die beruehmte langvergessene unsichtbare "
+          +"Schildkroete\n@@adverb@@.";
+      }
+    }
+    return FeelIt();
+
+    /**************** Troesten ***************/
+    case "troest":
+    HELPCHECK("troest");
+    ParseRest(str);
+    if (!who)
+      Return("Wen willst Du troesten?\n");
+    if (who && CheckLife(NOT_SELF,NOT_DEAD,
+      "Trost musst Du bei jemand anders suchen.",
+      "Das Teil musst Du nicht troesten, das fuehlt nix."))
+        return 1;
+    out_sel="Du troestest@@ wen@@@@adverb@@.";
+    out_vic="@@gname@@ troestet Dich@@adverb@@.";
+    out_oth="@@gname@@ troestet@@ wen@@@@adverb@@.";
+    return FeelIt();
+
+    /**************** Umarmen ***************/
+    case "umarm":
+    HELPCHECK("umarm");
+    ParseRest(str);
+    if (!who)
+      Return("Wen willst Du umarmen?\n");
+    if (who && CheckLife(0,NOT_DEAD,0,"Bitte umarme nur Lebewesen."))
+      return 1;
+    if (ghost() && CheckLife(NOT_SELF,0,
+      "Du kannst Dich als Geist nicht selber waermen."))
+        return 1;
+    str1=who->QueryProp(P_NAME);
+    if(pointerp(str1))str1=(string)str1[0]; // Rumata
+    str2=who->QueryPronoun(WEN);
+    GHOSTCHECK("Du willst "+str1+" umarmen, aber Deine Arme gehen durch "
+        +str2+" durch.\n",
+      gname()+" will "+str1+" umarmen, aber "+QPP(MALE,WER,PLURAL)
+        +" Arme gehen\ndurch "+str2+" hindurch.\n",
+      gname()+" will Dich umarmen, aber "+QPP(MALE,WER,PLURAL)
+        +" Arme gehen durch Dich hindurch.\n");
+    if (for_all)  {
+      out_sel="Du umarmst @@alle@@@@adverb@@.";
+      out_vic="@@name@@ umarmt @@alle@@@@adverb@@.";
+      return MixedOut(WEN);
+    }
+    if (who==this_player())  {
+      out_sel="Du legst Deine Arme um Dich und waermst Dich "
+        +"ein bisschen selber.";
+      out_oth="@@name@@ legt "+QPP(MALE,WER,PLURAL)
+        +" Arme um sich und waermt sich ein bisschen selber.";
+    }
+    else  {
+      out_sel="Du umarmst@@ wen@@@@adverb@@.";
+      out_vic="@@name@@ umarmt Dich@@adverb@@.";
+      out_oth="@@name@@ umarmt@@ wen@@@@adverb@@.";
+    }
+    return FeelIt();
+
+    /**************** Verfluchen ***************/
+    case "verfluch":
+    HELPCHECK("verfluch");
+    if (!str)
+      Return("Wen oder was willst Du denn verfluchen?\n");
+    ParseRest(str);
+    if (!who)  {
+      out_sel="Du verfluchst "+str+".";
+      out_oth="@@gname@@ verflucht "+str+".";
+    }
+    else  {
+      if (who==this_player())
+        Return("Sich selber verflucht man besser nicht...\n");
+      if (!adverb)  {
+        flag=sscanf(str, "%s %s", str1,str2);
+        out_sel="Du verfluchst@@ wen@@"+(flag==2 ? " "+str2 : "")+".";
+        out_vic="@@gname@@ verflucht Dich"+(flag==2?" "+str2 : "")+".";
+        out_oth="@@gname@@ verflucht@@ wen@@"+(flag==2 ? " "+str2 : "")+".";
+      }
+      else  {
+        out_sel="Du verfluchst@@ wen@@@@adverb@@.";
+        out_vic="@@gname@@ verflucht Dich@@adverb@@.";
+        out_oth="@@gname@@ verflucht@@ wen@@@@adverb@@.";
+      }
+    }
+    return FeelIt();
+
+    /**************** Verneigen / Verbeugen ***************/
+    case "verneig":
+    case "verbeug":
+    HELPCHECK("verneig");
+    GHOSTCHECK("Du verneigst Dich ein bisschen heftig - Dein Kopf taucht "
+        +"kurz in den Boden.\n",
+      gname()+" verneigt sich. Ein bisschen heftig - "+QPP(MALE,WER)
+        +" Kopf\ntaucht kurz in den Boden ein.\n", 0);
+    if ((!str) || (str == "dich")) {
+      out_sel="Du verneigst Dich vor den Anwesenden.";
+      out_oth="@@name@@ verneigt sich anmutig.";
+    }
+    else  {
+      ParseRest(str);
+      if (for_all)  {
+        out_sel="Du verneigst Dich@@adverb@@ vor @@alle@@.";
+        out_vic="@@name@@ verneigt sich@@adverb@@ vor @@alle@@.";
+        return MixedOut(WEM);
+      }
+      if (!who && !adverb)
+        Return("Verneige dich irgendwie oder vor jemandem.\n");
+      if (who && CheckLife(NOT_SELF,NOT_DEAD,
+        "Wie willst Du das denn schaffen?",
+        "Vor Sachen wird hier nicht verneigt, klar?\n"))
+          return 1;
+      out_sel="Du verneigst Dich@@adverb@@"+(who ? " vor" : "")+"@@ wem@@.";
+      if (who ) out_vic="@@name@@ verneigt sich@@adverb@@ vor Dir.";
+      out_oth="@@name@@ verneigt sich@@adverb@@"+(who ? " vor" : "")
+        +"@@ wem@@.";
+    }
+    return FeelIt();
+
+    /**************** Verneinen ***************/
+    case "nein":
+    case "noe":
+    HELPCHECK("nein");
+    GHOSTCHECK("Du schuettelst Deinen Kopf so heftig, dass er kurz "
+        +"davonschwebt.\n",
+      gname()+" schuettelt heftig den Kopf.\nSo heftig, dass dieser "
+        +"kurz davonschwebt und wieder eingefangen werden muss.\n", 0);
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Schuettle wie den Kopf?\n");
+    out_sel="Du schuettelst@@adverb@@ den Kopf.";
+    out_oth="@@name@@ schuettelt@@adverb@@ den Kopf.";
+    return FeelIt();
+
+    /**************** Wackeln ***************/
+    case "wackel":
+    case "wackl":
+    HELPCHECK("wackel");
+    if (ghost())
+      Return("Da gibt es nichts mehr, womit Du wackeln kannst.\n");
+    if (str)
+      if (strstr(str, "mit ")==0)
+        sscanf(str, "mit %s", sfoo);
+      else if (strstr(str,"mit ")>0)  {
+        sscanf(str, "%s mit %s", sfoo, sfoo);
+        flag=1;
+      }
+    if (sfoo=="") sfoo=0;
+    ParseRest(str, (sfoo ? (flag ? " mit " : "mit ")+sfoo : 0));
+    if (str && !adverb && !sfoo)
+      Return("Wackle wie oder womit?\n");
+    out_sel="Du wackelst@@adverb@@ mit "+(sfoo ? sfoo+"." : "dem Hintern.");
+    out_oth="@@name@@ wackelt@@adverb@@ mit "
+      +(sfoo ? sfoo+"." : QPP(MALE,WEM)+" Hintern.");
+    return FeelIt();
+
+    /**************** Waelzen ***************/
+    case "waelz":
+    HELPCHECK("waelz");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Waelze Dich wie auf dem Boden?\n");
+    out_sel="Du waelzt Dich"+(adverb ? "@@adverb@@" : " vor Lachen")
+      +" auf dem Boden.";
+    out_oth="@@gname@@ waelzt sich"+(adverb ? "@@adverb@@" : " vor Lachen")
+      +(ghost() ? " im" : " auf dem")+" Boden.";
+    return FeelIt();
+
+    /**************** Warten ***************/
+    case "wart":
+    HELPCHECK("wart");
+    ParseRest(str);
+    if (!str)  {
+      out_sel="Du tippst mit dem Fuss auf den Boden.";
+      out_oth="@@gname@@ tippt mit dem Fuss auf den Boden.";
+    } else if (!who && adverb)  {
+      out_sel="Du wartest@@adverb@@.";
+      out_oth="@@gname@@ wartet@@adverb@@.";
+    } else  {
+      out_sel="Du wartest@@adverb@@ auf "+(who ? "@@wen@@." : str+".");
+      if (who) out_vic="@@gname@@ wartet@@adverb@@ auf Dich.";
+      out_oth="@@gname@@ wartet@@adverb@@ auf "+(who ? "@@wen@@." : str+".");
+    }
+    return FeelIt();
+
+#ifdef WECKE
+    /**************** Wecken ***************/
+    case "weck":
+    HELPCHECK("weck");
+    if (ParseRemote(str))
+      return 1;
+//    ParseRest(str);
+    if (!who)
+      Return("Wen willst Du wecken?\n");
+    if (sscanf(str, "%s %s", sfoo, sfoo)==2)
+      flag=1;
+    out_sel="Dein Wecker klingelt bei @@wem@@@@adverb@@"
+      +(adverb ? "." : (flag ? ": "+sfoo : "."));
+    out_vic=" "+name(WESSEN)+" Wecker klingelt bei Dir@@adverb@@"
+      +(adverb ? "." : (flag ? ": "+sfoo : "."));
+    out_oth="@@gname@@ wirft "+QPP(MALE, WEN)
+      +" Wecker@@adverb@@ nach @@wem@@.";
+          if (!who->QueryProp(P_VISUALBELL))
+         out_vic[0]=7; // chr(7)==BEL
+      else out_vic=out_vic[1..];
+    return FeelIt();
+#endif
+
+    /**************** Weinen ***************/
+    case "wein":
+    HELPCHECK("wein");
+    GHOSTCHECK("Es reicht leider nur fuer ein paar winzige Nebelwoelkchen, "
+        +"nicht fuer Traenen.\n",
+      gname()+" verzieht das Gesicht und ein paar winzige Nebel-\n"
+        +"woelkchen entfernen sich von seinen \"Augen\".\n", 0);
+    if (!str)  {
+      out_sel="Waaaaah! Du weinst bitterlich.";
+      out_oth="@@name@@ bricht in Traenen aus und weint bitterlich.";
+    }
+    else  {
+      ParseRest(str);
+      if (!who && !adverb)
+        Return("Weine Dich irgendwie bei irgendwem aus, aber nicht so.\n");
+      if (who && CheckLife(NOT_SELF,NOT_DEAD,
+        "Bei sich selber kann man sich so schlecht ausweinen.",
+        "Bei wem willst Du Dich ausweinen???"))
+          return 1;
+      if (who)  {
+        out_sel="Du weinst Dich@@adverb@@ bei@@ wem@@ aus.";
+        out_vic="@@name@@ weint sich@@adverb@@ bei Dir aus.";
+        out_oth="@@name@@ weint sich@@adverb@@ bei@@ wem@@ aus.";
+      }
+      else  {
+        out_sel="Du brichst in Traenen aus und weinst@@adverb@@.";
+        out_oth="@@name@@ bricht in Traenen aus und weint@@adverb@@.";
+      }
+    }
+    return FeelIt();
+
+    /**************** Winken ***************/
+    case "wink":
+    HELPCHECK("wink");
+    ParseRest(str);
+    if (for_all)  {
+      out_sel="Du winkst @@alle@@@@adverb@@ zu.";
+      out_vic="@@name@@ winkt @@alle@@@@adverb@@ zu.";
+      return MixedOut(WEM);
+    }
+    if (!who && !adverb && str)
+      Return("Vielleicht solltest Du auch sagen, wem oder wie Du "
+        +"(zu)winken willst.\n");
+    if (who && CheckLife(NOT_SELF, NOT_DEAD,
+      "Wink Dir nicht selber zu.",
+      "Du musst schon einem Lebewesen zuwinken."))
+        return 1;
+    out_sel="Du winkst@@ wem@@@@adverb@@"+(who ? " zu" : "")+".";
+    if (who) out_vic="@@gname@@ winkt Dir@@adverb@@ zu.";
+    out_oth="@@gname@@ winkt@@ wem@@@@adverb@@"+(who ? " zu" : "")+".";
+    return FeelIt();
+
+    /**************** Wuergen ***************/
+    case "wuerg":
+    HELPCHECK("wuerg");
+    ParseRest(str);
+    if (str && !who && !adverb)
+      Return("Wuerge wen oder wie?\n");
+    if (!who)  {
+      out_sel="Du faengst@@adverb@@ an zu wuergen.";
+      out_oth="@@gname@@ faengt@@adverb@@ an zu wuergen.";
+    } else if (CheckLife(NOT_SELF, NOT_DEAD,
+          "Du wuergst ein bischen an Dir rum. Dir wird schnell langweilig.",
+	  "Wuerg lieber ein Lebewesen.")) {
+      return 1;
+    } else {
+      out_sel="Du springst @@wen@@ an und faengst an, "+who->QueryPronoun(WEN)
+        +"@@adverb@@ zu wuergen.";
+      out_vic="@@gname@@ springt Dich auf einmal an und wuergt Dich@@adverb@@.";
+      out_oth="@@gname@@ springt auf einmal @@wen@@ an und wuergt "
+        +who->QueryPronoun(WEN)+"@@adverb@@.";
+    }
+    return FeelIt();
+
+    /**************** Wundern ***************/
+    case "wunder":
+    HELPCHECK("wunder");
+    ParseRest(str);
+    if (str && !who && !adverb)
+      Return("Wie oder ueber wen willst Du Dich wundern?\n");
+    out_sel="Du wunderst Dich@@adverb@@"+(who ? " ueber @@wen@@." : ".");
+    if (who) out_vic="@@gname@@ wundert sich@@adverb@@ ueber Dich.";
+    out_oth="@@gname@@ wundert sich@@adverb@@"+(who ? " ueber @@wen@@." : ".");
+    return FeelIt();
+
+    /**************** Wuscheln ***************/
+    case "wuschel":
+    case "wuschl":
+    HELPCHECK("wuschel");
+    ParseRest(str);
+    if (!who)
+      Return("Wen willst Du denn wuscheln?\n");
+    if (CheckLife(0,NOT_DEAD,
+      "", "Hmm, sehr tot. Ne, lieber nicht."))
+        return 1;
+    if (who->QueryProp(P_FROG))  {
+      write("Du verwuschelst...  aeh... hm. Ein Frosch hat wohl nix "
+        +"zum Wuscheln.\n");
+      return 1;
+    };
+    GHOSTCHECK("Du willst "+who->name(WEN)+" wuscheln - aber Deine "
+        +"Haende gehen\nglatt durch den Kopf durch.\n",
+      gname()+" will "+who->name(WEN)+" den Kopf wuscheln, aber "
+        +"die Geister-\nhaende gehen glatt durch den Kopf durch.\n",
+      gname()+" will Dich wuscheln, aber diese Geisterhaende "
+        +"gehen\nglatt durch Deinen Kopf durch - Du hast ein seltsames "
+        +"Gefuehl dabei.\n");
+    if (member(({"highlander","boing","mieze","freund"}), who->query_real_name())>-1)
+      switch (who->query_real_name())  {
+        case "highlander": str1="Federn"; break;
+        case "freund"    :
+        case "mieze"     :
+        case "boing"     : str1="Fell"; break;
+      }
+    else if (who->is_class_member(({CL_DRAGON, CL_FISH, CL_REPTILE})))
+      str1="Schuppen";
+    else if (who->is_class_member(({CL_BIRD, "elster","greif"})))
+      str1="Federn";
+    else if (who->is_class_member(({CL_MAMMAL_LAND,CL_FELINE,"tiger",
+                                    "steinbeisser","knuddeleisbaer"})))
+      str1="Fell";
+    else str1="Haare";
+    out_sel="Du verwuschelst@@adverb@@ @@wessen@@ "+str1+".";
+    out_vic="@@name@@ verwuschelt@@adverb@@ Dein"
+      +(str1=="Fell" ? " " : "e ")+str1+".";
+    out_oth="@@name@@ verwuschelt@@adverb@@ @@wessen@@ "+str1+".";
+    return FeelIt();
+
+    /**************** Zitieren ***************/
+    case "zitier":
+    HELPCHECK("zitier");
+    ParseRest(str);
+    if (!str)
+      Return("Zitiere was oder wen womit?\n");
+    sfoo=implode(explode(str, " ")[1..], " ");
+    if (sfoo=="") sfoo=0;
+    if (who)  {
+      out_sel="Du zitierst @@wen@@"+(sfoo ? ": \""+sfoo+"\"" : "")+".";
+      out_vic="@@gname@@ zitiert Dich"+(sfoo ? ": \""+sfoo+"\"" : "")+".";
+      out_oth="@@gname@@ zitiert @@wen@@"+(sfoo ? ": \""+sfoo+"\"" : "")+".";
+    }
+    else  {
+      sfoo=explode(str, "/")[0];
+      out_sel="Du zitierst@@adverb@@"+(sfoo ? ": \""+sfoo+"\"" : "")+".";
+      out_oth="@@gname@@ zitiert@@adverb@@"+(sfoo ? ": \""+sfoo+"\"" : "")+".";
+    }
+    return FeelIt();
+
+    /**************** Zittern ***************/
+    case "zitter":
+    HELPCHECK("zitter");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Zittere wie?\n");
+    out_sel="Du zitterst"+(adverb ? "@@adverb@@." : " vor Angst.");
+    out_oth="@@gname@@ zittert"+(adverb ? "@@adverb@@." : " vor Angst.");
+    return FeelIt();
+
+    /**************** Schulterzucken ***************/
+    case "zuck" :
+    HELPCHECK("zuck");
+          if (str)
+      if (sscanf(str,"%s mit den schultern",sfoo))
+        str=sfoo;
+    else if (sscanf(str,"%s den schultern",sfoo))
+      str=sfoo;
+    else
+      if (sscanf(str,"%s schultern",sfoo))
+        str=sfoo;
+    if (str=="") str=0;
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Zucke wie mit den Schultern?\n");
+    out_sel="Du zuckst@@adverb@@ mit den Schultern.";
+    out_oth="@@gname@@ zuckt"+(adverb ? "@@adverb@@" : " ratlos")
+            +" mit den Schultern.";
+    return FeelIt();
+
+    /**************** Zwinkern ***************/
+    case "zwinker":
+    HELPCHECK("zwinker");
+    if (ghost())
+      Return("Vergiss es - das ist als Geist viel zu unauffaellig, als dass\n"
+        +"es andere Leute sehen wuerden.\n");
+    ParseRest(str);
+    if (str && !who && !adverb)
+      Return("Zwinkere wie? Zwinkere wem zu?\n");
+    if (who && CheckLife(NOT_SELF,NOT_DEAD,
+      "Du kannst Dir nicht selber zuzwinkern.",
+      "Wieso reagiert das Ding da nicht auf Dein Zwinkern? Ist es etwa tot?"))
+        return 1;
+    out_sel="Du zwinkerst@@ wem@@@@adverb@@"+(who ? " zu." : ".");
+    if (who) out_vic="@@name@@ zwinkert Dir@@adverb@@ zu.";
+    out_oth="@@name@@ zwinkert@@ wem@@@@adverb@@"+(who ? " zu." : ".");
+    return FeelIt();
+
+    /**************** Zunge rausstrecken ***************/
+    case "streck":
+    HELPCHECK("streck");
+    GHOSTCHECK("Sorry, Du hast keine Zunge zum Rausstrecken.\n","",0);
+    if (!str)
+      Return("Strecke was wie wem wo wann wieso?\n");
+    str=lower_case(str);
+    if (sscanf(str, "%s zunge raus", str1)!=1 &&
+    sscanf(str, "%s die zunge raus", str1)!=1)
+      Return("Strecke was wie wem wo wann wieso?\n");
+    ParseRest(str1);
+    if (for_all)  {
+      out_sel="Du streckst @@alle@@@@adverb@@ die Zunge raus.";
+      out_vic="@@name@@ streckt @@alle@@@@adverb@@ die Zunge raus.";
+      return MixedOut(WEM);
+    }
+    out_sel="Du streckst@@ wem@@@@adverb@@ die Zunge raus.";
+    if (who) out_vic="@@name@@ streckt Dir@@adverb@@ die Zunge raus.";
+    out_oth="@@name@@ streckt@@ wem@@@@adverb@@ die Zunge raus.";
+    return FeelIt();
+
+    // Spezialsachen - Geisterverben und Magierverben
+
+    /**************** Rasseln ***************/
+    case "rassel":
+    case "rassl":
+    if (!ghost())
+      Return("Das ist nicht Dein Fachgebiet - Du bist doch kein Geist!\n");
+    HELPCHECK("rassel");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Rassel wie?\n");
+    out_sel="Du rasselst"+(adverb ? "@@adverb@@" : " fuerchterlich")
+      +" mit einer rostigen Rasselkette,\n"
+      +"die Du auf einmal fuer einen Moment in der Hand haeltst.";
+    out_oth="@@gname@@ holt auf einmal eine rostige Rasselkette aus\n"
+      +"dem Nichts und faengt an,"+(adverb ? "@@adverb@@" : " fuerchterlich")
+      +" damit zu rasseln.\n"
+      +"Danach ist die Kette auf einmal wieder verschwunden.";
+    return FeelIt();
+
+    /**************** Heulen ***************/
+    case "heul":
+    if (!ghost())
+      Return("Lass das mal den Fachleuten (also den Geistern).\n");
+    HELPCHECK("heul");
+    ParseRest(str);
+    if (str && !adverb)
+      Return("Heule wie?\n");
+    out_sel="Du heulst"+(adverb ? "@@adverb@@." : " schauerlich.");
+    out_oth="@@gname@@ heult"+(adverb ? "@@adverb@@." : " schauerlich.");
+    return FeelIt();
+
+    /**************** Treten (tretet) ***************/
+    case "kick":
+    if (!IS_WIZARD(this_player()))
+      return 0;
+    HELPCHECK("kick");
+    if (!str)  {
+      GHOSTCHECK("Dein Fuss faehrt durch die beruehmte langvergessene "
+          +"unsichtbare Schildkroete\nhindurch.\n",
+        gname()+" will die beruehmte langvergessene unsichtbare\n"
+          +"Schildkroete treten, aber "+QPP(MALE,WER)
+          +" Fuss faehrt durch sie hindurch.\n", 0);
+      out_sel="Du tretest die beruehmte langvergessene unsichtbare "
+        +"Schildkroete.";
+      out_oth="@@name@@ tretet die beruehmte langvergessene unsichtbare "
+        +"Schildkroete.";
+    }
+    else  {
+      ParseRest(str);
+      if (for_all)  {
+        out_sel="Du tretest @@alle@@@@adverb@@.";
+        out_vic="@@name@@ tretet @@alle@@@@adverb@@.";
+        return MixedOut(WEN);
+      }
+      if (!who && !adverb)
+        Return("Wenn Du schon was nach kick tippst, dann sag mir wen "
+          +"oder wie ichdas soll.\n");
+      if (who && CheckLife(NOT_SELF,NOT_DEAD,
+        "Du schaffst es nicht, Dir selber in den Hintern zu treten.",
+        "Tote Sachen tritt man nicht auch noch!"))
+          return 1;
+      if (who)  {
+        out_sel="Du tretest@@ wen@@@@adverb@@.";
+        if (who) out_vic="@@gname@@ tretet Dich@@adverb@@.";
+        out_oth="@@gname@@ tretet@@ wen@@@@adverb@@.";
+      }
+      else  {
+        out_sel="Du tretest die beruehmte langvergessene unsichtbare "
+          +"Schildkroete@@adverb@@.";
+        out_oth="@@gname@@ tretet die beruehmte langvergessene unsichtbare "
+          +"Schildkroete\n@@adverb@@.";
+      }
+    }
+    return FeelIt();
+
+    /************* Nassspritzen ***************/
+    case "splash":
+    if (!IS_WIZARD(this_player()) &&
+    !(IS_SEER(this_player()) && present("SEHER\nspritzpistole",this_player())))
+      return 0;
+    HELPCHECK("splash");
+    ParseRest(str);
+    if (for_all)  {
+      out_sel="Du ziehst Deine Wasserpistole und spritzt @@alle@@@@adverb@@ "
+        +"patschnass.";
+      out_vic="@@gname@@ zieht "+QPP(FEMALE,WEN)+" Wasserpistole und spritzt\n"
+        +"@@alle@@@@adverb@@ patschnass.";
+      return MixedOut(WEN);
+    }
+    if (!who)
+      Return("Wen willst Du denn nassmachen?\n");
+    if (who == this_player())  {
+      out_sel="Sag mal, kommst Du Dir nicht ein bisschen doof vor?\n"
+        +"Du ziehst Deine Wasserpistole und spritzt Dich@@adverb@@ selber patschnass.";
+      out_oth="@@gname@@ zieht "+QPP(FEMALE,WEN)+" Wasserpistole und spritzt "
+        +"sich@@adverb@@ aus unerfindlichen Gruenden selbst patschnass.";
+    }
+    else  {
+      out_sel="Du ziehst Deine Wasserpistole und spritzt @@wen@@@@adverb@@ "
+        +"patschnass.";
+      out_vic="@@gname@@ zieht "+QPP(FEMALE,WEN)+" Wasserpistole und spritzt "
+        +"Dich@@adverb@@ patschnass.";
+      out_oth="@@gname@@ zieht "+QPP(FEMALE,WEN)+" Wasserpistole und spritzt "
+        +"@@wen@@@@adverb@@ patschnass.";
+    }
+    return FeelIt();
+
+    /**************** Anflammen ***************/
+    case "flam":
+    if (!IS_WIZARD(this_player()) &&
+    !(IS_SEER(this_player()) && present("SEHER\nflammenwerfer",this_player())))
+      return 0;
+    HELPCHECK("flame");
+    if (ghost())
+      Return("Du hast leider grade Deinen Flammenwerfer nicht dabei.\n");
+    ParseRest(str);
+    ifoo=!random(7);
+    if (for_all)  {
+      out_sel="Du holst aus Deinen tiefsten Taschen (oder was weiss denn "
+        +"ich woher) Deinen\nMorgenGrauen handgearbeiteten Mini-Flammenwerfer "
+        +"(tm), richtest ihn aus und...\n"
+        +(ifoo ? "schaust leicht frustriert auf das Streichholz, in das "
+          +"er sich verwandelt hat."
+        : "feuerst@@adverb@@ einen riesigen Feuerball auf @@alle@@ ab.\n"
+          +"Es riecht auf einmal so verbrannt hier...");
+      out_vic="@@name@@ holt auf einmal irgendwoher einen MorgenGrauen "
+        +"handgearbeiteten\nMini-Flammenwerfer (tm), richtet ihn aus und...\n"
+        +(ifoo ? "schaut ziemlich frustriert auf das Streichholz, in das "
+          +"sich das Ding verwandelt hat."
+        : "feuert@@adverb@@ einen riesigen Feuerball auf @@alle@@ ab.\n"
+          +"Dir wird so warm um's Herz...");
+      return MixedOut(WEN);
+    }
+    if (!who)
+      Return("Wen willst Du denn ankokeln?\n");
+    out_sel="Du holst aus Deinen tiefsten Taschen (oder was weiss denn "
+      +"ich woher) Deinen\nMorgenGrauen handgearbeiteten Mini-Flammenwerfer "
+      +"(tm), richtest ihn aus und...\n"
+      +(ifoo ? "schaust leicht frustriert auf das Streichholz, in das er "
+        +"sich verwandelt hat."
+      : "feuerst@@adverb@@ einen riesigen Feuerball auf @@wen@@ ab.\n"
+        +"Es riecht auf einmal so verbrannt hier...");
+    out_vic="@@name@@ holt auf einmal irgendwoher einen MorgenGrauen "
+      +"handgearbeiteten\nMini-Flammenwerfer (tm), richtet ihn auf Dich "
+      +"aus und...\n"
+      +(ifoo ? "schaut ziemlich frustriert auf das Streichholz, in das "
+        +"sich das Ding\nverwandelt hat."
+      : "feuert@@adverb@@ einen riesigen Feuerball auf Dich ab.\n"
+        +"Dir wird so warm ums Herz...");
+    out_oth="@@name@@ holt auf einmal irgendwoher einen MorgenGrauen "
+      +"handgearbeiteten\nMini-Flammenwerfer (tm), richtet ihn "
+      +"auf@@ wen@@ aus und...\n"
+      +(ifoo ? "schaut ziemlich frustriert auf das Streichholz, in das "
+        +"sich das Ding\nverwandelt hat."
+      : "feuert@@adverb@@ einen riesigen Feuerball auf@@ wen@@ ab.\nEs "
+        +"riecht auf einmal irgendwie verbrannt hier ...");
+    return FeelIt();
+
+    // Special 2: remote verbs
+
+    /**************** Remote knuddeln ***************/
+    case "rknuddel":
+    case "rknuddl":
+    HELPCHECK("rknuddel");
+    if (ParseRemote(str))
+      return 1;
+    if (!who)
+      Return("Knuddle wen?\n");
+    if (CheckLife(NOT_SELF,0,
+      "Das bringt doch nix, lass es halt.",
+      0))
+        return 1;
+    if (present(who, environment()))
+      Return("Wenn jemand neben Dir steht, nimm knuddel.\n");
+    out_sel="Du knuddelst @@wen@@@@adverb@@ aus der Ferne.";
+    out_vic="@@gname@@ knuddelt Dich@@adverb@@ aus der Ferne.";
+    return FeelIt();
+
+    /**************** Remote winken ***************/
+    case "rwink":
+    HELPCHECK("rwink");
+    if (ParseRemote(str))
+      return 1;
+    if (!who)
+      Return("Winke wem zu?\n");
+    if (CheckLife(NOT_SELF,0,
+      "Sehr witzig. Pah.", 0))
+        return 1;
+    if (present(who, environment()))
+      Return("Wenn jemand neben Dir steht, nimm wink.\n");
+    out_sel="Du winkst @@wem@@@@adverb@@ aus der Ferne zu.";
+    out_vic="@@gname@@ winkt Dir@@adverb@@ aus der Ferne zu.";
+    return FeelIt();
+
+    /**************** Verbenliste ***************/
+    case "verb":
+    case "verben":
+    HELPCHECK("verb");
+    More(SOULHELP->Help());
+    return 1;
+
+    /**************** Adverbienverwaltung ***************/
+    case "adverb":
+    case "adverben":
+    case "adverbien": {   /* Das ist die richtige Form, aber wer weiss das? */
+    string f1,f2;
+    HELPCHECK("adverb");
+    if (!str || str=="#" || str=="$")
+      return zeige_adverbs((str=="#" ? 1 : (str=="$" ? 2 : 0)));
+    if (sscanf(str, "%s %s", f1,f2)==2)  {
+      f1 = lower_case(f1); // kleingeschrieben speichern, spart Umwandlung
+      if (f1=="")
+        Return("Hm, da muss wohl ein Leerzeichen zu viel gewesen sein. Bitte "
+          +"nochmal,\naber ohne zuviele Leerzeichen.\n");
+      if (f1=="?")  {
+        f2 = lower_case(f2);
+        string match;
+        if ((match=QueryStdAdverbs()[f2] || plr_adverbs[f2]))
+          write("Die Abkuerzung "+f2+" gehoert zu dem Adverb:\n"+match+LF);
+        else
+          write("Diese Abkuerzung ist bisher nicht definiert.\n");
+        return 1;
+      }
+      if (QueryStdAdverbs()[f1])
+        Return("Die Standardabkuerzungen koennen nicht neu definiert "
+          +"werden.\n");
+      if (sizeof(plr_adverbs)>=100) 
+      {
+        write("Mehr als 100 eigene Adverbien kannst Du nicht definieren.\n");
+        return 1;
+      }
+      if (plr_adverbs[f1])  {
+        plr_adverbs[f1]=f2;
+        write("OK, Adverb mit der Abkuerzung \""+f1+"\" auf \""+f2
+          +"\" gesetzt.\n");
+      }
+      else  {
+        if (sizeof(f1) > 6)
+          Return("Die Abkuerzung ist zu lang, bitte nicht mehr als "
+            +"6 Zeichen.\n");
+        plr_adverbs[f1]=f2;
+        write("OK, neues Adverb \""+f2+"\" mit der Abkuerzung \""+f1+"\".\n");
+      }
+    }
+    else  {
+      str = lower_case(str);
+      if (QueryStdAdverbs()[str])
+        Return("Die Standardadverben koennen nicht geloescht werden.\n");
+      else if (!plr_adverbs[str])
+        Return("Du hast kein Adverb mit dieser Abkuerzung.\n"
+          +"Syntax: adverb, um die Adverbien anzuzeigen,\n"
+          +"        adverb #, um nur Deine Adverbien anzuzeigen,\n"
+          +"        adverb $, um nur die Standardadverbien anzuzeigen,\n"
+          +"        adverb ? <Abkuerzung>, um nachzusehen, ob <Abkuerzung> "
+            +"definiert ist,\n"
+          +"        adverb <Abkuerzung> <Adverb>, um der <Abkuerzung> das "
+            +"<Adverb>\n"
+          +"               zuzuordnen,\n"
+          +"        adverb <Abkuerzung>, um das Adverb mit der <Abkuerzung> "
+            +"zu loeschen,\n");
+      else  {
+        write("OK, Adverb \""+plr_adverbs[str]+"\" geloescht.\n");
+        plr_adverbs=m_copy_delete(plr_adverbs, str);
+      }
+    }
+    return 1; 
+    }
+  }
+  return(0);  //fallthrough
+}
+
