diff --git a/items/seil.c b/items/seil.c
new file mode 100644
index 0000000..c5cf079
--- /dev/null
+++ b/items/seil.c
@@ -0,0 +1,286 @@
+#include <properties.h>
+#include <language.h>
+#include <seil.h>
+inherit "/std/thing";
+
+#pragma strict_types,rtt_checks
+
+object tied_to_ob;
+string tied_name;
+
+void create(){
+  ::create();
+
+  AddId( ({"seil", "\nseil"}) );
+  SetProp(P_NAME, "Seil");
+
+  SetProp(P_GENDER, NEUTER);
+  SetProp(P_LONG,break_string("Du siehst ein ganz normales Seil. Du kannst es an "+
+                  "Gegenstaenden festbinden und wieder loesen. Das Seil besteht "+
+                  "aus solider fester Steinbeisserwolle.",78));
+  AddDetail(({"wolle","steinbeisserwolle"}),"Diese Wolle ist eine besonders feste und stabile Wolle.\n");
+  SetProp(P_VALUE, 15);
+  SetProp(P_TIE_AUTO,1);
+  SetProp(P_WEIGHT, 300);
+
+  SetProp(P_MATERIAL,({MAT_MISC_STONE,MAT_WOOL}));
+  AddCmd( ({"binde","bind","knote","befestige","mach","mache"}), "tie" );
+
+  // der Befehle loesen wird auf die anderen Befehle umgebogen und dient nur
+  // der besseren benutzbarkeit des seiles.
+  AddCmd( ({"loese" }), "loesen" );
+
+}
+
+// dieses Ding wird u.a. geerbt. Damit die BP beim Erben auch initialisiert
+// wird (fuer die Laeden), muss create_super() das create() rufen.
+protected void create_super() {
+  create();
+}
+
+string _query_short()
+{
+ string artikel;
+ switch( QueryProp(P_GENDER) )
+ {
+  case NEUTER : artikel="das";break;
+  case MALE   : artikel="der";break;
+  case FEMALE :	artikel="die";break;
+  default     : artikel="das";
+ }
+
+ if (tied_to_ob)
+  return this_object()->Name(WER)+", "+artikel+" an "
+     + (tied_name?tied_name:(string)(tied_to_ob->name(WEM)))
+     + " festgebunden ist";
+ return (string)this_object()->Name(WER);
+
+}
+
+mixed _query_noget()
+{
+ if (tied_to_ob)
+  return "Das geht nicht, solange "+name(WER)+" festgebunden ist.\n";
+ return 0;
+}
+
+int tie(string str)
+{
+  string t1, t2;
+  object ob;
+  string verb;
+  mapping tied_map;
+
+  _notify_fail("Binde was?\n");
+
+  // zunaechst den User notieren, damit spaeter immer drauf 
+  // zugegriffen werden kann.
+  // Wegen kompatibilitaet wird das nicht direkt an tie()/untie()
+  // uebergeben.
+  SetProp(P_TIE_USER,this_player());
+
+  if (!str||!stringp(str)) return 0;
+
+  verb = query_verb();
+  
+  //automatischer aus objecten/raeumen generierter aufruf
+  if(QueryProp(P_TIE_VERB)) verb=QueryProp(P_TIE_VERB); 
+  	
+  if (sscanf(str, "%s an %s", t1, t2) != 2 && 
+      sscanf(str,"%s los",t1) != 1 &&
+      sscanf(str,"%s fest",t1) != 1 )
+   return 0;
+
+  if(id(t1) && str==(t1+" fest")) str="seil an raum";
+
+  if(sscanf(str,"%s an %s",t1,t2)==2)
+  {
+   if(tied_to_ob)
+   {
+    write("Es ist bereits irgendwo festgebunden.\n");
+    return 1;
+   }
+
+   if (!id(t1)) return 0;
+
+   if (t2 == "mich")
+   {
+    _notify_fail("Warum willst Du das denn machen?\n");
+    return 0;
+   }
+
+   ob = present(t2, this_player());		
+
+   if (!ob) ob = present(t2, environment(this_player()));
+
+   if (!ob)
+   {
+    if (call_other(environment(this_player()), "id", t2))
+    ob = environment(this_player());
+   }
+		
+   if(!ob && str == "seil an raum")
+   {
+    ob=environment(this_player());
+   }
+
+   _notify_fail( "Soetwas findest Du hier nicht.\n" );
+   if (!ob) return 0;
+
+   if (!(tied_name=(string)call_other(ob, "tie", t2)))
+   {
+    if(ob->QueryProp(P_INVIS)) return 0;
+    
+    if (ob != environment(this_player()))
+    {
+     _notify_fail("Du kannst "+name(WER)+" nicht an "+ob->name(WEM)+
+                 " festbinden.\n");
+     return 0;
+    }
+    else
+    {
+     _notify_fail("Du kannst "+name(WER)+" nicht daran festbinden.\n");
+     return 0;
+    }
+
+   }
+		
+  /* Is he carrying the rope ? */
+  if (environment() == this_player()) 
+  {
+   this_object()->move(environment(this_player()));
+  }
+
+  tied_to_ob = ob;
+
+  if (tied_to_ob != environment(this_player()) || 
+      environment(this_player())->name()!=0 )
+   {
+    tied_name = (string)(tied_to_ob->name(WEM));
+   }
+  else
+   {
+    if( !stringp(tied_name) ) tied_name="etwas";
+   }
+
+  if(QueryProp(P_TIE_VERB))
+  {
+    // das seil wird gesteuert
+    tell_room(environment(),QueryProp(P_TIE_MESSAGE));
+
+    // seil wieder in roh-zustand versetzen.
+    SetProp(P_UNTIE_MESSAGE,0);
+    SetProp(P_TIE_VERB,0);
+  }
+  else
+  {
+   write("Du bindest "+name(WER)+" an " + tied_name + " fest.\n");
+   say(this_player()->name(WER) + " bindet "+name(WER)+" an "
+   + tied_name + " fest.\n");
+  }
+
+  // den object mitteilen, an wen es gebunden ist.
+  if(tied_to_ob->QueryProp(P_TIED)==0) tied_to_ob->SetProp(P_TIED,([]) );
+  tied_to_ob->SetProp(P_TIED,tied_to_ob->QueryProp(P_TIED)+([this_object(): 
+     ([
+       "player":this_player(),
+       "time"  :time()
+     ]) ]));
+
+  return 1;
+ }
+
+ if( (member( ({
+         "binde",
+         "bind",
+         "knote",
+         "mach",
+         "mache",
+         "loese" 
+         }),verb                 
+    )!=-1) && 
+    sscanf(str,"%s los",t1)==1)
+  {
+   if (!tied_to_ob)
+   {
+    write(Name(WER)+" ist nirgendwo festgebunden.\n");
+    return 1;
+   }
+
+   if (!call_other(tied_to_ob, "untie"))
+   {
+    write("Das klappt leider nicht.\n");
+    return 1;
+   }
+
+   if(QueryProp(P_TIE_VERB))
+   {
+    // das seil wird gesteuert
+    tell_room(environment(),QueryProp(P_UNTIE_MESSAGE));
+
+    // wieder in roh-zustand versetzen.
+    SetProp(P_UNTIE_MESSAGE,0);
+    SetProp(P_TIE_VERB,0);
+   }
+   else
+   {
+    write("Du bindest "+name(WER)+" los.\n");
+    say(this_player()->name()+" bindet "+name(WER)+" los.\n");
+   }
+
+  tied_map=([])+tied_to_ob->QueryProp(P_TIED);
+  tied_map=m_copy_delete(tied_map,this_object());
+
+  tied_to_ob->SetProp(P_TIED,tied_map);
+
+  tied_to_ob = (object) 0;
+ 
+  return 1;
+ }
+ return 0;
+}
+
+int loesen(string str)
+{
+ if(str == "seil"  ||
+    str == lower_case(QueryProp(P_NAME)) ||
+    id(str)
+ )
+ {
+  return tie("seil los");
+ }
+ _notify_fail("Was moechtest Du loesen?\n");
+ return 0;
+}
+
+
+object query_tied_to_ob()
+{
+  return tied_to_ob;
+}
+
+varargs int binde_seil(string ziel,string msg)
+{
+ if(!QueryProp(P_TIE_AUTO)) return 0;
+
+ // diese funktion bindet ein Seil und kann von einem object aus 
+ // aufgerufen werden.
+ SetProp(P_TIE_VERB,"binde");
+
+ if(!msg) msg = Name(WER)+" wird auf magische Art und Weise festgebunden.\n";
+
+ SetProp(P_TIE_MESSAGE,msg);
+ return tie("seil an "+ziel); 
+}
+
+varargs int loese_seil(string msg)
+{
+ if(!QueryProp(P_TIE_AUTO)) return 0;
+
+ if(!msg) msg = Name(WER)+" loest sich.\n";
+ 
+ SetProp(P_TIE_VERB,"binde");
+ SetProp(P_UNTIE_MESSAGE,msg);
+ return tie("seil los");
+}
+
