diff --git a/obj/wanderer.c b/obj/wanderer.c
new file mode 100644
index 0000000..9120092
--- /dev/null
+++ b/obj/wanderer.c
@@ -0,0 +1,113 @@
+#pragma strong_types, save_types, rtt_checks
+#pragma no_clone, no_inherit, no_shadow
+
+inherit "std/npc";
+
+#define DELAY 60
+#define MAXWAY 30
+
+#include <properties.h>
+#include <language.h>
+#include <moving.h>
+#include "/secure/questmaster.h"
+
+protected void create()
+{
+  ::create();
+  SetProp(P_NAME,"Wanderer");
+  set_living_name("orakel");
+  SetProp(P_GENDER, MALE);
+  SetProp(P_SHORT,"Ein alter Wanderer");
+  SetProp(P_LONG,
+  "Ein uralter Wanderer mit einem langen Hirtenmantel und einem Hirtenstab.\n");
+  AddId(({"wanderer","hirte","orakel"}));
+	create_default_npc( 19 );
+  SetProp(P_MAX_HP, 5000);
+  SetProp(P_HP, 5000);
+  SetProp(P_GENDER,MALE);
+  SetProp(P_ALIGN, 1000);
+  SetProp(P_XP, 1000);
+  SetProp(P_HANDS, ({" mit seinem Hirtenstab", 50, ({DT_BLUDGEON})}) );
+  SetProp(P_NO_ATTACK, 1);
+  SetProp(P_REJECT, ({ REJECT_GIVE, Name(WER) + " sagt: Danke, aber das "
+			  "brauche ich nicht.\n" }) );
+  call_out("lauf", DELAY);
+  // Sollte eigentlich ueber das `info'-System laufen ;(
+  AddCmd( ({"frag","frage"}), "frag" );
+}
+
+static int frag(mixed str)
+{
+  int i,j,geredet;
+  mixed *quests;
+  mixed tmp;
+  
+  if (!str) return 0;
+  str = this_player()->_unparsed_args(1);
+  str = old_explode(str," ");
+  if ( !sizeof(str) ) return 0;
+  if ( !id(str[0]) ) return 0;
+  if (sizeof(str)<3 || (str[1]!="nach" && str[1]!="ueber"))
+  {
+    tell_object(this_player(),"Der Wanderer sagt: Ich versteh dich nicht.\n");
+    return 1;
+  }
+  geredet=0;
+  str=implode(str[2..]," ");
+  quests=QM->QueryQuests();
+  if (str=="aufgabe" || str=="aufgaben" || str=="abenteuer" || str=="quests"
+      || str == "quest")
+  {
+    tell_object(this_player(),"Der Wanderer sagt: Folgende Aufgaben gibt "
+        "es hier:\n");
+    quests[0] = sort_array(quests[0], #'>);
+    for (i=0;i<sizeof(quests[0]);i++)
+    {
+      tell_object(this_player(),quests[0][i]);
+      if (this_interactive()->QueryQuest(quests[0][i]))
+        tell_object(this_player()," [hast Du schon geloest]");
+      tell_object(this_player(),"\n");
+    }
+    return 1;
+  }
+  for (i=0;i<sizeof(quests[0]);i++)
+  {
+    if (member(old_explode(lower_case(quests[0][i])," "),str)>=0
+	      || strstr(lower_case(quests[0][i]), str)>=0)
+    {
+      tmp=quests[0][i]+"? Dazu kann ich Dir folgendes sagen: ";
+      tmp+=quests[1][i][3];
+      tmp=old_explode(break_string(tmp,60),"\n");
+      geredet=1;
+      for (j=0;j<sizeof(tmp);j++)
+        tell_object(this_player(),"Der Wanderer sagt: "+tmp[j]+"\n");
+    }
+  }
+  if (!geredet) 
+    tell_object(this_player(),"Der Wanderer sagt: "+capitalize(str)+
+      "? Interessiert mich nicht!\n");
+  return 1;
+}
+
+void lauf()
+{
+  int i, ok;
+ 
+  // wenn keine Environment, dann laeuft das Ding einfach nicht.
+  if ( !objectp(environment()) )
+    return;
+
+  mapping liste = environment()->QueryProp(P_EXITS);
+  string *dirs = m_indices(liste);
+  string *dirs2 = ({ });
+  for (i=0;i<sizeof(liste);i++)
+    if (!catch(ok=liste[dirs[i]]->QueryProp(P_ORAKEL)) && ok) 
+      dirs2 += ({ dirs[i] });
+  
+  if (sizeof(dirs2))
+  {
+    i=random(sizeof(dirs2));
+    command_me(dirs2[i]);
+  }
+  call_out("lauf",DELAY);
+}
