diff --git a/d/seher/haeuser/special/rj.c b/d/seher/haeuser/special/rj.c
deleted file mode 100644
index 42f3b98..0000000
--- a/d/seher/haeuser/special/rj.c
+++ /dev/null
@@ -1,26 +0,0 @@
-inherit "/std/thing";
-
-#include <properties.h>
-#include "../haus.h"
-
-create()
-{
-  if (!clonep(this_object())) return;
-  ::create();
-
-  SetProp(P_SHORT,0);
-  SetProp(P_NOGET, 1);
-  AddId("r&j");
-  AddCmd("lies", "lies");
-}
-
-static int lies(string str)
-{
-  int nr;
-
-  if (!str || sscanf(str, "seite %d", nr) != 1)
-    return notify_fail("Syntax: lies seite <nr>\n"), 0;
-
-  this_player()->More(SPECIALPATH+"rom_jul/seite"+nr, 1);
-  return 1;
-}
diff --git a/d/seher/haeuser/special/seherfaq.c b/d/seher/haeuser/special/seherfaq.c
deleted file mode 100644
index 9ae96e6..0000000
--- a/d/seher/haeuser/special/seherfaq.c
+++ /dev/null
@@ -1,247 +0,0 @@
-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;
-}
diff --git a/d/seher/haeuser/special/seherfaqinvis.c b/d/seher/haeuser/special/seherfaqinvis.c
deleted file mode 100644
index 75982b6..0000000
--- a/d/seher/haeuser/special/seherfaqinvis.c
+++ /dev/null
@@ -1,236 +0,0 @@
-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"});
-}
-
-public varargs void init(object origin)
-{
-  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;
-}
