diff --git a/README b/README
index 86cfb7b..fe59064 100644
--- a/README
+++ b/README
@@ -86,6 +86,10 @@
   room/huette17.c
 18. Ein Beispiel fuer eine einfache, kleine Miniquest.
   room/huette18.c
+19. Ein Beispiel fuer einen Gegenstand, den man beim Forschen "findet",
+    und der dann - unter den ueblichen Checks - in das Inventory des
+    Spielers bewegt wird.
+  room/huette19.c obj/schoki.c
 
 
 B. Unser erster eigener NPC
@@ -124,5 +128,7 @@
   obj/axt3.c
 7. Ein grosser, nicht bewegbarer Behaelter.
   obj/kiste.c
-
+8. Ein weiteres Beispiel fuer ein Gegenstand, der weder Waffe noch Ruestung
+   ist.
+  obj/schoki.c
 
diff --git a/obj/schoki.c b/obj/schoki.c
new file mode 100644
index 0000000..cb936b5
--- /dev/null
+++ b/obj/schoki.c
@@ -0,0 +1,51 @@
+inherit "/std/thing" ;
+
+#include __PATH__(1)"defs.h"
+
+int cmd_essen();
+
+
+protected void create() {
+  if (!clonep()) {
+    set_next_reset(-1);
+    return;
+  }
+  ::create();
+
+  SetProp(P_SHORT, "Ein kleines Stueck Schokolade");
+  SetProp(P_LONG, BSLF(
+    "Das Stueck Schokolade ist nicht sehr gross, sieht aber sehr lecker "
+    "aus."));
+  SetProp(P_INFO, BSLF(
+    "Dieses kleine Schokoladenstueck ist essbar und macht dabei nichtmal "+
+    "satt. Allerdings heilt sie Dich auch nicht."));
+  SetProp(P_NAME, "Schokoladenstueck");
+
+  SetProp(P_GENDER, NEUTER);
+  SetProp(P_WEIGHT, 10);
+  SetProp(P_VALUE, 0);
+  SetProp(P_MATERIAL, ([MAT_CHOCOLATE:100]));
+  AddId(({"schoki", "schoko", "schokolade",
+          "schokoladenstueck", "schokostueck", "stueck"});
+
+  AddCmd("iss|ess|esse&@ID", #'cmd_essen,
+    "Was willst Du essen?|");
+}
+
+
+int cmd_essen() {
+  if (ENV()!=TP) {
+    tell_object(TP, BSLF(
+      "Dazu solltest Du das Schokoladenstueck schon dabeihaben."));
+    return 1;
+  }
+
+  tell_object(TP, BSLF(
+    "Du steckst die Schokolade in den Mund und laesst sie Dir auf der "
+    "Zunge foermlich zergehen. Lecker!"));
+  tell_room(ENV(TP), BSLF(
+    TPNC+" steckt sich ein Stueck Schokolade in den Mund."), ({TP}));
+  remove(1);
+  return 1;
+}
+
diff --git a/room/huette19.c b/room/huette19.c
new file mode 100644
index 0000000..ad2423d
--- /dev/null
+++ b/room/huette19.c
@@ -0,0 +1,105 @@
+inherit "/std/room";
+
+#include __PATH__(1)"defs.h"
+
+int cmd_knopf();
+
+int schoki_da = 1; // 1 wenn Schoki vorhanden ist, 0 wenn nicht
+
+protected void create() {
+  ::create();
+
+  SetProp(P_INT_SHORT, "Eine Huette mit verstecktem Gegenstand");
+  SetProp(P_INT_LONG, BSLF(
+    "Diese Huette sieht auf den ersten Blick recht leer aus."));
+
+  SetProp(P_LIGHT, 1);
+  SetProp(P_INDOORS, 1);
+  SetProp(P_LIGHT_TYPE, LT_GLOWING);
+
+  AddDetail("blick", BSLF(
+    "Dein Blick faellt auf die kahle Wand, hier ist echt nichts los."));
+  AddDetail("wand", BSLF(
+    "An der Wand ist nichts zu finden, nur ein kleiner Knopf ist da "
+    "angebracht."));
+  AddDetail("knopf", BSLF(
+    "Der Knopf ist so klein und niedlich, Du moechtest ihn doch bestimmt "
+    "gern mal druecken, oder?"));
+
+  AddCmd("drueck|druecke&knopf", #'cmd_knopf,
+    "Wen oder was willst Du druecken?^");
+}
+
+void reset() {
+  ::reset();
+  if (!schoki_da) {
+    // Einmal pro Reset gibts neue Schoki:
+    tell_room(TO, BSLF(
+      "Der Knopf an der Wand knirscht leise."));
+    schoki_da = 1;
+  }
+}
+
+int cmd_knopf() {
+  if (!schoki_da) {
+    // Diesen Reset wurde die Schoki schon abgeholt:
+    tell_object(TP, BSLF(
+      "Du drueckst den Knopf, aber nichts passiert. Gedulde Dich ein wenig "
+      "und probiere es spaeter nochmal."));
+    tell_room(TO, BSLF(
+      TPNC+" macht sich an der Wand zu schaffen. Nichts passiert."), ({TP}));
+    return 1;
+  }
+
+  /* Das Objekt wird geclont ... */
+  object ob = clone_object(__PATH__(1)"obj/schoki");
+  if (!objectp(ob)) {
+    /* ... aber es gab dabei einen Fehler, das Objekt konnte nicht erzeugt
+       werden: */
+    tell_object(TP, BSLF(
+      "Da ist wohl etwas schiefgegangen, Du hoerst von weiter oben nur "
+      "ein resigniertes Jammern."));
+    tell_room(TO, BSLF(
+      TPNC+" macht sich an der Wand zu schaffen. Von oben hoerst Du "
+      "Gejammer."), ({TP}));
+  } else if (ob->move(TP, M_GET) == MOVE_OK) {
+    /* Beim Bewegen eines Gegenstandes in den Spieler ist eine Pruefung auf
+       den Erfolg des Aufrufes Pflicht. Fuer moegliche Gruende, dass move()
+       fehlschlaegt, lies Dir bitte die Manpage zu move() durch.
+
+       Das Objekt wurde erfolgreich erzeugt, und es wurde erfolgreich in den
+       Spieler bewegt, der die Aktion ausgeloest hat: */
+    tell_object(TP, BSLF(
+      "Eine Klappe oeffnet sich an der Decke, und etwas faellt von oben "
+      "herab. Geschickt faengst Du es auf."));
+    tell_room(TO, BSLF(
+      "Etwas faellt von oben herab und wird geschickt von "+TPN+
+      " aufgefangen."), ({TP}));
+    schoki_da = 0;
+  } else {
+    /* Das Objekt wurde erfolgreich erzeugt, aber es konnte nicht in den
+       Spieler bewegt werden. Da das Objekt in diesem Fall sehr einfach
+       gebaut ist und keine Sonderbehandlung dafuer beinhaltet, bewegt
+       zu werden, ist der Spieler offensichtlich ueberladen. Wir muessen
+       also in diesem Fall nicht pruefen, welchen Fehlerwert move()
+       zurueckgeliefert hat. */
+    tell_object(TP, BSLF(
+      "Eine klappe oeffnet sich an der Decke, und etwas faellt von oben "
+      "herab. Du bist aber schon zu vollgeladen, um es noch halten zu "
+      "koennen. Es faellt zu Boden."));
+    tell_room(TO, BSLF(
+      "Etwas faellt von oben herab, aber "+TPN+" stellt sich zu dusslig "
+      "an. Schnell, hebe es auf, bevor "+TP->QueryPronoun(WER)+" sich "
+      "besinnt!"), ({TP}));
+    schoki_da = 0;
+    /* Beim Bewegen des Objektes in den Raum kann auch etwas schiefgehen,
+       aber ueblicherweise passiert das nur in seltenen Ausnahmefaellen.
+       Normalerweise prueft man den Rueckgabewert von move() beim Bewegen
+       von Gegenstaenden oder Spielern in einen Raum nicht, denn wenn das
+       nicht klappt, WILL man Debug-Output auf den entsprechenden Magier-
+       Ebenen und im Fehlerteufel haben: */
+    ob->move(TO, M_PUT);
+  }
+  return 1;
+}
+
