diff --git a/obj/tools/dancetool.c b/obj/tools/dancetool.c
new file mode 100644
index 0000000..dcf3b9a
--- /dev/null
+++ b/obj/tools/dancetool.c
@@ -0,0 +1,321 @@
+// DANCETOOL.C   Stand: 10.12.94 Dancer 
+//
+// Kleines Tool zum Schreiben und Nachsehen von Details.
+//
+//
+ 
+inherit "std/thing";
+ 
+#include <properties.h>
+#include <defines.h>
+#include <wizlevels.h>
+ 
+#define bs( x ) break_string( x, 78 )
+ 
+private int i, counter, first_detail_line, startline, endline; 
+private string *detail_shorts, *newstring, *file_lines, *new_lines;
+private string detail_long, save_string, old_file, new_file, actual_file,
+               detail_text;
+       
+void create()
+{
+   ::create();
+   SetProp( P_AUTOLOADOBJ,1 );
+   SetProp( P_NAME, "Dancers Sandtigerkralle" );
+   SetProp( P_GENDER, FEMALE );
+   SetProp( P_SHORT, "Dancers Sandtigerkralle" );
+   SetProp( P_LONG, bs( "Die Sandtigerkralle von Dancer ist "+
+              "ein kleines Tool, mit dem Du gewoehnliche Details "+
+              "in allen Raeumen nachschauen und in Deinen eigenen "+
+              "hinzufuegen kannst. Weitere Informationen kannst Du "+
+              "mit dem Befehl <dancetool> bekommen." ) );
+   SetProp( P_ARTICLE, 2 );
+   SetProp( P_WEIGHT, 500 );
+   SetProp( P_VALUE, 10000 );
+   SetProp( P_NOBUY, 1 );
+   SetProp( P_NODROP, 1 );
+   AddId( "kralle" );
+   AddId( "sandtigerkralle" );
+   AddId( "tigerkralle" );
+   AddId( "dancetool" );
+   AddId( "dancertool" );
+   seteuid(getuid(this_object()));
+}
+ 
+ 
+void init()
+{
+  if (!IS_LEARNER(this_player())) return;
+  ::init();
+  add_action("query_add_details", "show_detail" );
+  add_action("query_add_details", "show_details" );
+  add_action("query_add_details", "sd" );
+  add_action("set_add_detail", "add_detail" );
+  add_action("set_add_detail", "add_details" );
+  add_action("set_add_detail", "ad" );
+  add_action("give_info", "dancetool" );
+}
+ 
+ 
+int give_info()
+{
+   write( "-----------------------------------------------------------------------------\n" );
+   write( "Die Sandtigerkralle ermoeglicht folgende Befehle:\n" );
+   write( "\nadd_detail, add_details oder ad:\n" );
+   write( bs( "Ruft einen kleinen AddDetail-Editor auf, mit dem Du "+
+      "Details in Deine eigenen Raeume einfuegen kannst. Als Argument "+
+      "kann hinter den Befehl der Filename eines Raumes eingegeben "+
+      "werden. Wird kein Argument eingegeben, so wird der Raum "+
+      "genommen, in dem Du gerade stehst. Achtung: Es koennen "+
+      "nur Details in Raeume eingefuegt haben, die bereits ein "+
+      "AddDetail in ihrem create() haben. Du musst die Lupe haben, "+
+      "da der Raum nach dem Einfuegen des Details automatisch "+
+      "neu geladen wird." ) );
+   write( "\nshow_detail, show_details oder sd:\n" );
+   write( bs( "Zeigt Dir alle Zeilen des angesprochenen Raumes bzw. "+
+      "des Raumes in dem Du stehst, die ein AddDetail "+
+      "beinhalten. So kannst Du kontrollieren, welche Details "+
+      "Du schon eingebaut hast." ) );
+   write( "-----------------------------------------------------------------------------\n" );
+   return 1;
+}
+ 
+ 
+int renew_variables()
+{
+   i = counter = first_detail_line = startline = endline = 0; 
+   detail_shorts = newstring = file_lines = new_lines = ({});
+   detail_long = save_string = old_file = new_file = actual_file = detail_text = 0;
+   return 1;
+} 
+ 
+ 
+ 
+int query_add_details( string str )
+{
+   string old_file, *file_lines, new_file, *new_lines, actual_file;        
+   int i, counter, first_detail_line, startline, endline;      
+ 
+   actual_file = "";
+                            
+   if ( !str ) actual_file = object_name( environment( this_player() ) )+".c";
+   else       
+   {
+      if ( str[0..0] == "/" )
+      {
+         if ( str[<2..] != ".c" )
+             actual_file = str+".c";
+         else
+             actual_file = str;
+      }
+      else
+      {
+         if ( str[<2..] != ".c" )
+             actual_file = this_player()->QueryProp( P_CURRENTDIR )+
+                           "/"+str+".c";
+         else
+             actual_file = this_player()->QueryProp( P_CURRENTDIR )+
+                           "/"+str;
+      }
+   }
+   if ( file_size( actual_file )==-1 )
+   {
+     write( "File: "+actual_file+" nicht gefunden!\n" );
+     return 1;
+   }
+   call_other( actual_file, "???" );
+   write( "\n-----------------------------------------------------------------------------\n" );
+   write( "Aktuelles File:   "+actual_file+"\n" );
+   write( "Filegroesse:      "+file_size( actual_file )+"\n" );
+   write( "Userid des Files: "+getuid( find_object( actual_file ) )+"\n" );
+   new_file = "";
+   counter = 0;
+   first_detail_line = 0;
+   old_file = read_file( actual_file );
+   file_lines = ({ "dummy" }) + old_explode( old_file, "\n" );          
+   startline = 1;
+   endline = sizeof( file_lines )-1;        
+   for( i = startline; i <= endline; i++ )
+   {                                                        
+      new_file = new_file+file_lines[ i ]+"\n";
+      if ( strstr( file_lines[i], "AddDetail" ) != -1 )
+      {
+         write( file_lines[i]+"\n" );
+         if ( !first_detail_line ) first_detail_line = i;
+          counter = counter + 1;
+      }
+   }                                
+   write( "Details found: "+counter+".\n" ); 
+   write( "-----------------------------------------------------------------------------\n" );
+   return 1;
+}    
+ 
+ 
+int set_add_detail( string str )
+{
+ 
+   renew_variables();
+                            
+   if ( !str ) actual_file = object_name( environment( this_player() ) )+".c";
+   else       
+   {
+      if ( str[0..0] == "/" )
+      {
+         if ( str[<2..] != ".c" )
+             actual_file = str+".c";
+         else
+             actual_file = str;
+      }
+      else
+      {
+         if ( str[<2..] != ".c" )
+             actual_file = this_player()->QueryProp( P_CURRENTDIR )+
+                           "/"+str+".c";
+         else
+             actual_file = this_player()->QueryProp( P_CURRENTDIR )+
+                           "/"+str;
+      }
+   }
+   if ( file_size( actual_file )==-1 )
+   {
+     write( "File: "+actual_file+" nicht gefunden!\n" );
+     return 1;
+   }
+   call_other( actual_file, "???" );
+   write( "\n-----------------------------------------------------------------------------\n" );
+   write( "Aktuelles File:   "+actual_file+"\n" );
+   write( "Filegroesse:      "+file_size( actual_file )+"\n" );
+   write( "Userid des Files: "+getuid( find_object( actual_file ) )+"\n" );
+   new_file = "";
+   new_lines = ({ "dummy" });
+   counter = 0;
+   first_detail_line = 0;
+   old_file = read_file( actual_file );
+   file_lines = ({ "dummy" }) + old_explode( old_file, "\n" );          
+   startline = 1;
+   endline = sizeof( file_lines )-1;        
+   for( i = startline; i <= endline; i++ )
+   {                                                        
+      new_file = new_file+file_lines[ i ]+"\n";
+      if ( strstr( file_lines[i], "AddDetail" ) != -1 )
+      {
+        if ( !first_detail_line ) first_detail_line = i;
+        counter = counter + 1;
+      }
+   }
+   if ( !first_detail_line )
+   {
+      write( bs( "Es wurden im File "+actual_file+" keine "+
+         "Details gefunden! Um Details hinzufuegen zu koennen, "+
+         "muss mindestens ein AddDetail bereits vorhanden sein!" ) );
+      write( "-----------------------------------------------------------------------------\n" );
+      return 1;
+   }
+   write( "Details found:    "+counter+".\n" );
+   write( "-----------------------------------------------------------------------------\n" ); 
+   write( "Bitte die Detail-Kuerzel eingeben:\n(Bemerkung: "+
+          "die Kuerzel muessen mit Leerzeichen getrennt sein, "+
+          "Abbruch mit 'q'.)\n->" );
+   input_to( "get_detail_short" );
+   return 1;
+}    
+ 
+ 
+int get_detail_short( string str )
+{
+   string dummy;
+   if ( str == "q" )
+   {
+     tell_object( this_player(), "Abgebrochen!\n" );
+     return 1;
+   }
+   detail_shorts = map( old_explode( str, " " ),#'lower_case);
+   dummy = break_string(implode(sort_array(map(detail_shorts,#'lower_case),#'>),", ")+":",78);
+   write( "-----------------------------------------------------------------------------\n" );
+   write( bs ( "Bitte Beschreibung eingeben fuer das Detail mit den Namen \n" ) );
+   write( dummy+"( Abbruch mit 'q'.)\n->" );
+   input_to( "get_detail_long" );
+   return 1;
+}
+ 
+ 
+int get_detail_long( string str )
+{
+   if ( str == "q" )
+   {
+     write( "Abgebrochen!\n" );
+     write( "-----------------------------------------------------------------------------\n" );
+     return 1;
+   }
+   detail_long = break_string( "break_string( \""+str, 60 ); 
+   save_string = "  AddDetail( ({ ";        
+   for( i = 0; i < sizeof( detail_shorts ); i ++ )
+   {
+      if ( !(i%3) && i )
+        save_string = save_string + "\n                ";
+      if ( i < sizeof( detail_shorts ) - 1 ) 
+         detail_shorts[ i ] = "\""+detail_shorts[ i ]+"\", ";
+      else
+         detail_shorts[ i ] = "\""+detail_shorts[ i ]+"\" ";
+      save_string = save_string + detail_shorts[ i ];      
+      write( detail_shorts[ i ]+"\n" );
+   }
+   save_string = save_string + "}), \n";
+   newstring = old_explode( detail_long,"\n");
+   i = 0; 
+   for( i = 0; i<sizeof(newstring); i++) 
+   {
+      if ( i < sizeof(newstring)-1 )
+      {
+         if ( i==0||!i )
+          save_string = save_string +"                "+newstring[i]+" \"+\n";
+         else
+          save_string = save_string +"                \""+ newstring[i]+" \"+\n";
+ 
+      }
+      else
+      {
+         if ( i==0||!i )
+          save_string = save_string +"                "+ newstring[i]+"\", 78 ) );";
+         else
+          save_string = save_string +"                \""+ newstring[i]+"\", 78 ) );";
+      }
+   }
+   new_lines += ({ "dummy" });
+   for ( i = 1; i < first_detail_line; i++ )
+   {
+     new_lines += ({ file_lines[i] });
+   }                                  
+   new_lines += ({ save_string });
+   for ( i = first_detail_line + 1; i <= endline+1; i++ )
+     new_lines += ({ file_lines[ i - 1 ] });
+   write( "-----------------------------------------------------------------------------\n" );
+   write( bs( "Folgende Zeilen werden in die Datei "+actual_file+" geschrieben, falls `j` eingegeben wird:\n" ) );
+   write( save_string+"\n" );
+   write( "\nDetail speichern? (j/n)\n->" );
+   input_to( "save_detail" );
+   return 1;
+}
+ 
+ 
+int save_detail( string str )
+{  
+   if ( str != "j" && str != "ja" && str != "Ja" && str != "J" )
+   {
+     write( "Abgebrochen!\n" );
+     write( "-----------------------------------------------------------------------------\n" );
+     return 1;
+   }   
+   if ( !rm( actual_file ) )
+   {
+      write( "File: "+actual_file+" wurde nicht gefunden!\n" );
+      return 1;
+   }                   
+   for ( i = 2; i <= endline+2; i++ )
+     write_file( actual_file, new_lines[i]+"\n" ); 
+     //write( new_lines[i]+"\n" ); 
+   write( "Das Detail wurde in die Datei geschrieben.\n" );
+   this_player()->command_me( "here make" );
+   write( "-----------------------------------------------------------------------------\n" );  
+   return 1;
+}
