diff --git a/obj/misc/kissen.c b/obj/misc/kissen.c
new file mode 100644
index 0000000..33c365b
--- /dev/null
+++ b/obj/misc/kissen.c
@@ -0,0 +1,128 @@
+inherit "std/thing";
+#include <properties.h>
+#include <language.h>
+
+string cstr;  
+
+init()
+{
+  int colour;
+  ::init();
+  colour = random(8);
+  if (colour==0) cstr = "gruenes";
+  if (colour==1) cstr = "rotes";
+  if (colour==2) cstr = "blaues";
+  if (colour==3) cstr = "gelbes";
+  if (colour==4) cstr = "schwarz-weiss-kariertes";
+  if (colour==5) cstr = "orange-pink-gestreiftes";
+  if (colour==6) cstr = "lila-gruen-getuepfeltes";
+  if (colour==7) cstr = "silbergraues";
+  add_action("throw_it","wirf"); 
+  add_action("ww", "ww");
+}
+
+short()
+{
+  return "Ein " + cstr + " Kissen\n";
+}
+
+long()
+{
+  return "Dies ist ein wunderschoenes, " + cstr + " Kissen.\n"+
+          "Du kannst versuchen es zu werfen.\n";
+}
+
+create()
+{
+  ::create();
+  cstr = "von Boing handgenaehtes";
+  AddId("kissen");
+  SetProp(P_WEIGHT, 1);
+  SetProp(P_VALUE, 1);
+  SetProp(P_NAME, "Kissen");
+  SetProp(P_GENDER, 0);
+}
+
+ww(str)
+{
+  if (str)
+    return throw_it("kissen nach "+str);
+  else
+  {
+    object *all, *liv;
+    int i;
+
+    all=all_inventory(environment(this_player()));
+    for (i=0; i<sizeof(all); i++)
+      if (query_once_interactive(all[i]))
+        if (!liv)
+	  liv = ({all[i]});
+        else
+          liv = liv+({all[i]});
+    i = random(sizeof(liv));
+    return throw_it("kissen nach "+lower_case(liv[i]->query_real_name()));
+  }
+}
+
+throw_it(str)
+{
+  int treffer;
+  string werfer_name;
+  string victim_string,werfer_string;
+  string was,at,wen;
+  int fehler;
+  object victim;
+
+  if (!str) return 0;
+  fehler = 0;
+  if (sscanf(str,"%s %s %s",was,at,wen) != 3)
+    fehler = 1;
+  if (!id(was) || at != "nach")
+    fehler = 1;
+  if (fehler)
+  { 
+     notify_fail("Zum Werfen: wirf kissen nach <spielername>\n");
+     return 0;
+  }
+  victim = present(wen,environment(this_player()));
+  if (!victim)
+  { 
+     write("Dieser Spieler ist nicht hier!\n");                                
+     return 1;                                                                 
+  }                                                                           
+  werfer_name = this_player()->name();
+  treffer = random(5);
+  write("Du schmeisst ein Kissen nach " + victim->name(WEM) +".\n");
+  say(werfer_name + " wirft ein Kissen nach " + victim->name(WEM) + ".\n");
+  if (treffer==0)
+  {
+    werfer_string = "Du verfehlst " + victim->name(WEN) + " meilenweit.\n";
+    victim_string = werfer_name + " verfehlt Dich meilenweit.\n";
+    this_object()->move(environment(this_player()));
+  }
+  if (treffer==1)
+  {
+    werfer_string = "Das Kissen streift " + victim->name(WEN)+ " am Ohrlaeppchen.\n";
+    victim_string = "Das Kissen streift Dich am Ohrlaeppchen.\n";
+  }
+  if (treffer==2)
+  {
+    werfer_string = "PAFF! Du triffst " + victim->name(WEN) + " mitten ins Gesicht.\n";
+    victim_string = "PAFF! Das Kissen trifft Dich mitten im Gesicht!\n";
+  }
+  if (treffer==3)
+  {
+    werfer_string = "WUSCH! Das Kissen trifft " + victim->name(WESSEN) + " Bauch mit voller Wucht.\n";
+    victim_string = "WUSCH! Das Kissen fliegt mit voller Wucht gegen Deinen Bauch.\n";
+  }
+  if (treffer==4)
+  {
+    werfer_string =  victim->name() + " versucht wegzurennen, doch das Kissen trifft den Hinterkopf.\n";
+    victim_string = "Du versuchst wegzurennen, aber das Kissen trifft Dich am Hinterkopf.\n";
+  }
+  write(werfer_string);
+  tell_object(victim,victim_string);
+  if (treffer) this_object()->move(victim);
+  return 1;
+}
+
