diff --git a/items/pfeifchen.c b/items/pfeifchen.c
new file mode 100644
index 0000000..c0d8976
--- /dev/null
+++ b/items/pfeifchen.c
@@ -0,0 +1,149 @@
+inherit "/std/thing";
+
+#include <properties.h>
+#include <language.h>
+
+int tm;
+int gestopft = 0;
+int rauchen  = 0;
+
+string des;
+
+string _query_long(){
+  string s;
+  s="Ein einfaches Holzpfeifchen: Ohne Verzierungen oder besondere "
+    "Extras, sondern schlicht und stabil genug fuer ein Abenteurerleben. "
+    "Es eignet sich hervorragend dazu, einmal zu entspannen und guten "
+    "Tabak zu geniessen";
+  if(gestopft) s+=". Das Pfeifchen ist gestopft";
+  if(rauchen)  s+=" und angezuendet.";
+  else         s+=".";
+  return(break_string(s,78));
+}
+
+string _query_short(){
+  if(rauchen)  return "Ein Pfeifchen (angezuendet)";
+  if(gestopft) return "Ein Pfeifchen (gestopft)";
+  else         return "Ein Pfeifchen";
+}
+
+protected void create(){
+  if(!clonep(this_object()))return ;
+  thing::create();
+  tm=0;
+  SetProp(P_GENDER,NEUTER);
+  SetProp(P_NAME,"Pfeifchen");
+  SetProp(P_WEIGHT,10);
+  SetProp(P_VALUE,0);
+  AddId(({"pfeifchen","holzpfeifchen"}));
+  SetProp(P_NODROP,1);
+  SetProp(P_NEVERDROP,1);
+  SetProp(P_MATERIAL,MAT_IRON_WOOD);
+  AddCmd(({"rauch","rauche"}),"cm_smoke");
+  AddCmd(({"stopf","stopfe"}),"cm_stopf");
+}
+
+static int cm_stopf(string str){
+  string s1,s2;
+  object ob;
+  _notify_fail("Syntax: stopfe pfeifchen mit <was>\n");
+  if(!str) return 0;
+  if(sscanf(str,"%s mit %s",s1,s2)==2){
+    if(id(s1)){
+      if(!ob=present(s2,this_player())){
+        write("So etwas hast Du doch gar nicht bei Dir.\n");
+        return 1;
+       }
+      if((ob->id("tabak")) || (ob->QueryMaterial(MAT_CANNABIS)>50)){
+        if(rauchen){
+          write(break_string("Du rauchst Dein Pfeifchen doch gerade. Damit "
+           "musst Du schon warten, bis Du fertig bist.",78));
+          return 1;
+         }
+        if(gestopft){
+          write(break_string("Du hast Dein Pfeifchen bereits gestopft. Es "
+           "liesse sich nun vortrefflich rauchen.",78));
+          return 1;
+         }
+        else{
+          write(break_string("Du stopfst Dein Pfeifchen mit "+
+           ob->name(WEM,1)+
+           " und freust Dich schon darauf, es zu rauchen.",78));
+          tell_room(environment(this_player()),this_player()->Name()+
+           " stopft ein Pfeifchen.\n",({this_player()}));
+          if(!ob->GetSmokeDescription()) des="Es scheint sich um keinen "
+           "besonders guten Tabak zu handeln. Nun, ja. Besser als nichts "
+           "immerhin.";
+          else des=ob->GetSmokeDescription();
+          if(!ob->QueryProp(P_AMOUNT))
+            ob->remove();
+          else
+            ob->AddAmount(-1);
+          gestopft = 1;
+          return 1;
+         }
+       }
+      write(break_string("Das laesst sich aber schlecht rauchen, such "
+       "Dir lieber einen ordentlichen Tabak.",78));
+      return 1;
+     }
+   }
+  return(0); //non-void Funktion, Zesstra
+}
+
+static int cm_smoke(string str){
+  object ob;
+
+  _notify_fail("Was moechtest Du rauchen?\n");
+  if(!str) return 0;
+  if(!id(str)) return 0;
+  if(rauchen){
+    write("Das machst Du doch bereits, nicht so hektisch.\n");
+    return 1;
+   }
+  if(!gestopft){
+    write("Vielleicht solltest Du Dein Pfeifchen erst mal stopfen?\n");
+    return 1;
+   }
+  if(tm > time()){
+    write("Nana, ein Pfeifchen geniesst man. Sei mal nicht so hektisch.\n");
+    return 1;
+   }
+  tm = time()+20;
+  rauchen = 1;
+  tell_room(environment(this_player()),this_player()->Name()+" raucht in "
+   +"Ruhe ein Pfeifchen.\n",({this_player()}));
+  write("Du rauchst in Ruhe Dein Pfeifchen.\n");
+  write(break_string(des,78));
+  if(find_call_out("smoke2")==-1)
+    call_out("smoke2",20,getuid(this_player()));
+  return 1;
+}
+
+int smoke2(object pl){
+  object ob;
+  if(!rauchen) return 0;
+  if(!ob=find_player(pl)) return 0;
+  if(environment()!=ob) return 0;
+  tell_object(ob,"Genuesslich pustest Du ein paar Rauchkringel in die Luft.\n");
+  tell_room(environment(ob),ob->Name()+" pustet genuesslich ein paar "
+   +"Rauchkringel in die Luft.\n",({ob}));
+  if(find_call_out("smoke3")==-1)
+    call_out("smoke3",20,getuid(environment()));
+  return 1;
+}
+
+int smoke3(object pl){
+  object ob;
+  if(!rauchen) return 0;
+  if(!ob=find_player(pl)) return 0;
+  if(environment()!=ob) return 0;
+  tell_object(ob,break_string("Genuesslich pustest Du ein paar Rauchkringel "
+   "in die Luft, rauchst Dein Pfeifchen auf und klopfst es aus.",78));
+  tell_room(environment(ob),break_string(ob->Name()+" pustet genuesslich ein "
+   "paar Rauchkringel in die Luft, beendet das Rauchpaeuschen und klopft "
+   +(ob->QueryProp(P_GENDER)==1?"sein":"ihr")+" Pfeifchen aus.",78),({ob}));
+  rauchen = 0;
+  gestopft = 0;
+  return 1;
+}
