diff --git a/d/seher/haeuser/special/seherfaq.c b/d/seher/haeuser/special/seherfaq.c
new file mode 100644
index 0000000..9ae96e6
--- /dev/null
+++ b/d/seher/haeuser/special/seherfaq.c
@@ -0,0 +1,247 @@
+inherit "std/thing";
+inherit "std/more";
+inherit "/mail/nedit";
+
+#include <properties.h>
+#include <wizlevels.h>
+#include "../haus.h"
+
+#define FAQ(f) (SPECIALPATH+"faq/"+(f))
+#define FAQUSER ({ "ryne", "toss", "sting" })
+#define IS_USER(pl) (member(FAQUSER, getuid(pl)) >= 0)
+
+static string *seite;
+static string f,*s;
+
+mapping synonym = ([]);
+
+create()
+{
+  ::create();
+  SetProp(P_NAME,"SeherFAQ");
+  SetProp(P_GENDER,FEMALE); 
+  SetProp(P_NOGET,1);
+  AddId( ({"faq","seherfaq","FAQ","SeherFAQ" }) );
+  AddCmd("lies","lesen");
+  AddCmd(({"beschreib","beschreibe"}),"beschreiben");
+  AddCmd("seiten","seiten");
+  AddCmd(({"loesch","loesche"}),"loeschen");
+  AddCmd(({"kopier","kopiere"}),"kopieren");
+  restore_object(FAQ("faq"));
+  seite = get_dir(FAQ("*"))-({".","..","faq.o"});
+}
+
+init()
+{
+  thing::init();
+  if (this_player() && IS_USER(this_player()))
+    nedit::init_rescue();
+}
+
+string
+_query_short()
+{
+  if (this_player() && IS_SEER(this_player()))
+    return "Die SeherFAQ";
+  else
+    return 0;
+}
+
+string 
+_query_long()
+{
+  if (this_player() && IS_SEER(this_player()))
+    return "Dies ist Rynes SeherFAQ.\n\
+Wenn Du weitere Fragen oder Anregungen zu dieser FAQ hast,\n\
+sei so nett und schicke Ryne einen kurzen Brief\n\n\
+Zum Inhalt der FAQ kommst Du mit >lies inhalt<\n";
+  else
+    return 0;
+}
+
+int
+id(string str)
+{
+  if (!IS_SEER(this_player()))
+    return 0;
+  else
+    return ::id(str);
+}
+
+int
+seiten(string str)
+{
+  int i,j;
+  string *syn;
+  closure filter_ldfied;
+
+  if (!IS_USER(this_player()))
+    return 0;
+
+  if(!(i = sizeof(seite)))
+    write("Keine Seiten beschrieben!\n");
+  else {
+    filter_ldfied = lambda(({'ind,'page,'map_ldfied/*'*/}),
+		    ({#'==,'page,({#'[/*]'*/,'map_ldfied,'ind})}));
+    for (str = "",i-=1;i>=0;i--) {
+      syn = m_indices(filter_indices(synonym,filter_ldfied,seite[i],synonym));
+      printf("Seite '%s' - ",seite[i]);
+      if (j=sizeof(syn)) {
+	for(j-=1;j>=0;j--)
+	  printf("'%s' ",syn[j]);
+	write("\n");
+      }
+      else
+	write( "(keine Synonyme definiert)\n");
+    }
+  }
+  return 1;
+}
+
+int
+lesen(string str)
+{
+  if (!IS_SEER(this_player()))
+    return 0;
+
+  if (!str || str == "") {
+    notify_fail("Was willst Du denn lesen?\n");
+    return 0;
+  }
+  str = lower_case(this_player()->_unparsed_args());
+  if (member(seite,str)<0) {
+    if (!member(synonym,str)) {
+      notify_fail("Diese Seite gibt es nicht...\n");
+      return 0;
+    }
+    else 
+      str = synonym[str];
+  }
+  this_player()->More(FAQ(str),1);
+  return 1;
+}
+
+int
+beschreiben(string str)
+{
+  string faq,*desc;
+  int i;
+
+  if (!IS_USER(this_player()))
+    return 0;
+
+  str = lower_case(this_player()->_unparsed_args());
+
+  if (!str || str == "") {
+    notify_fail("Was willst Du denn beschreiben?\n");
+    return 0;
+  }
+  if (sscanf(str,"%s %s",faq,str)!=2 || !id(faq)) {
+    notify_fail("Syntax: beschreibe faq <seite>\n");
+    return 0;
+  }
+  str = implode(old_explode(str," ")-({""}), " ");
+  desc = old_explode(implode(old_explode(str,", "),","),",");
+  f = 0;
+  s = 0;
+
+  for (i=sizeof(desc)-1;i>=0;i--) {
+    if (member(seite,desc[i])>=0) {
+      f = desc[i];
+      s = desc-({desc[i]});
+      break;
+    }
+  }
+  if (!f) {
+    f = desc[0];
+    s = desc[1..];
+  }
+  write("Bitte Beschreibung fuer die FAQ-Seite '"+f+"' angeben\n");
+  nedit("faq");
+  return 1;
+}
+
+static void
+faq(string str)
+{
+  int i;
+  string file;
+
+  if (!str || str == 0) {
+    write("** Abbruch! **\nNichts geaendert!\n");
+    return;
+  }
+  
+  if (file_size(file=FAQ(f))>=0)
+    rm(file);
+  write_file(file, str);
+  if (member(seite,f)==-1)
+    seite += ({f});
+
+  for (i=sizeof(s)-1;i>=0;i--) 
+    synonym += ([ s[i] : f ]);
+
+  save_object(FAQ("faq"));
+}
+
+int
+loeschen(string str)
+{
+  string *syn;
+  int i;
+
+  if(!IS_USER(this_player()))
+    return 0;
+
+  str = lower_case(this_player()->_unparsed_args());
+  if (!str || str == "") {
+    notify_fail("Was willst Du denn loeschen?\n");
+    return 0;
+  }
+  if (member(seite,str)>=0) {
+    syn = m_indices(filter_indices(synonym,
+				 lambda(({'ind,'page,'map_ldfied/*'*/}),
+					({#'==,'page,({#'[/*]'*/,'map_ldfied,'ind})}))
+				 ,seite[i],synonym));
+    rm(FAQ(str));
+    seite -= ({str});
+  }
+  else {
+    str = implode(old_explode(str," ")-({""}), " ");
+    syn = old_explode(implode(old_explode(str,", "),","),",");
+  }
+  for (i=sizeof(syn)-1; i>=0; i--)
+    synonym = filter_indices(synonym,
+                             lambda(({'key,'cmp}),
+				    ({#'!=,'key,'cmp/*'*/})),
+			     syn[i]);
+
+  save_object(FAQ("faq"));
+  write("OK\n");
+  return 1;
+}
+
+int
+kopieren(string str)
+{
+  string *part;
+  int i;
+
+  if (!IS_USER(this_player()))
+    return 0;
+
+  str = lower_case(this_player()->_unparsed_args());
+  part = old_explode(str," ")-({""});
+  if(sizeof(part)<4 || !id(part[0]) || part[2] != "nach" || 
+     member(seite,part[1]) == -1) {
+    notify_fail("kopiere faq <seite> nach <alias>\n");
+    return 0;
+  }
+  str = part[1];
+  part=old_explode(implode(old_explode(implode(part[3..]," "),", "),","),",");
+  for(i=sizeof(part)-1;i>=0;i--)
+    synonym += ([ part[i] : str ]);
+  save_object(FAQ("faq"));
+  write("OK.\n");
+  return 1;
+}
