diff --git a/doc/beispiele/testobjekte/.readme b/doc/beispiele/testobjekte/.readme
new file mode 100644
index 0000000..56ff41f
--- /dev/null
+++ b/doc/beispiele/testobjekte/.readme
@@ -0,0 +1,13 @@
+
+Hier liegen Test-Objekte zu man-pages. Unterschieden wird momentan nur nach:
+- xxx_testobj -> das kann man laden und ggf clonen
+- xxx_testraum -> den kann man betreten
+
+Der Praefix deutet an, fuer welche Features (also man-pages) der Testcode geschrieben wurde. Die man-page selbst nennt diesen Dateinamen hier, insofern:
+* bitte mit Bedacht veraendern - pruefen, welche Funktionalitaet
+  beispielhaft gezeigt werden soll und das nicht loeschen
+* bitte Dateinamen nur veraendern, wenn ihr euch sicher seid, _alle_
+  darauf verweisenden man-pages ebenfalls geaendert zu haben
+
+Verantwortlich: Gloinson
+
diff --git a/doc/beispiele/testobjekte/attack_busy_sensitive_testobj.c b/doc/beispiele/testobjekte/attack_busy_sensitive_testobj.c
new file mode 100644
index 0000000..4225d88
--- /dev/null
+++ b/doc/beispiele/testobjekte/attack_busy_sensitive_testobj.c
@@ -0,0 +1,105 @@
+inherit "/std/thing";
+#include <properties.h>
+#include <new_skills.h>
+#include <sensitive.h>
+
+private action_puste(string str);
+private int counter;
+
+void create() {
+  if (!clonep(this_object())) return;
+  ::create();
+  counter = 2+random(4);
+  
+  SetProp(P_NAME, "Pusteblume");
+  SetProp(P_SHORT, "Eine kleine Pustblume");
+  SetProp(P_LONG, break_string(
+    "Eine abgebluehte Pflanze, die jetzt wie ein kleiner, weisser Ball "
+	"aussieht. Die fiedrigen Samen fliegen bestimmt prima.", 78));
+  AddDetail("samen", "Er sieht sehr fein und leicht aus.\n");
+  SetProp(P_GENDER,FEMALE);
+  SetProp(P_MATERIAL, MAT_MISC_PLANT);
+  SetProp(P_NOBUY, 1);
+  SetProp(P_VALUE, random(10));
+
+  SetProp(P_INFO, "Starker Wind taete ihr nicht gut.\n");
+
+  AddId(({"blume", "pusteblume", "loewenzahn"}));
+  SetProp(P_COMBATCMDS,(["puste loewenzahn":
+                         ([C_HEAL: 5])]));
+
+  SetProp(P_SENSITIVE,({({SENSITIVE_ATTACK, DT_AIR, 20}),
+                        ({SENSITIVE_INVENTORY, DT_AIR, 20})}));
+ 
+  AddCmd("puste&@ID", #'action_puste, "Puste wen oder was (an)?");
+}
+
+private action_puste(string str) {
+  if(environment()!=this_player()) {
+    notify_fail("Dazu solltest du "+name(WEN,1)+" haben.\n");
+	return 0;
+  }
+  if (this_player()->QueryProp(P_ATTACK_BUSY)) {
+    write("Du hast dafuer momentan einfach nicht mehr die Puste.\n");
+    return 1;
+  }
+  this_player()->SetProp(P_ATTACK_BUSY, 1);
+
+  if(counter<0) {
+    write(break_string("Du pustest sinnlos auf "+name(WEN, 2)+".", 78));
+	say(break_string(this_player()->Name(WER)+
+	  " pustet wie daemlich gegen "+name(WEN, 0)+".", 78));
+	return 1;
+  } else {
+    write(break_string(
+      "Du pustest "+name(WEN, 2)+" vorsichtig an, einige Samen "
+      "loesen sich und fliegen taumelnd in deinem Atem davon."+
+	  (counter<0?" Es bleibt nur noch ein nutzloser Strunk.":""), 78));
+    say(break_string(
+      this_player()->Name(WER)+" pustet sachte gegen "+name(WEN, 0)+" und "
+	  "du schaust verzueckt den davonfliegenden Samen nach.", 78));
+  }
+	
+  object who = this_player()->QueryEnemy();
+  
+  if(objectp(who)) {
+    if(!interactive(this_player())) {
+      who->ModifySkillAttribute(SA_SPEED, 80+random(10), 6);
+	  this_player()->heal_self(5);
+	} else
+	  who->ModifySkillAttribute(SA_SPEED, 90+random(10), 4);
+  }
+
+  counter--;
+  if(counter<0) {
+    call_out(#'remove, 10+random(60));
+	AddId("strunk");
+	SetProp(P_NAME, "Strunk");
+	SetProp(P_SHORT, "Der Strunk einer Pusteblume");
+	SetProp(P_LONG, "Ein haesslicher, leerer Strunk.\n");
+	SetProp(P_GENDER, MALE);
+  }
+  return 1;
+}
+
+private void notify_env_destroy() {
+  object ob = environment();
+  while(ob && !living(ob)) ob = environment(ob);
+  if(objectp(ob))
+    tell_object(ob, "Der Wind zerblaest "+name(WEN, 2)+".\n");
+  remove(1);
+}
+
+varargs void trigger_sensitive_attack() {
+  notify_env_destroy();
+}
+
+varargs void trigger_sensitive_inv() {
+  notify_env_destroy();
+}
+
+varargs int remove(int silent) {
+  if(!silent && living(environment()))
+    tell_object(environment(), "Du wirfst "+name(WEN, 2)+" weg.\n");
+  return ::remove(silent);
+}
\ No newline at end of file
diff --git a/doc/beispiele/testobjekte/command_me_testraum.c b/doc/beispiele/testobjekte/command_me_testraum.c
new file mode 100644
index 0000000..29086ce
--- /dev/null
+++ b/doc/beispiele/testobjekte/command_me_testraum.c
@@ -0,0 +1,33 @@
+#include <properties.h>
+inherit "/std/room";
+
+void create() {
+  ::create();
+  SetProp(P_LONG, "AddCmd-Testraum, Kommandos "
+                  "\"kriech\" und \"schleiche&heran|herum\".");
+  AddCmd("schleiche&heran|herum", "action_schleichen");
+  AddExit("gilde", "/gilden/abenteurer");
+}
+
+void init() {
+  ::init();
+  add_action("action_kriechen", "kriech", 1);
+}
+
+static action_schleichen(string str) {
+  string tmp = this_player()->QueryProp(P_RACE);
+  if(tmp[<1]=='e') tmp=tmp[0..<2];
+  write(break_string("Du versuchst leise zu schleichen, dabei passiert "
+    "dir aber ein allzu "+
+	(tmp=="Mensch"?"menschliches":lower_case(tmp)+"isches")+
+	" Missgeschick. Verflucht!", 78));
+  this_player()->command_me("\\furze");
+  return 1;
+}
+
+static int action_kriechen(string str) {
+  write(break_string("Deine Knie tun zu sehr weh dafuer.", 78));
+  tell_room(this_object(), break_string(this_player()->Name(WER)+
+    " knackt mit den Knien.", 78));
+  return 1;
+}
\ No newline at end of file
diff --git a/doc/beispiele/testobjekte/modifyskillspell_test.c b/doc/beispiele/testobjekte/modifyskillspell_test.c
new file mode 100644
index 0000000..3c58342
--- /dev/null
+++ b/doc/beispiele/testobjekte/modifyskillspell_test.c
@@ -0,0 +1,103 @@
+// ModifySkill-Beispiel fuer einem Spell. Erlaeuterung auf man-Page
+// und im Objekt selbst
+inherit "/std/thing";
+#include <new_skills.h>
+#include <properties.h>
+#include <wizlevels.h>
+#include <break_string.h>
+
+static int skillset(string str);
+static int skillunset(string str);
+
+void create() {
+  if(!clonep(this_object())) {
+    set_next_reset(-1);
+    return;
+  }
+
+  ::create();
+  set_next_reset(7200);
+
+  SetProp(P_NAME, "Skillbeispiel");
+  SetProp(P_SHORT, "Eine Skillbeispiel");
+  SetProp(P_LONG, break_string(
+    "Mit \"skillset\" kann man sich den Skill (eigentlich Spell) "
+    "\"fnrx\" setzen.\n"+
+    "Durch \"skillunset\" wird der Skill geloescht.\n"
+    "Das zaehlt deshalb als Spell, weil er kleingeschrieben und "
+    "damit direkt vom Spieler (also dir) als Kommando via UseSpell() "
+    "ausfuehrbar ist.", 78, 0, BS_LEAVE_MY_LFS));
+  SetProp(P_GENDER, NEUTER);
+  AddId(({"beispiel", "skillbeispiel", "spellbeispiel",
+          "skill", "spell"}));
+  
+  AddCmd("skillset", #'skillset);
+  AddCmd("skillunset", #'skillunset);
+}
+
+// Testfunktion, weil im Code dazu aufgefordert wird, das Objekt auch
+// mal zu wegzulegen. Spieler sollten nicht an sich herumfummeln.
+private static int _checkLearner(object pl) {
+  if(!IS_LEARNER(this_player())) {
+    notify_fail("Du bist kein Magier, deshalb geht das nicht.\n");
+    call_out(#'remove, 1);
+    return 0;
+  }
+  return 1;
+}
+
+static int skillset(string str) {
+  if(!_checkLearner(this_player()))
+    return 0;
+
+  if(this_player()->QuerySkill("fnrx")) {
+    notify_fail("Du kannst den Skill schon.\n");
+    return 0;
+  }
+
+  this_player()->ModifySkill("fnrx",
+    ([SI_CLOSURE: function int (object caster, string skill, mapping sinf) {
+            caster->LearnSkill("fnrx", 1);
+            tell_object(caster, "Peng! Dein Skillwert steigt auf "+
+                                caster->QuerySkillAbility("fnrx")+".\n");
+                    return 1;
+                  },
+      SI_SKILLABILITY: 8432]), 100, "ANY");
+  tell_object(this_player(), break_string(
+    "Der Skill ist gesetzt. Tipp doch ein paar Mal \"fnrx\" und schau den "
+    "Code unter "+load_name(this_object())+" an, damit du siehst, dass der "
+    "Skill jetzt nur aus einem Eintrag in dir und einer ueber UseSpell() "
+    "gerufenen Funktion in diesem Objekt besteht. Der Skill ist kein "
+    "Kommando in einem anderen Objekt.\n\n"
+    "Wenn du dieses Objekt weglegst, funktioniert also alles weiter. "
+    "Zerstoerst du aber das Objekt (oder dich mit \"ende\", funktioniert "
+    "die Skillfunktion nicht mehr.\n"
+    "Schau dir auch xeval this_player()->QuerySkill(\"fnrx\") an.", 78, 0,
+    BS_LEAVE_MY_LFS));
+  return 1;
+}
+
+// Here be dragons!
+// Bitte benutzt die folgende Art von Manipulation der Skills nur dann,
+// wenn ihr genau wisst, was ihr tut. In anderen Worten: NICHT MACHEN!
+// Und wenn, dann NUR AM EIGENEN MAGIEROBJEKT, NICHT AN SPIELERN!
+static int skillunset(string str) {
+  if(!_checkLearner(this_player()))
+    return 0;
+
+  // per Query() das Mapping an der _query_*-Fun vorbei direkt holen
+  mapping skills = this_player()->Query(P_NEWSKILLS);
+  // ... und manipulieren (wirkt sich wegen Referenz direkt aus)
+  if(mappingp(skills) && mappingp(skills["ANY"]) &&
+     member(skills["ANY"], "fnrx")) {
+    efun::m_delete(skills["ANY"], "fnrx");
+    tell_object(this_player(), "Erledigt.\n");
+  } else
+    tell_object(this_player(), "Nichts zu erledigen.\n");
+  
+  return 1;
+}
+
+void reset() {
+  remove();
+}
diff --git a/doc/beispiele/testobjekte/netdead_info_testraum.c b/doc/beispiele/testobjekte/netdead_info_testraum.c
new file mode 100644
index 0000000..b2d8a71
--- /dev/null
+++ b/doc/beispiele/testobjekte/netdead_info_testraum.c
@@ -0,0 +1,69 @@
+// Beispielraum fuer P_NETDEAD_INFO-Funktionalitaet
+#include <properties.h>
+#include <break_string.h>
+inherit "/std/room";
+     
+string create_destiny(mixed val);
+int create_room(string dir);
+
+void create() {
+  ::create();
+
+  if (clonep(this_object())) {
+    // setze Informationen, die in einem Netztoten gespeichert werden sollen
+    Set(P_NETDEAD_INFO, random(5));
+    SetProp(P_INT_LONG, break_string(
+      "Wenn du hier einschlaefst, wird der Raum nach 30s zerstoert. Beim "
+      "Aufwachen wirst du an die Blueprint dieses Raums die Info "+
+      QueryProp(P_NETDEAD_INFO)+" uebergeben. Diese wird aus dieser Info "
+      "einen Raumpfad ermitteln, in den du bewegt wirst.", 78));
+  } else {
+    // Blueprint: hier kann man zu einem Cloneraum gehen
+    AddExit("cloneraum", #'create_room);
+    SetProp(P_INT_LONG, break_string(
+      "Zum Testen einfach den Ausgang 'cloneraum' benutzen. Es wird dann "
+      "ein Raum geclont, in den man bewegt wird. Wenn man dort einschlaeft, "
+      "wird der geclonte Raum nach circa 30s zerstoert.\n"
+      "Beim Aufwachen werden die im Spieler gespeicherten Informationen des "
+      "geclonten (und nunmehr zerstoerten) Raumes benutzt, um einen "
+      "alternativen Aufwachraum (Klerusgilde, Karategilde, Wald oder Port "
+      "Vain) zu bestimmen.\n"
+      "Andernfalls wuerde der Spieler in der Abenteurergilde erwachen.", 78,
+      0, BS_LEAVE_MY_LFS));
+  }
+
+  // Set-Method, um die Informationen aus P_NETDEAD_INFO beim Aufwachen
+  // in der Blueprint auswerten zu koennen
+  Set(P_NETDEAD_INFO, #'create_destiny, F_SET_METHOD);
+  SetProp(P_LIGHT, 1);
+}
+     
+// Raum entfernen, normalerweise so KEINE GUTE IDEE!
+void BecomesNetDead(object pl) {
+  call_out(#'remove, 30);
+}
+
+// erzeuge einen Cloneraum und bewege den Spieler dahin
+int create_room(string dir) {
+  object dest = clone_object(object_name(this_object()));
+  this_player()->move(dest, M_NOCHECK);
+  return 1;
+}
+     
+// Set-Method fuer P_NETDEAD_INFO: gibt Pfad zurueck
+// benutze die Informationen aus dem jetzt aufwachenden Netztoten, um einen
+// alternativen Aufwachraum zu ermitteln, da der Einschlafraum zerstoert ist
+string create_destiny(mixed val) {
+  if (intp(val)) {
+    switch (val) {
+      case 0:
+        return "/d/ebene/room/PortVain/po_haf1";
+      case 1:
+        return "/gilden/klerus";
+      case 2:
+        return "/gilden/karate";
+      default:
+    }
+    return "/d/ebene/room/waldweg4";
+  }
+}
