diff --git a/gilden/abenteurer.c b/gilden/abenteurer.c
new file mode 100644
index 0000000..313e755
--- /dev/null
+++ b/gilden/abenteurer.c
@@ -0,0 +1,374 @@
+// Ich fand es ein wenig langweilig in der Gilde, also habe ich ein wenig daran
+// gebastelt.
+//  Hate.
+// 2002-12-06 Mandragons Projektbrett eingebaut, Humni.
+// 2003-07-11 Bugfix
+// 2005-08-19 Miril Arks Bienen eingebaut
+// 2007-08-03 Zesstra, PFad fuers Vereinsbuero angepasst.
+inherit  "/std/gilden_room";
+
+#include <properties.h>
+#include <rooms.h>
+#include <wizlevels.h>
+#include <language.h>
+#include <defines.h>
+#include <moving.h>
+#include <new_skills.h>
+#include <events.h>
+#include <player/fao.h>
+
+#define P_ANFAENGER_BIENENORT_ "anfaenger_bienenort_"
+#define P_ANFAENGER_BIENENZIEL_ "anfaenger_bienenziel_"
+
+string Funktion(); // Funktion der Gilde
+string Schmutz();  // Wohl bald ein Zaubertrank
+
+int _query_light() {return 20;}
+
+void create() {
+  ::create();
+
+  SetProp(P_GUILD_DEFAULT_SPELLBOOK,"ab_spells");
+  SetProp(P_LIGHT,20);
+  SetProp(P_INDOORS,1);
+  AddSpell("steinschlag");
+  AddSpell("licht");
+  AddSpell("kampfschrei");
+  AddSpell("ausweichen");
+  AddSpell("schaetz");
+  AddSpell("pfeil");
+  AddSpell("identifiziere");
+  AddSpell("feuerball");
+  AddSpell("schnell");
+  AddSpell("saeurestrahl");
+
+  SetProp(P_GUILD_MALE_TITLES, ([
+       1 : "der hoffnungsvolle Anfaenger",
+       2 : "der Landstreicher",
+       3 : "der Streuner",
+       4 : "der Wandergeselle",
+       5 : "der Waldlaeufer",
+       6 : "der Faehrtensucher",
+       7 : "der Wegekundige",
+       8 : "der Jaeger",
+       9 : "der Kundschafter",
+      10 : "der Reisende",
+      11 : "der Abenteurer",
+      12 : "der Weltenbummler",
+      13 : "der Draufgaenger",
+      14 : "der Schatzsucher",
+      15 : "der Feuerbaendiger",
+      16 : "der Entdecker",
+      17 : "der Eroberer",
+      18 : "der Held",
+      19 : "der angehende Seher",
+      20 : "der Seher",
+      ]) );
+  SetProp(P_GUILD_FEMALE_TITLES, ([
+       1 : "die hoffnungsvolle Anfaengerin",
+       2 : "die Landstreicherin",
+       3 : "die Streunerin",
+       4 : "die Wandergesellin",
+       5 : "die Waldlaeuferin",
+       6 : "die Faehrtensucherin",
+       7 : "die Wegekundige",
+       8 : "die Jaegerin",
+       9 : "die Kundschafterin",
+      10 : "die Reisende",
+      11 : "die Abenteurerin",
+      12 : "die Weltenbummlerin",
+      13 : "die Draufgaengerin",
+      14 : "die Schatzsucherin",
+      15 : "die Feuerbaendigerin",
+      16 : "die Entdeckerin",
+      17 : "die Erobererin",
+      18 : "die Heldin",
+      19 : "die angehende Seherin",
+      20 : "die Seherin",
+      ]) );
+
+  SetProp(P_INT_SHORT,"Die beruehmte Abenteurergilde");
+  SetProp(P_INT_LONG,
+ "Der grosse Raum mit seiner niedrigen Decke und den grob geschnittenen\n"
++"Querbalken hat Platz fuer sehr viele Personen. Knarrende Dielen erzaehlen\n"
++"ueber Heldentaten laengst vergessener Abenteurer, beruehmter als mancher\n"
++"Weise unserer Zeit.\n"
++"Abenteurer, aber auch andere Bewohner dieser Welt kommen hierher, um\n"
++"sich zu informieren, ihre Erfahrungen auszutauschen oder sich in den\n"
++"verschiedensten Wissenschaften zu verbessern.\n"
++"Durch die immer offene Tuer scheint die aufgehende Sonne herein und fuellt\n"
++"den Raum mit ihrem goldenen Licht. Sonst gibt es hier nur noch den Ausgang\n"
++"im Norden, welcher auf die Hafenstrasse fuehrt und Bilder an den Waenden,\n"
++"mit Zeichnungen und Gemaelden vom MorgenGrauen. Eins der Bilder erlaeutert\n"
++"die Funktion der Gilde und eine grosse Uhr an der Wand zeigt, was die\n"
+//+"Stunde schlaegt. In einer Ecke steht ein kleines Projektbrett.\n"
++"Stunde schlaegt.\n"
++"Nach oben fuehrt eine Treppe in das Buero des Foerdervereins Projekt\n"
++"MorgenGrauen e.V., das Du unbedingt besuchen solltest.\n");
+
+  AddDetail(({"raum", "gilde", "abenteurergilde", "haus", "gildenhaus",
+              "gildehaus"}),
+  "Du stehst mitten in der Abenteurergilde. Hier trifft man sich und kann\n"
+ +"auch seine persoenlichen Werte verbessern.\n");
+  AddDetail(({"tuer", "ausgang"}),
+  "Der immer offenstehende Ausgang fuehrt hinaus auf die Hafenstrasse.\n"
+ +"Goldenes Licht einer ewig aufgehenden Sonne scheint herein.\n");
+  AddSpecialDetail(({"bild", "bilder", "zeichnungen", "gemaelde", "karten",
+              "landschaftsbilder"}),"det_bild");
+  AddDetail(({"funktion", "schild"}), #'Funktion);
+  AddDetail(({"wand", "waende"}),
+  "Aus fein saeuberlich geschlagenen Steinen sind die Waende der Gilde\n"+
+ "zusammengesetzt. Viele interessante Bilder haengen daran.\n");
+  AddDetail(({"stein", "steine"}), "Es sind ganz einfache Sandsteine.\n");
+  AddDetail(({"fenster"}),
+  "Eine wundervolle Welt eroeffnet sich Dir, genannt Realitaet. Aber gibt es\n"
+ +"diese wirklich? Ist sie nicht voller Gefahren und Stress?\n");
+  AddDetail(({"seite", "suedseite"}),
+  "Am Suedende des Raumes ist ein eigenartiges Fenster auszumachen.\n");
+  AddDetail(({"balken", "querbalken", "holzbalken", "deckenbalken"}),
+  "Diese Balken halten das Obergeschoss des Gildenhauses, wohin nur Magier\n"
+ +"kommen und sind an manchen Stellen ganz schoen durchgebogen. Das grob ge-\n"
+ +"schnittene Holz ist teilweise von Schwertstreichen zernarbt.\n");
+  AddDetail(({"hafen", "hafenstrasse", "strasse"}),
+  "Zur Tuer hinaus gelangt man ueber die Hafenstrasse zum Hafen von Port Vain"
+ +"\n");
+  AddDetail(({"boden", "fussboden", "dielen"}),
+  "Die knarrenden Dielen der Gilde sind schon alt und abgeschabt. In den\n"
+ +"Ritzen zwischen ihnen ist viel Dreck von den Stiefeln der Abenteurer.\n");
+  AddDetail(({"decke"}),
+  "Die Decke des Raumes wird von Holzbalken gehalten.\n");
+  AddDetail(({"licht", "sonnenlicht", "sonne"}),
+  "Warmes Sonnenlicht scheint durch den Ausgang zur Strasse herein. Jedesmal\n"
+ +"wenn jemand hereinkommt wird er vom Licht umspuelt und erscheint Gott-\n"
+ +"gleich mit dieser Aura.\n");
+  AddDetail(({"ebene"}),
+  "Du betrachtest das Bild der Ebene und denkst, welche Schaetze in dieser\n"
+ +"flachen, gruenen Landschaft verborgen sein muessen.\n");
+  AddDetail(({"gebirge", "huegel", "berge", "berg"}),
+  "Das Bild der Huegel und Berge betrachtend, schleicht sich ein wenig Sehn-\n"
+ +"sucht nach dieser herrlichen, aber gefaehrlichen Landschaft ein.\n");
+  AddDetail(({"perspektiven", "perspektive", "darstellung", "landschaft"}),
+  "Manche der Landschaftsbilder sind aus der Vogelperspektive oder von\n"
+ +"hohen Bergen aus oder von Zwergen gemalt worden.\n");
+  AddDetail(({"see", "meer", "wellen"}),
+  "Die Wellen auf dem Meer glitzern wie tausend Edelsteine.\n");
+  AddDetail(({"spritzer", "lichtspritzer"}),
+  "Wie tausend kleine Edelsteine verteilen sich diese winzigen, gluehenden\n"
+ +"Lichtspritzer ueber das wundervolle Gemaelde\n");
+  AddDetail(({"geschoss", "obergeschoss"}),
+  "Ins obere Geschoss der Gilde kommen nur Magier, mittels eines besonderen\n"
+ +"Zauberspruchs, der die Decke durchlaessig fuer sie macht.\n");
+  AddDetail(({"ritzen", "fugen"}),
+  "In den Fugen zwischen den Dielen befindet sich eine Menge Schmutz und\n"
+ +"Dreck von den Besuchern der Gilde.\n");
+  AddDetail(({"fugen", "dreck", "schmutz"}), #'Schmutz);
+  AddDetail(({"holz"}), "Die Dielen und die Deckenbalken sind aus Holz.\n");
+  AddDetail(({"kartograph", "kartographen"}),
+  "Dieselben laufen hier zwar im Moment nicht herum, aber ihre Karten sehen\n"
+ +"ziemlich verwirrend aus mit den ganzen Linien, welche diese Welt "
+  "darstellen.\n");
+  AddDetail(({"stellen", "stelle"}),
+  "Nichts sieht aus wie das andere, und die Ecken sind da keine Ausnahmen.\n");
+  AddDetail(({"ecken","ecke"}),
+  "In einer der Ecken, gleich neben der Treppe, steht ein kleines braunes\n"
+ +"Holzbrett, das sofort Deine Aufmerksamkeit erregt. Wozu es wohl dient?\n");
+  AddDetail("aufmerksamkeit",
+  "Du beschliesst, Dir das Brett sofort naeher zu betrachten, um sie zu\n"
+      +"befriedigen.\n");
+/*
+  AddDetail(({"brett","holzbrett"}),
+  "Ein unscheinbares kleines Brett steht in der Ecke des Raumes. Wenn man\n"
+ +"bedenkt, wie viele kleine Zettel daran befestigt wurden, kann es sich\n"
+ +"nur um ein schwarzes Brett handeln. Welche Informationen hier wohl\n"
+ +"ausgetauscht werden? Du koenntest natuerlich anfangen, die Zettel zu\n"
+ +"lesen, um das herauszufinden ...\n");
+  AddDetail("zettel",
+  "Viele verschiedene Zettel stecken an dem Brett. Rote, gelbe, blaue,\n"
+ +"jeder scheint eine andere Farbe zu haben. Auf jedem von ihnen scheint\n"
+ +"etwas geschrieben zu sein.\n");
+  AddDetail(({"farbe","farben"}),
+  "Es sind so viele, Du wuerdest bestimmt jahrelang zaehlen.\n");
+  AddDetail("informationen",
+  "Wenn Du die Zettel liest, findest Du bestimmt welche.");
+*/
+  AddDetail(({"wissenschaften", "eigenschaften"}), #'Funktion); //');
+  AddDetail(({"narben", "schwertstreich"}),
+  "Die Narben in den Holzbalken sind schon recht alt. Es ist lange her, dass\n"
+   +"hier richtig gekaempft wurde.\n");
+  AddDetail(({"aura"}),
+ "Eine Aura von Licht umgibt jeden, der von der Strasse ins Haus kommt.\n");
+  AddDetail(({"bewohner", "abenteurer"}),
+ "Hier, im Gildenhaus, ist jeder gern willkommen.\n");
+  AddDetail(({"weise", "weiser", "recken"}),
+  "Die Weisen dieses Landes sind beruehmt, kommen aber nicht an die Be-\n"
+  +"ruehmtheit ihrer Vorfahren, die grossen Recken der ersten Jahre, heran.\n");
+  AddDetail(({"realitaet"}), "Was ist schon real?\n");
+  AddSpecialDetail("uhr","zeige_reboot");
+
+
+  AddDetail(({"buero","foerderverein"}),
+    "Wichtige Informationen warten auf Dich im Buero des Foerdervereins!\n");
+  AddDetail("informationen", "Du musst schon ins Buero gehen, wenn Du "
+      "die Informationen erhalten willst.\n");
+  AddDetail("treppe","Die Treppe fuehrt nach Oben in das Buero des "
+      "Foerdervereins Projekt MorgenGrauen e.V.\n");
+  AddExit("norden", "/d/ebene/room/PortVain/po_haf1");
+  AddExit("oben","/p/verein/room/buero");
+
+  AddCmd("gehe|geh&\ngehtnicht",0,"Um Dich hier fortzubewegen, "
+      "solltest Du direkt das Kommando der Richtung eingeben,"
+      " wie ,,norden'' oder ,,suedwesten''. Du kannst das auch "
+      "abkuerzen, durch ,,n'' oder ,,sw''.");
+
+  AddItem("/obj/zeitungsautomat", REFRESH_REMOVE);
+
+  AddSpecialDetail("karte","karte");
+  AddSpecialDetail("brett","brett_fun");
+
+  EVENTD->RegisterEvent(EVT_LIB_ADVANCE, "handle_advance", this_object());
+
+  // nur auf dem Mudrechner laden (Stichwort: oeffentlich Mudlib)
+#if MUDHOST == __HOST_NAME__
+  AddItem("/p/service/troy/obj/buchautomat", REFRESH_REMOVE);
+//  AddItem("/p/service/mandragon/projektbrett/board", REFRESH_REMOVE);
+  // Die Biene fuer den Transport zur Wonnewichtlichtung.
+  // Ark, 19.08.05
+  AddItem("/d/anfaenger/ark/mon/mantisbiene",REFRESH_DESTRUCT,
+   ([P_ANFAENGER_BIENENORT_:"Mensch",
+     P_ANFAENGER_BIENENZIEL_:({"/d/anfaenger/ark/rooms/wald16",
+                               "zum Wald der Wonnewichte",
+                               "/gilden/abenteurer"})]));
+#endif
+}
+
+string det_bild()
+{
+  return
+   "Die Zeichnung und Gemaelde stellen MorgenGrauen aus den verschiedensten\n"
+   "Perspektiven dar. Einige davon zeigen abstrakte Darstellungen, wie sie\n"
+   "gerne von Kartographen gemacht werden, und andere zeigen wunderschoene\n"
+   "Darstellungen von Landschaften, wie dem Gebirge oder der Ebene. Besonders\n"
+   "schoen ist ein Bild der See. Tausende von Lichtspritzern verteilen sich\n"
+   "ueber die Wellen.\n"
+   "Ein kleines Schild zeigt folgendes:\n"+Funktion();
+}
+
+string brett_fun()
+{
+  if (present("party\nbrett",this_object()))
+    return "Welches Brett meinst Du denn? Das Partybrett oder das Holzbrett?\n";
+  return GetDetail("holzbrett");
+}
+
+int beitreten()
+{
+  if (::beitreten()<1)
+    return 1; // Meldung vom Gildenmaster oder Gildenobjekt
+  write("Du bist jetzt ein Abenteurer.\n");
+  adjust_title(PL);
+  return 1;
+}
+
+varargs int austreten(int loss)
+{
+  if (::austreten()<1)
+    return 1; // Meldung kommt vom Gildenmaster
+  write("Du bist nun kein Abenteurer mehr.\n");
+  return 1;
+}
+
+string Funktion()
+{   string re;
+  re = ("Moegliche Befehle sind:\n"
+        +"                liste\n"
+        +"                erhoehe (stufe)\n"
+        +"                kosten\n"
+        +"                lerne\n");
+  if (this_player()->QueryProp(P_GUILD)!="abenteurer")
+  re += ("                trete in gilde ein\n"+
+         "                trete aus gilde aus\n");
+  return re;
+}
+
+string Schmutz()
+{
+  // hier sollte sich doch glatt ein Zaubertrank lohnen!!
+  return "In den Fugen befindet sich viel Schmutz.\n";
+}
+
+// Fuer Spielerstufenaufstiege gerufen - egal in welcher Gilde.
+public void handle_advance(string eid, object trigob, mixed data) {
+
+  object pl = data[E_OBJECT];
+  if (!pl || !IsGuildMember(pl) || !interactive(pl))
+    return;
+
+  int lvl=pl->QueryProp(P_LEVEL);
+  // nicht fuer Level 1, da ist genug scroll...
+  if (lvl == 1) return;
+
+  // Alle Spells raussuchen, die der Spieler lernen kann.
+  string *spells=filter(m_indices(Query(P_GUILD_SKILLS,F_VALUE)), 
+      function int (string sp)
+      {
+        mapping ski = QuerySpell(sp);
+        if (!ski) return 0; // kein Spell
+        if (pl->QuerySkillAbility(sp) > 0
+            || check_restrictions(pl, ski[SI_SKILLRESTR_LEARN]))
+          return 0; // Vorraussetzungen nicht erfuellt oder schon gelernt.
+        return 1; // offenbar ist sp lernbar.
+      }
+      );
+
+  int count=sizeof(spells);
+  if (!count)
+    return;
+  
+  if (count == 1) {
+    tell_object(pl, break_string("Dir faellt auf einmal auf, dass Du "
+       "versuchen koenntest, den Zauberspruch \"" + spells[0] 
+       + "\" in der Abenteurergilde zu erlernen.",78));
+  }
+  else {
+     tell_object(pl, break_string("Dir faellt auf einmal auf, dass Du "
+       "versuchen koenntest, die folgenden Zaubersprueche in der "
+       "Abenteurergilde zu erlernen:",78));
+     tell_object(pl, CountUp(spells) + "\n");
+  }
+}
+
+// wird aus Spielerobjekt, /std/gilde.c und Gildenmaster gerufen (mindestens)
+// aktualisiert den Gildenlevel auf den Spielerlevel und setzt den per
+// get_new_title() aus den Gildentiteln ermittelten Gildentitel.
+void adjust_title(object pl) {
+  int lv;
+
+  // bei P_LEVEL < 0 ist der Spieler noch "nicht fertig".
+  // Der Titel wird anschliessend noch korrekt gesetzt.
+  if (!pl || !IsGuildMember(pl) || (lv=pl->QueryProp(P_LEVEL)) < 0)
+    return;
+
+  pl->SetProp(P_GUILD_LEVEL,lv);
+  if (!lv) lv=1;
+  pl->SetProp(P_GUILD_TITLE, get_new_title(lv,pl));
+  // Spielertitel nullen, damit der Gildentitel angezeigt wird.
+  if (!IS_SEER(pl) && !FAO_HAS_TITLE_GIFT(pl))
+    pl->SetProp(P_TITLE,0);
+}
+
+string karte() {
+  if (this_player() && present("karte",this_player())) return 0;
+  return GetDetail("karten");
+}
+
+void init() {
+  int res;
+  object ob;
+
+  ::init();
+
+  // Von Ark, an alle Rassenstartpunkte
+  if (ob=present("\nentdecker_obj",this_player()))
+      ob->Check_And_Update(this_player(),"Menschen");
+}
+
