diff --git a/d/seher/haeuser/special/seherfaqinvis.c b/d/seher/haeuser/special/seherfaqinvis.c
new file mode 100644
index 0000000..45d3625
--- /dev/null
+++ b/d/seher/haeuser/special/seherfaqinvis.c
@@ -0,0 +1,236 @@
+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 = ([]);
+
+void 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"});
+}
+
+void init()
+{
+  thing::init();
+  if (this_player() && IS_USER(this_player()))
+    nedit::init_rescue();
+}
+
+string
+_query_short()
+{
+    return 0;
+}
+
+string 
+_query_long()
+{
+    return 0;
+}
+
+int
+id(string str)
+{
+    return 0;
+}
+
+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_USER(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;
+
+  if (!str || str == "") {
+    notify_fail("Was willst Du denn beschreiben?\n");
+    return 0;
+  }
+  
+  str = lower_case(this_player()->_unparsed_args());
+
+  if (sscanf(str,"faq %s",str)!=1) {
+    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 || part[0]!="faq" || 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;
+}
