diff --git a/doc/beispiele/food/banane.c b/doc/beispiele/food/banane.c
new file mode 100644
index 0000000..8882f4f
--- /dev/null
+++ b/doc/beispiele/food/banane.c
@@ -0,0 +1,114 @@
+/*
+Beispiel fuer eine Banane, die in einem Haps weg ist,
+aber eine Schale hat, die uebrig bleibt und genau wie die
+komplette Banane vergammelt und vergeht.
+*/
+
+#include <food.h>
+
+inherit "/std/food";
+
+string _query_long() {
+  string m = "Du haeltst ";
+  if (is_not_empty()) {
+    m += "eine Banane in der Hand.";
+    if (!is_bad())
+      m += " Sie ist schoen gelb und ohne braune Flecken.";
+    else
+      m += " Sie ist total braun und schon ganz matschig.";
+
+  } else {
+    m += "eine Bananenschale in der Hand.";
+    if (is_bad())
+      m += " Sie ist ganz verschimmelt.";
+  }
+  return break_string(m);
+}
+
+void create() {
+  if (!clonep(this_object())) {
+    set_next_reset(-1);
+    return;
+  }
+  ::create();
+
+  SetProp(P_SHORT,"Eine schoene reife Banane");
+  SetProp(P_NAME, "Banane");
+  SetProp(P_GENDER,FEMALE);
+  SetProp(P_VALUE,20); // ohne Schale
+  SetProp(P_WEIGHT,50); // ohne Schale
+  // SetProp(P_POTION,1); // ist eh Standard
+  SetProp(P_CONSUME_MSG,
+    "@WER2 schaelt eine Banane und isst sie genuesslich.");
+  SetProp(P_EATER_MSG,
+    "Du schaelst eine Banane und isst sie genuesslich.");
+  SetProp(P_BAD_MSG,
+    "Die Banane wird ganz matschig und schlecht.");
+  SetProp(P_REMOVE_MSG,
+    "Die Banane ist so verschimmelt, dass Du sie entsorgst.");
+  SetProp(P_EMPTY_MSG,
+    "Aber das ist doch nur eine BananenSCHALE, die willst Du nicht essen!");
+
+  SetProp(P_MATERIAL,([MAT_MISC_PLANT:100]));
+
+  SetProp(P_EMPTY_PROPS, ([
+    P_SHORT:"Eine Bananenschale",
+    P_NAME:"Bananenschale",
+    P_EMPTY_IDS:({"schale","bananenschale","banane"}),
+    P_VALUE:5, // Wert der Bananenschale
+    P_WEIGHT:5  // Gewicht der Bananenschale
+  ]));
+
+  //SetProp(P_RESET_LIFETIME,1); // ist eh Standard
+  SetProp(P_DESTROY_BAD,300); // verdorbene Bananen verschwinden nach 5 Min
+
+  SetProp(P_FOOD,50); // Fuellgrad der Banane
+  SetProp(P_HP,5);
+  SetProp(P_SP,5);
+
+  AddId(({"banane"}));
+
+}
+
+// Der Behaelter vergammelt auch
+public int make_destroy() {
+  if (!::make_destroy()) {
+    return remove(1);
+  }
+  return 1;
+}
+
+public int make_empty() {
+  SetProp(P_BAD_MSG,
+    "Die Bananenschale wird ganz schimmlig.");
+  SetProp(P_REMOVE_MSG,
+    "Die Bananenschale zersetzt sich vollstaendig.");
+  return ::make_empty();
+}
+
+// parent methode immer aufrufen und pruefen!!
+void make_bad() {
+  if (!::make_bad()) {
+    if (is_not_empty()) {
+      SetProp(P_SHORT,"Eine matschige Banane");
+      AddAdjective(({"matschige","matschigen"}));
+      SetProp(P_EATER_MSG,"Du lutschst die matschige Banane aus ihrer"
+        "Schale. Baeh, die schmeckt ueberhaupt nicht mehr.");
+      SetProp(P_CONSUME_MSG,
+        "@WER2 lutscht eine matschige Banane aus ihrer Schale.");
+      // Die Schale ist dann natuerlich auch vergammelt
+      SetProp(P_EMPTY_PROPS, ([
+        P_SHORT:"Eine verschimmelte Bananenschale",
+        P_NAME:"Bananenschale",
+        P_EMPTY_IDS:({"schale","bananenschale","banane"}),
+        P_EMPTY_ADJ:({"verschimmelte","verschimmelten"}),
+        P_VALUE:5, // Wert der Bananenschale
+        P_WEIGHT:5  // Gewicht der Bananenschale
+      ]));
+    } else {
+      message(P_BAD_MSG);
+      SetProp(P_SHORT,"Eine verschimmelte Bananenschale");
+      AddAdjective(({"verschimmelte","verschimmelten"}));
+    }
+  }
+}
diff --git a/doc/beispiele/food/wasserflasche.c b/doc/beispiele/food/wasserflasche.c
new file mode 100644
index 0000000..3c62c13
--- /dev/null
+++ b/doc/beispiele/food/wasserflasche.c
@@ -0,0 +1,92 @@
+/*
+Beispiel fuer ein tragbares Getraenk in einer Flasche.
+*/
+
+#include <food.h>
+
+inherit "/std/food";
+
+string _query_long() {
+  string m = "Du siehst eine Glasflasche,";
+  if (is_not_empty()) {
+    m += " in der sich Wasser befindet.";
+    if (!is_bad())
+      m += " Es ist glasklar und sieht irgendwie verlockend aus.";
+    else
+      m += " Es ist truebe und sieht nicht gerade verlockend aus.";
+
+    m += " Die Flasche ist ";
+    switch (to_int((QueryProp(P_PORTIONS)-1)/2.5)) {
+      case 0:
+        m += "fast leer.";
+        break;
+      case 1:
+        m += "halb voll.";
+        break;
+      case 2:
+        m += "fast voll.";
+        break;
+      case 3:
+        m += "voll.";
+        break;
+      default:
+        m += "nicht leer.";
+    }
+  } else {
+    m += " in der frueher mal Wasser war.";
+  }
+  return break_string(m);
+}
+
+void create() {
+  if (!clonep(this_object())) {
+    set_next_reset(-1);
+    return;
+  }
+  ::create();
+
+  SetProp(P_SHORT,"Eine Flasche mit Wasser");
+  SetProp(P_NAME, "Wasserflasche");
+  SetProp(P_GENDER,FEMALE);
+  SetProp(P_VALUE,5); // pro Portion (ohne Flasche)
+  SetProp(P_WEIGHT,50); // pro Portion (ohne Flasche)
+  SetProp(P_PORTIONS,10);
+  SetProp(P_DESTROY_BAD,0); // verdorbenes Wasser wird nicht zerstoert
+  SetProp(P_CONSUME_MSG,
+    "@WER2 trinkt aus einer Flasche. Wasser laeuft ueber @WENQPPNS2 Kinn.");
+  SetProp(P_EATER_MSG,
+    "Du trinkst Wasser aus der Flasche. Etwas laeuft Dir ueber das Kinn.");
+  SetProp(P_BAD_MSG,
+    "Das Wasser in der Flasche wird truebe.");
+
+  SetProp(P_MATERIAL,([MAT_GLASS:15, MAT_WATER:85]));
+
+  SetProp(P_EMPTY_PROPS, ([
+    P_SHORT:"Eine leere Flasche",
+    P_NAME:"Flasche",
+    P_EMPTY_IDS:({"flasche"}),
+    P_EMPTY_ADJ:({"leere","leeren"}),
+    P_MATERIAL:([MAT_GLASS:100]),
+    P_VALUE:5, // Wert der Flasche ohne Wasser
+    P_WEIGHT:20  // Gewicht der Flasche ohne Wasser
+  ]));
+
+  SetProp(P_RESET_LIFETIME,3); // 3 Resets, ehe das Wasser truebe wird
+  SetProp(P_DRINK,50); // Fuellgrad pro Schluck
+  SetProp(P_DISTRIBUTION,10); // Punkte Heilung pro Heartbeat
+  SetProp(P_HP,30); // pro Schluck
+  SetProp(P_SP,30); // pro Schluck
+
+  AddId(({"flasche","wasserflasche","wasser"}));
+  AddAdjective(({"volle","vollen"}));
+
+}
+
+// parent methode immer aufrufen und pruefen!!
+void make_bad() {
+  if (!::make_bad() && is_not_empty()) {
+    // die Trinkmeldung aendern wir mal
+    SetProp(P_EATER_MSG,"Du trinkst truebes Wasser aus der Flasche. "
+      "Das war wohl nicht so gut. Dir wird ganz uebel!");
+  }
+}
\ No newline at end of file
