diff --git a/obj/tools/lupe.c b/obj/tools/lupe.c
new file mode 100644
index 0000000..5d6f109
--- /dev/null
+++ b/obj/tools/lupe.c
@@ -0,0 +1,1888 @@
+// This tool was originally written by Macbeth@TUBmud
+//
+// Some changes/extensions by Jof@MorgenGrauen
+
+inherit "/std/thing";
+
+#include <language.h>
+#include <properties.h>
+#include <wizlevels.h>
+#include <moving.h>
+#include <defines.h>
+#include <questmaster.h>
+#include <userinfo.h>
+
+#define add(s) commands+=({s});functions+=({s});ncmds++
+#define add2(s,f) commands+=({s});functions+=({f});ncmds++
+#define MAXSTACK 10
+#define MAXVARS 10
+#define MAXDEPTH 5
+#define MAXLINES 40
+#define MAXLINELEN 79
+
+mixed *stack, *vararea, err;
+
+string *commands, *functions, user, *query_list, *argv;
+int maxverb,ncmds,argc,recursive,hide_short,lines,firstline,lastline;
+static int tell(string str);
+int evalcmd(string str);
+int eval(string str);
+string stk(string arg);
+string desc(object ob);
+void clean(object ob);
+void cleanof(string str,object ob);
+
+
+void create()
+{
+  object owner;
+  string str;
+  
+  if (!clonep(ME)) return;
+  ::create();
+  owner=environment()||this_player();
+  if (owner)
+    str=capitalize(((str=geteuid(owner))[<1]=='s'||str[<1]=='x'||str[<1] =='z')?str+="'":str+="s"); 
+  else
+    str="Eine";
+  SetProp( P_SHORT,str+" Lupe" );
+  SetProp( P_NAME, str+" Lupe" );
+  SetProp( P_LONG, "Mit dieser Lupe kann man die Feinheiten des LPC besser erkennen.\n" );
+  SetProp( P_NEVERDROP, 1 );
+  SetProp( P_NODROP, "Du kannst Deine Lupe nicht wegwerfen. Dazu ist sie zu wertvoll.\n");
+  SetProp( P_NOBUY, 1 );
+  SetProp( P_GENDER, FEMALE );
+  SetProp( P_WEIGHT, 0 );
+  SetProp( P_ARTICLE,0);
+  SetProp( P_GENDER,0);
+  AddId( "lupe" );
+  user="*";
+  stack=({});
+  commands=({});
+  functions=({});
+  ncmds=0;
+  add("Dest");
+  add("_goto");
+  add("clnof");
+  add("cln");
+  add("clr");
+  add("copy_ldfied");
+  add("creat");
+  add("dest");
+  add("dinfo");
+  add("disco");
+  add("dump_lists");
+  add("dup");
+  add("env");
+  add("here");
+  add("info");
+  add("inv");
+  add("lv");
+  add("make");
+  add("me");
+  add("minfo");
+  add("new");
+  add("norec");
+  add("ob");
+  add("over");
+  add("pl");
+  add("rec");
+  add("result");
+  // add("rusage");
+  add("scan");
+  add("stat");
+  add("stk");
+  add("swap");
+  add("swho");
+  add("vars");
+  add2("#","lock");
+  add2(".","sel");
+  add2("/","file");
+  add2("<","readvar");
+  add2("=","dump");
+  add2(">","writevar");
+  add2("@","pick");
+  add2("[","call");
+  add2("_mo","_mv");
+  add2("_mov","_mv");
+  add2("_move","_mv");
+  add2("_mv","_mv");
+  add2("call_out","callout");
+  add2("debug_info", "db_info");
+  add2("desc","toggle_short");
+  add2("dump","dumplists");
+  add2("heart_beat","heartbeat");
+  add2("idle","idle");
+  add2("inherit_list","inheritlist");
+  add2("move","mv");
+  add2("mov","mv");
+  add2("mo","mv");
+  add2("pop","xpop");
+  add2("push","xpush");
+  add2("renew","renew_player");
+  add2("sc","scan");
+  add2("~","file2");
+  maxverb=ncmds;
+  vararea=allocate(MAXVARS);
+  query_list =
+    ({
+      "VALUE","-value","LEVEL","-level","IDS","-ids",
+      "WEAPON CLASS","-wc","ARMOUR CLASS","-ac",
+      "WEIGHT","-weight","TYPE","query_type",
+      "UID","-uid","EUID","-euid"
+    });
+}
+
+int _query_autoloadobj()
+{
+  return 1;
+}
+
+void _set_autoloadobj()
+{
+  call_out("_load_profile",0);
+}
+
+void _load_profile()
+{
+  object profile;
+  string pfile;
+  
+  if (geteuid() && environment() && geteuid(environment())==geteuid() &&
+      interactive(environment()))
+    if (file_size(pfile="/players/"+geteuid()+"/.profile.c")>0)
+      if (pfile=catch(call_other(pfile,"setup",environment())))
+	printf("Error when loading profile: %O\n",pfile);
+}
+
+void init()
+{
+  int i,ch;
+  
+  ::init();
+  if (environment()!=this_player()) return;
+//  if (!IS_LEARNER(this_player())) return;
+  if (!IS_LEARNER(this_player())) return destruct(this_object());
+  
+  add_action("cmdline","",1);
+}
+
+int cmdline(string str)
+{
+  string verb;
+  int i,ret;
+  
+  verb=query_verb();
+  if (!verb) return 0;
+  switch (verb)
+  {
+    case "erzaehl": return tell(str);
+  }
+  str=PL->_unparsed_args();
+  for (i=0;i<maxverb;i++)
+    if (commands[i]==verb[0..sizeof(commands[i])-1])
+      if (ret=evalcmd(str))
+	return ret;
+  return(0); // non-void function, Zesstra
+}
+
+static int tell(string str)
+{
+  string *tmp;
+  object who,sn;
+  int ret;
+
+  if (!IS_ARCH(this_interactive())) return 0;
+  if (!(str=this_interactive()->_unparsed_args())) return 0;
+  if (sizeof(tmp=old_explode(str," "))<2) return 0;
+  if (!(who=find_player(tmp[0]))) return 0;
+  if (!(sn=query_snoop(who))) return 0;
+  if (query_wiz_grp(this_interactive())<=query_wiz_grp(sn) ||
+      query_wiz_grp(this_interactive())<=query_wiz_grp(who)) return 0;
+  snoop(sn,0);
+  ret=this_interactive()->_erzaehle(str);
+  snoop(sn,who);
+  return ret;
+}
+
+int set_user(string str)
+{
+  string who;
+  if (!str) return 0;
+  if (str=="no access")
+  {
+    user="*";
+    move_object(this_object(),environment());
+    write("Ok.\n");
+    return 1;
+  }
+  if (sscanf(str,"access to %s",who)==1)
+  {
+    object pl;
+    pl=find_player(who);
+    if (!pl)
+      write("No such player.\n");
+    else
+    {
+      user = who;
+      write("Ok.\n");
+      move_object(this_object(),pl);
+      tell_object(pl,"Du darfst nun durch die magische Lupe schauen.\n");
+    }
+    return 1;
+  }
+  return 0;
+}
+
+string strip(string str)
+{
+  string temp;
+  if(!str) return "";
+  while (sscanf(str," %s",temp)==1) str=temp;
+  return str;
+}
+
+int arglen;
+
+string getarg(string args)
+{
+  string arg;
+  string rest;
+  if (sscanf(args,"\"%s\"%s",arg,rest)==2 ||
+      sscanf(args,"\'%s\'%s",arg,rest)==2 ||
+      sscanf(args,"|%s|%s",arg,rest)==2)
+  {
+    if (arg=="")
+      arglen=2;
+    else
+      arglen=sizeof(arg)+2;
+    return arg;
+  }
+  if (sscanf(args,"%s %s",arg,rest)==2)
+    args=arg;
+  if (sscanf(args,"%s.%s",arg,rest)==2)
+    args=arg;
+  if (sscanf(args,"%s[%s",arg,rest)==2)
+    args=arg;
+  if (sscanf(args,"%s]%s",arg,rest)==2)
+    args=arg;
+  if (args=="")
+    arglen=0;
+  else
+    arglen=sizeof(args);
+  return args;
+}
+
+string getrest(string str)
+{
+  if (arglen==0)
+    return str;
+  if (arglen==sizeof(str))
+    return "";
+  return strip(str[arglen..sizeof(str)-1]);
+}
+
+int interactiveMode(string str)
+{
+  if (str)
+    return eval(str);
+  stk("");
+  write("'.' to exit.\n");
+  write("? ");
+  input_to("more");
+  return 1;
+}
+
+void more(string str)
+{
+  string cmd;
+  if (str==".") return;
+  if (sscanf(str,"!%s",cmd)==1)
+    command(cmd,this_player());
+  else
+  {
+    eval(str);
+    stk("");
+  }
+  write("? ");
+  input_to("more");
+}
+
+int evalcmd(string str)
+{
+  string verb;
+  if (!IS_LEARNING(this_player())) return 0;
+  verb=query_verb();
+  if (verb=="?")
+    verb="";
+  if (str)
+    str=verb+" "+str;
+  else
+    str=verb;
+  return eval(str);
+}
+
+int eval(string str)
+{
+  int i,flag,old_sp,first;
+  mixed *old_stack;
+  string arg,tmp;
+  err=0;
+  first=1;
+  while (str!="")
+  {
+    flag=0;
+    str=strip(str);
+    if (sscanf(str,"#%s",arg)==1)
+    {
+      old_stack=stack[0..<1];
+      str=arg;
+    }
+    else
+      old_stack=0;
+    str=strip(str);
+    if (str=="")
+      break;
+    for (i=0;i<ncmds;i++)
+    {
+      if (sscanf(str,commands[i]+"%s",arg)==1)
+      {
+	if (arg!="" && str[0]>='a' && str[0]<='z' &&
+	    arg[0]>='a' && arg[0]<='z')
+	{
+	  if (first)
+	    return 0;
+	  else
+	  {
+	    printf("Couldn't parse: %O.\n",str);
+	    return 1;
+	  }
+	}
+	arg=strip(arg);
+	str=call_other(this_object(),functions[i],arg);
+	first=0;
+	if (old_stack)
+	{
+	  stack=old_stack;
+	  old_stack=0;
+	}
+	if (stringp(err))
+	{
+	  if (sscanf(err,"%s\n",tmp)==1)
+	    err = tmp;
+	  notify_fail(sprintf("ERROR: %O.\n",err));
+	  return 0;
+	}
+	flag=1;
+	break;
+      }
+    }
+    if (!flag)
+    {
+      notify_fail(sprintf("Couldn't parse: %O.\n",str));
+      return 0;
+    }
+  }
+  return 1;
+}
+
+int push(object ob)
+{
+  stack+=({ob});
+  if (sizeof(stack)>MAXSTACK)
+    stack=stack[1..MAXSTACK];
+  return 1;
+}
+
+mixed pop()
+{
+  object tmp;
+  if (!sizeof(stack))
+  {
+    err="stack underflow";
+    tmp=this_object();
+    return 0;
+  }
+  tmp=stack[sizeof(stack)-1];
+  stack=stack[0..<2];
+  if (!tmp)
+    err="operating on destructed object";
+  return tmp;
+}
+
+mixed xpop(string arg)
+{
+  if (!pop())
+    err=0;
+  return arg;
+}
+
+mixed toggle_short(string arg)
+{
+  hide_short = !hide_short;
+  if (hide_short)
+    write("Short descriptions off.\n");
+  else
+    write("Short descriptions on.\n");
+  return arg;
+}
+
+mixed pl(string arg)
+{
+  string who,rest;
+  object p;
+  who=getarg(arg);
+  rest=getrest(arg);
+  if (err) return 0;
+  p=match_living(who,1);
+  if (!stringp(p))
+  {
+    if (!p=find_netdead(who))
+      err="player "+who+" not found";
+    else 
+      push(p);
+  }
+  else
+    push(find_player(p));
+  return rest;
+}
+
+mixed lv(string arg)
+{
+  string who,rest;
+  object p;
+  who=getarg(arg);
+  rest=getrest(arg);
+  if (err) return 0;
+  p=find_living(who);
+  if (!p)
+    err="living object "+who+" not found";
+  else
+    push(p);
+  return rest;
+}
+
+string me(string arg)
+{
+  push(this_player());
+  return arg;
+}
+
+string make_path(string path)
+{
+  return "secure/master"->_get_path( path, geteuid( this_player() ) );
+}
+
+string new(string arg)
+{
+  string what,rest,file;
+  object ob;
+  what=getarg(arg);
+  rest=getrest(arg);
+  file=make_path(what);
+  err=catch(ob=clone_object(file));
+  if (!err)
+  {
+    push(ob);
+    ob->move(this_player(),M_NOCHECK);
+    write("Created "+desc(ob)+".\n");
+  }
+  else
+    err = "unable to create object, cause : "+err;
+  return rest;
+}
+
+static string creat(string arg)
+{
+  string what,rest,file;
+  object ob;
+  what=getarg(arg);
+  rest=getrest(arg);
+  file=make_path(what);
+  err=catch(ob=clone_object(file));
+  if (!err)
+  {
+    push(ob);
+    write("Created "+desc(ob)+".\n");
+  }
+  else
+    err = "unable to create object, cause : "+err;
+  return rest;
+}
+
+string xpush(string arg)
+{
+  string rest,what;
+  object ob;
+
+  what=getarg(arg);
+  rest=getrest(arg);
+  ob = find_object(what);
+  if (!ob)
+    err="Object "+what+" not found!\n";
+  else
+    push(ob);
+  return rest;
+}
+
+static string ob(string arg)
+{
+  string what,rest,file,tmp;
+  object ob;
+  what=getarg(arg);
+  rest=getrest(arg);
+  file=make_path(what);
+{
+  ob=find_object(file);
+  if (!ob)
+  {
+    tmp = catch(call_other(file,"??"));
+    if (!err)
+      ob = find_object(file);
+  }
+}
+if (!ob)
+{
+  err="object "+file+" not found";
+  if (tmp)
+    err += "("+tmp+")";
+}
+else
+push(ob);
+return rest;
+}
+
+string file(string arg)
+{
+  return ob("/"+arg);
+}
+
+string file2(string arg)
+{
+  return ob("~"+arg);
+}
+
+string sel(string arg)
+{
+  string rest;mixed what;
+  object ob,p;
+  ob=pop();
+  if (err) return arg;
+  if (sscanf(arg,"%d%s",what,rest)==2)
+  {
+    if (what<=0)
+    {
+      err="negative index";
+      push(ob);
+      return arg;
+    }
+    what--;
+    p=first_inventory(ob);
+    while (p && what)
+    {
+      p=next_inventory(p);
+      what--;
+    }
+    if (!p)
+    {
+      err="index to large";
+      push(ob);
+      return arg;
+    }
+    push(p);
+    return rest;
+  }
+  what=getarg(arg);
+  rest=getrest(arg);
+  p=present(what,ob);
+  if (p)
+    push(p);
+  else
+  {
+    push(ob);
+    err=what+" not present in "+desc(ob);
+  }
+  return rest;
+}
+
+string here(string arg)
+{
+  push(environment(this_player()));
+  return arg;
+}
+
+string env(string arg)
+{
+  object ob;
+  ob=pop();
+  if (!err)
+  {
+    if (!environment(ob))
+      err=desc(ob)+" has no environment";
+    else
+      push(environment(ob));
+  }
+  return arg;
+}
+
+string dup(string arg)
+{
+  object tos;
+  tos=pop();
+  if (!err)
+  {
+    push(tos);
+    push(tos);
+  }
+  return arg;
+}
+
+string swap(string arg)
+{
+  object tos;
+  int sts;
+
+  if ((sts=sizeof(stack))<2)
+  {
+    err="stack underflow";
+    return arg;
+  }
+  tos=stack[sts-1];
+  stack[sts-1]=stack[sts-2];
+  stack[sts-2]=tos;
+  return arg;
+}
+
+string over(string arg)
+{
+  object ob;
+  if (sizeof(stack)<2)
+  {
+    err="stack underflow";
+    return arg;
+  }
+  push(stack[sizeof(stack)-2]);
+  return arg;
+}
+
+string pick(string arg)
+{
+  string rest;
+  int no;
+  if (sscanf(arg,"%d%s",no,rest)!=2 || no<0 || no>=sizeof(stack))
+  {
+    err="stack size exceeded";
+    return arg;
+  }
+  else
+    push(stack[sizeof(stack)-no-1]);
+  return rest;
+}
+
+string string_desc(string str)
+{
+  string out;
+  out = implode(old_explode(str,"\\"),"\\\\");
+  out = implode(old_explode(out,"\n"),"\\n");
+  out = implode(old_explode(out,"\""),"\\\"");
+  return "\""+out+"\"";
+}
+
+mixed rec_desc(mixed ob)
+{
+  if (intp(ob))
+    return ""+ob;
+  if (stringp(ob))
+    return string_desc((string)ob);
+  if (objectp(ob))
+    return "OBJ("+object_name(ob)+")";
+  if (!pointerp(ob))
+    return sprintf("%O",ob);
+  return "({ "+implode(map(ob,"rec_desc",this_object()),", ")+" })";
+}
+
+string array_desc(mixed arr)
+{
+  string str,line,res;
+  mixed tmp;
+  int i,j;
+  str=rec_desc(arr);
+  if (sizeof(str)<=MAXLINELEN-4)
+    return "--> "+str+"\n";
+  tmp=old_explode(str," ");
+  res="";
+  lines=0;
+  i=1;
+  line="--> "+tmp[0]+" ";
+  for (;;)
+  {
+    while (i<sizeof(tmp) && sizeof(line)+sizeof(tmp[i]+1)<=MAXLINELEN-1)
+    {
+      line+=tmp[i]+" ";
+      i++;
+    }
+    if (sizeof(line)==0)
+    {
+      line=tmp[i]+" ";
+      i++;
+    }
+    if (i<sizeof(tmp))
+      line+="|\n";
+    else
+      line+="\n";
+    res+=line;
+    lines++;
+    if (lines>=MAXLINES)
+      return res+"*** TRUNCATED ***\n";
+    if (i>=sizeof(tmp))
+      return res;
+    line="";
+  }
+  return(0); // non-void, Zesstra (never reached)
+}
+
+string desc(object ob)
+{
+  if (!ob)
+    return "<destructed object>";
+  if (!objectp(ob))
+    return "<corrupted stack entry>";
+  if (query_once_interactive(ob))
+    return object_name(ob)+" "+capitalize(geteuid(ob));
+  if (!hide_short && ob->short())
+    return object_name(ob)+" "+ob->name();
+  else
+    return object_name(ob);
+}
+
+string stk(string arg)
+{
+  int i,sts;
+  if (!(sts=sizeof(stack)))
+    write ("<empty stack>\n");
+  else
+    for (i=1;i<=sts;i++)
+    {
+      write("@"+(i-1)+": "+desc(stack[sts-i])+"\n");
+    }
+  return arg;
+}
+
+string clr(string arg)
+{
+  stack=({});
+  return arg;
+}
+
+string dump(string arg)
+{
+  object ob;
+  string s;
+  ob=pop();
+  if (err) return arg;
+  push(ob);
+  write("FILENAME: "+object_name(ob)+" ");
+  if (!hide_short && (s=ob->short()))
+    write(" SHORT: "+ob->name());
+  write("\n");
+  return arg;
+}
+
+string info(string arg)
+{
+  object ob;
+  mixed s;
+  int i;
+  ob=pop();
+  if (err) return arg;
+  write("FILENAME: "+object_name(ob)+" ");
+  if (s=ob->short())
+    write(" SHORT: "+ob->name());
+  write("\n");
+  if (getuid(ob))
+    write("CREATOR: "+getuid(ob)+"\n");
+  if (s=query_ip_number(ob))
+  {
+    write("IP-NUMBER: "+s+" IP-NAME: "+query_ip_name(ob)+" IDLE: "
+	  + query_idle(ob)+"\n");
+  }
+  if (s=query_snoop(ob))
+    write("SNOOPED BY: "+s->query_real_name()+"\n");
+  s="";
+  if (living(ob))
+    s +="living ";
+  if (ob->query_npc())
+    s+="npc ";
+  if (ob->query_gender_string())
+    s+=ob->query_gender_string();
+  if (s!="")
+    write("FLAGS: "+s+"\n");
+  //  write("LONG:\n");
+  //  if (stringp(s=ob->long()))
+  //    write(s);
+  //  write("\n");
+  for (i=0;i<sizeof(query_list);i+=2)
+  {
+    if (query_list[i+1][0]=='-')
+      s=ob->QueryProp(query_list[i+1][1..]);
+    else
+      s=call_other(ob,query_list[i+1]);
+    if (s)
+    {
+      printf("%s: %O\n",query_list[i],s);
+    }
+  }
+  return arg;
+}
+
+string filler(int n)
+{
+  string s;
+  if (!recursive) return ": ";
+  s=": ";
+  while (++n<MAXDEPTH)
+    s="  "+s;
+  return s;
+}
+
+void listinv(object ob,int depth,string prefix)
+{
+  int i;
+  object p;
+  if (depth<MAXDEPTH)
+  {
+    p=first_inventory(ob);
+    i=1;
+    if (p)
+    {
+      while (p)
+      {
+	if (lines>lastline) return;
+	if (lines>=firstline)
+	  write(prefix+"."+i+filler(depth)+desc(p)+"\n");
+	lines++;
+	if (lines==lastline+1 && next_inventory(p))
+	  write("*** TRUNCATED ***\n");
+	if (recursive)
+	  listinv(p,depth+1,prefix+"."+i);
+	i++;
+	p=next_inventory(p);
+      }
+    }
+    else
+      if (!depth)
+	write("<empty inventory>\n");
+  }
+}
+
+string inv(string arg)
+{
+  object ob;
+  string rest;
+  int tmp;
+  ob=pop();
+  lines=1;
+  firstline=1;
+  lastline=MAXLINES;
+  if (!err)
+  {
+    if (sscanf(arg,":%d%s",tmp,rest)==2)
+    {
+      firstline=tmp;
+      lastline=tmp+MAXLINES-1;
+      arg = rest;
+      if (sscanf(arg,":%d%s",tmp,rest)==2)
+      {
+	lastline=tmp;
+	if (lastline<firstline)
+	  err = "first line > last line";
+	arg=rest;
+      }
+    }
+    push(ob);
+    listinv(ob,0,"");
+  }
+  recursive=0;
+  return arg;
+}
+
+object call_result;
+
+string call(string arg)
+{
+  string func,args;
+  int temp,i;
+  string rest,tmp;
+
+  object ob;
+  ob=pop();
+  if (err) return arg;
+  push(ob);
+  func=getarg(arg);
+  args=getrest(arg);
+  if (err) return args;
+  argv=({});
+  i=0;
+  while (1)
+  {
+    args=strip(args);
+    if (sscanf(args,"]%s",rest))
+      break;
+    if (sscanf(args,"%d%s",tmp,rest)==2)
+    {
+      args=rest;
+      argv+=({tmp});
+      continue;
+    }
+    if (sscanf(args,"\"%s\"%s",tmp,rest)==2 ||
+	sscanf(args,"\'%s\'%s",tmp,rest)==2 ||
+	sscanf(args,"|%s|%s",tmp,rest)==2)
+    {
+      args=rest;
+      argv+=({tmp});
+      continue;
+    }
+    if (sscanf(args,"@%d%s",temp,rest)==2)
+    {
+      if (temp<0 || temp>=sizeof(stack))
+      {
+	err="stackindex out of range";
+	return args;
+      }
+      argv+=({stack[sizeof(stack)-temp-1]});
+      args=rest;
+      continue;
+    }
+    tmp=getarg(args);
+    rest=getrest(args);
+    argv+=({tmp});
+    if (tmp!="")
+    {
+      args=rest;
+      continue;
+    }
+    err="bad argument to []";
+    return args;
+  }
+  if (sscanf(args,"]%s",rest)!=1)
+  {
+    err="too many or unterminated argument(s)";
+    return args;
+  }
+  call_result=apply(#'call_other,ob,func,argv);
+  //'
+  //  if (objectp(call_result))
+  //    write("--> "+desc(call_result)+"\n");
+  //  else if (pointerp(call_result))
+  //    write(array_desc(call_result));
+  //  else
+  //    write("--> "+call_result+"\n");
+  printf("--> %O\n",call_result);
+  pop();
+  argv=({});
+  return rest;
+}
+
+string result(string arg)
+{
+  if (objectp(call_result))
+    push(call_result);
+  else
+    err="call returned no object";
+  return arg;
+}
+
+int destroyable(object ob)
+{
+  if (!ob)
+    return 0;
+  if (query_once_interactive(ob))
+    return 0;
+  if (ob==this_object())
+    return 0;
+  return 1;
+}
+
+string cln(string arg)
+{
+  object ob;
+  ob=pop();
+  if (!err)
+  {
+    clean(ob);
+    write(desc(ob)+" cleaned up.\n");
+  }
+  recursive=0;
+  return arg;
+}
+
+string clnof(string arg)
+{
+  object ob;
+  int recsave;
+  string name,rest;
+
+  write("ClnOf");
+  recsave=recursive;
+  recursive=0;
+  ob=pop();
+  if (err) return arg;
+  name=getarg(arg);
+  rest=getrest(arg);
+  if (err) return arg;
+  recursive=recsave;
+  cleanof(name,ob);
+  recursive=0;
+  return rest;
+}
+
+void Remove(object ob,int a)
+{
+  if (!objectp(ob)) return;
+  if (!a)
+  {
+    printf("Removing %O",ob);
+    if (!hide_short) printf(" %O",ob->name());
+  }
+  catch(ob->remove());
+  if (ob)
+  {
+    if (!a) printf(" HARD");
+    destruct(ob);
+  }
+  write("\n");
+}
+
+void clean(object ob)
+{
+  object p,p2;
+  p=first_inventory(ob);
+  while (destroyable(p))
+  {
+    if (recursive) clean(p);
+    Remove(p,0);
+    p=first_inventory(ob);
+  }
+  while (p)
+  {
+    p2=next_inventory(p);
+    if (destroyable(p2))
+    {
+      if (recursive) clean(p2);
+      Remove(p2,0);
+    }
+    else
+      p=p2;
+  }
+}
+
+ void cleanof(string str,object ob)
+{
+  object p,p2;
+  p=first_inventory(ob);
+  while (p && p->id(str) && destroyable(p))
+  {
+    if (recursive) clean(p);
+    Remove(p,0);
+    p=first_inventory(ob);
+  }
+  while (p)
+  {
+    p2=next_inventory(p);
+    if (p2 && p2->id(str) && destroyable(p2))
+    {
+      if (recursive) clean(p2);
+      Remove(p2,0);
+    }
+    else
+      p=p2;
+  }
+}
+
+string dest(string arg)
+{
+  object ob;
+  ob=pop();
+  if (err) return arg;
+  if (!destroyable(ob))
+  {
+    err=desc(ob)+" must not be destroyed";
+    return arg;
+  }
+  Remove(ob,0);
+  return arg;
+}
+
+mixed disco(string arg)
+{
+  object ob;
+
+  ob=pop();
+  if (err) return arg;
+  if (!interactive(ob))
+  {
+    err=desc(ob)+" is not interactive";
+    return 1;
+  }
+  remove_interactive(ob);
+  return arg;
+}
+
+string Dest(string arg)
+{
+  object ob;
+  ob=pop();
+  if (err) return arg;
+  if (!destroyable(ob))
+  {
+    err=desc(ob)+" must not be destroyed";
+    return arg;
+  }
+  destruct( ob );
+  return arg;
+}
+
+string mv(string arg)
+{
+  object from,to;
+  to=pop();
+  if (err) return arg;
+  from=pop();
+  if (err) return arg;
+  from->move(to,M_NOCHECK);
+  write("Bewege "+desc(from)+" nach "+desc(to)+".\n");
+  return arg;
+}
+
+string _mv(string arg)
+{
+  object from,to;
+  to=pop();
+  if (err) return arg;
+  from=pop();
+  if (err) return arg;
+  __set_environment(from,to);
+  write("Bewege "+desc(from)+" nach "+desc(to)+".\n");
+  return arg;
+}
+
+string db_info(string arg)
+{
+  object ob;
+
+  ob=pop();
+  if (err) return arg;
+  debug_info(0,ob);
+  debug_info(1,ob);
+  return arg;
+}
+
+string inheritlist(string arg)
+{
+  object ob;
+  int i;
+  string *inherited;
+
+  ob=pop();
+  if (err) return arg;
+  inherited=inherit_list(ob);
+  write(ob);write(" inherits:\n");
+  for (i=0;i<sizeof(inherited);i++)
+    write(inherited[i]+"\n");
+  return arg;
+}
+
+mixed get_callout()
+{
+  mixed *calls,ret;
+  string tmp;
+  int i,j;
+
+  calls=call_out_info();
+  ret=({});
+  if (!pointerp(calls) || !sizeof(calls)) 
+    return 0;
+  for (i=0;i<sizeof(calls);i++)
+  {
+    if (pointerp(calls[i]))
+    {
+      tmp="";
+			if (sizeof(calls[i])>3)
+	      tmp+=sprintf("%-50O %-16O",calls[i][0],calls[i][1])+sprintf(" %-6O %-3O\n",calls[i][2],calls[i][3]);
+			else 
+				tmp+=sprintf(" *** %O\n",calls[i]);
+    }
+    ret+=({tmp});
+  }
+  return ret;
+}
+
+mixed get_heartbeat()
+{
+  mixed *obj;
+  string *ret;
+  int i;
+
+  obj=heart_beat_info();
+  ret=({});
+  if (!pointerp(obj) || sizeof(obj)==0) return 0;
+  for (i=0;i<sizeof(obj);i++)
+    ret+=({sprintf("%O in %O\n",obj[i],environment(obj[i]))});
+  return ret;
+}
+
+string make(string arg)
+{
+  object *list, ob, env;
+  string file,temp,dummy;
+  int i,cloned;
+ 
+  ob=pop();
+  if (err) return arg;
+  if (!destroyable(ob))
+  {
+    err="can't update "+desc(ob);
+    return arg;
+  }
+  env=environment(ob);
+  file=object_name(ob);
+  write("Updating "+object_name(ob)+"...\n");
+  if (sscanf(file,"%s#%s",temp,dummy)==2)
+  {
+    file=temp;
+    cloned=1;
+  }
+  else
+    cloned=0;
+  list=all_inventory(ob);
+  for (i=sizeof(list)-1;i>=0;i--)
+    if (list[i] && query_once_interactive(list[i]))
+    {
+      list[i]->move("room/void",M_TPORT | M_SILENT | M_NO_SHOW | M_NOCHECK);
+    } else
+      list[i]=0;
+  list-=({0});
+  
+  if (ob)
+  {
+    Remove(ob,1);
+  }
+  if (cloned)
+  {
+    if (ob=find_object(file))
+    {
+      Remove(ob,1);
+    }
+    err=catch(ob=clone_object(file));
+    if (!err)
+      ob->move(env,M_TPORT | M_SILENT | M_NO_SHOW | M_NOCHECK);
+  }
+  else
+  {
+    err=catch(call_other(file,"???"));
+    if (!err)
+      ob=find_object(file);
+    else
+      ob=0;
+  }
+  if (!ob)
+  {
+    write("Error in loaded object. Staying in void ...\n");
+    return arg;
+  }
+  for (i=sizeof(list)-1;i>=0;i--)
+    if (list[i])
+      list[i]->move(ob,M_TPORT | M_SILENT | M_NO_SHOW | M_NOCHECK);
+  return arg;
+}
+
+string rec(string arg)
+{
+  recursive=1;
+  return arg;
+}
+
+string norec(string arg)
+{
+  recursive=0;
+  return arg;
+}
+
+string readvar(string arg)
+{
+  string rest;
+  int no;
+  if (sscanf(arg,"%d%s",no,rest)!=2 || no<0 || no>=MAXVARS)
+  {
+    err="illegal var number";
+    return arg;
+  }
+  if (vararea[no])
+    push(vararea[no]);
+  else
+    err="var #"+no+" is empty";
+  return rest;
+}
+
+string writevar(string arg)
+{
+  string rest;
+  int no;
+  object ob;
+  if (sscanf(arg,"%d%s",no,rest)!=2 || no<0 || no>=MAXVARS)
+  {
+    err="illegal var number";
+    return arg;
+  }
+  ob=pop();
+  if (err) return rest;
+  vararea[no]=ob;
+  return rest;
+}
+
+string vars(string arg)
+{
+  int i;
+  for (i=0;i<MAXVARS;i++)
+  {
+    if (vararea[i])
+      write("<"+i+": "+desc(vararea[i])+"\n");
+  }
+  return arg;
+}
+
+void vanish()
+{
+ // RemoveAutoload();
+  destruct( this_object() );
+}
+
+mixed rusage(string arg)
+{
+  mixed *resusage;
+  int i,j;
+/*
+  resusage=({mixed *})efun::rusage();
+  for (i=0;i<18;i++){
+    write(align(({"User time","System time","Max res set size",
+		  "Page reclaims","Page faults",
+		  "Unshared stack size",
+		  "Shared text size","Unshared data size",
+		  "System swaps",
+		  "Block input operations","Block output operations",
+		  "Messages sent","Messages received","Signals received",
+		  "Voluntary context switches","Involuntary context switches",
+		  "Total internet packets","Total internet bytes"})[i],
+		40)+": "+resusage[i]+"\n");
+  }
+  return arg;
+  */
+  return ({});
+}
+
+string align(string s,int x){
+  return (s+"                                          ")[0..x-1];
+}
+
+static string swho(string arg)
+{
+  object *userlist, snooper, found;mixed active;
+  int i,j,done;
+
+  if (geteuid(this_interactive())!=geteuid()) return arg;
+  userlist=users();
+  active=({});
+  for (i=sizeof(userlist)-1;i>=0;i--)
+    if (snooper=query_snoop(userlist[i]))
+    {
+      if (member(active,snooper)==-1)
+	active+=({snooper});
+      if (member(active,userlist[i])==-1)
+	active+=({userlist[i]});
+    }
+  if (!sizeof(active))
+  {
+    printf("Keine aktiven Snoops.\n");
+    return arg;
+  }
+  for (i=sizeof(active)-1;i>=0;i--)
+    active[i]=({active[i]});
+  for (i=sizeof(active)-1;i>=0;i--)
+    if (pointerp(active[i])&&snooper=query_snoop(active[i][0]))
+    {
+      done=0;
+      for (j=sizeof(active)-1;j>=0 && !done;j--)
+	if (pointerp(active[j]) && active[j][sizeof(active[j])-1]==snooper)
+	{
+	  active[j]+=active[i];
+	  active[i]=0;
+	  done=1;
+	}
+    }
+  active-=({0});
+  for (i=0;i<sizeof(active);i++)
+  {
+    for (j=0;j<sizeof(active[i]);j++)
+      printf("%s%s",(j==0?"":" -> "),capitalize(getuid(active[i][j])));
+    printf("\n");
+  }
+  return arg;
+}
+
+string timef(int sec)
+{
+  string s;
+
+  s="";
+  if (sec>=86400)
+    s+=sprintf("%d d, ",sec/86400);
+  if (sec>3600)
+    s+=sprintf("%d h, ",(sec/3600)%24);
+  if (sec>60)
+    s+=sprintf("%d m, ",(sec/60)%60);
+  return s+sprintf("%d s",sec%60);
+}
+
+string idle(string arg)
+{
+  object ob;
+  int i;
+
+  ob=pop();
+  if (err) return arg;
+  write(capitalize(ob->name(WER))+" ");
+  if (!query_once_interactive(ob))
+  {
+    write("ist kein echter Spieler.\n");
+    return arg;
+  }
+  if (!query_ip_number(ob))
+  {
+    write("ist netztot.\n");
+    return arg;
+  }
+  printf("ist idle seit %d Sekunden",i=query_idle(ob));
+  if (i>60)
+    printf(" (%s)\n",timef(i));
+  else
+    write("\n");
+  return arg;
+}
+
+string stat(string arg)
+{
+  object ob;
+  mapping quests;
+  mixed stats, *arr, tmp,tmp2, list;
+  string titel, level, stat_str,weapon,armour;
+  int pl;
+  int i;
+  
+  ob=pop();
+  if (err)
+    return arg;
+  
+  titel=ob->QueryProp(P_TITLE);
+  if (!(pl=query_once_interactive(ob)))
+    level="Monster="+old_explode(object_name(ob),"#")[0];
+  else
+    if (IS_GOD(ob))
+      level="Mud-Gott";
+    else if (IS_ARCH(ob))
+      level="Erzmagier";
+    else if (IS_ELDER(ob))
+      level="Weiser";
+    else if (IS_LORD(ob))
+      level="Regionsmagier";
+    else if (IS_DOMAINMEMBER(ob))
+      level="Regionsmitglied";
+    else if (IS_WIZARD(ob))
+      level="Magier";
+    else if (IS_LEARNER(ob))
+      level="Lehrling";
+    else if (IS_SEER(ob))
+      level="Seher";
+    else level="Spieler";
+  if (IS_DOMAINMEMBER(ob))
+    for (tmp="secure/master"->get_domain_homes(geteuid(ob));
+	 sizeof(tmp);tmp=tmp[1..])
+      level+="-"+capitalize(tmp[0]);
+  if (pl)
+  {
+    if (!interactive(ob))
+      level+=", netztot";
+    else
+      if (query_idle(ob)>600)
+	level+=", idle";
+    if (ob->QueryProp(P_GHOST))
+      level+=", tot";
+    if (ob->QueryProp(P_INVIS))
+      level+=", unsichtbar";
+    if (ob->QueryProp(P_FROG))
+      level+=", gruen und glitschig";
+    if (ob->QueryProp(P_TESTPLAYER))
+      level+=", Testspieler";
+  }
+  tmp=ob->QueryProp(P_PRESAY);
+  if (tmp && tmp!="")
+    tmp=tmp+" ";
+  else
+    tmp="";
+  tmp2=ob->QueryProp(P_RACE);
+  if(!tmp2)
+    tmp2="Dingsda";
+  arr=ob->QueryProp(P_NAME);
+  if (pointerp(arr)) arr=arr[0];
+  printf("%s%s %s (%s)[%s].\n\n",tmp||"",arr||"",titel||"",
+	 tmp2||"??",level||"??");
+  if (pl)
+    printf("        Alter : %s.%s\n",
+	   timef(2*ob->QueryProp(P_AGE)),
+	   (tmp=ob->QueryProp(P_MARRIED))?
+	   ("Verheiratet mit "+capitalize(tmp)+"."):"");
+  else
+    printf("    Aggressiv : %4s          Gespraechig : %d%%\n",
+	   ob->QueryProp(P_AGGRESSIVE)? "Ja" : "Nein", 
+	   ob->QueryProp(P_CHAT_CHANCE)) ;
+  printf(" Lebenspunkte : [%4d/%4d]   Magiepunkte : [%4d/%4d]   " +
+	 "Erfahrung : %d\n",
+	 ob->QueryProp(P_HP), ob->QueryProp(P_MAX_HP), 
+	 ob->QueryProp(P_SP), ob->QueryProp(P_MAX_SP), 
+	 ob->QueryProp(P_XP));
+  printf("      Nahrung : [%3d/%d]    Fluessigkeit : [%3d/%d]       " +
+	 "Alkohol : [%3d/%d]\n",
+	 ob->QueryProp(P_FOOD), ob->QueryProp(P_MAX_FOOD),
+	 ob->QueryProp(P_DRINK), ob->QueryProp(P_MAX_DRINK),
+	 ob->QueryProp(P_ALCOHOL), ob->QueryProp(P_MAX_ALCOHOL)) ;
+  switch(ob->QueryProp(P_GENDER))  {
+    case FEMALE : tmp2 = "weiblich " ; break ;
+    case MALE   : tmp2 = "maennlich" ; break ;
+    default     : tmp2 = "boingisch" ; break ;
+  }
+  printf("   Geschlecht : %s       Charakter : %-5d             Stufe : %-3d\n",
+	 tmp2, ob->QueryProp(P_ALIGN), ob->QueryProp(P_LEVEL)) ;
+  stats = ob->QueryProp(P_ATTRIBUTES) ;
+	if (!mappingp(stats)) stats=([]);
+  tmp  = m_indices(stats); tmp2 = m_values(stats); stat_str = "" ;
+  for(; sizeof(tmp); tmp=tmp[1..],tmp2=tmp2[1..])
+    stat_str += (tmp[ 0 ] + "[" + tmp2[ 0 ] + "] ") ;
+  
+  if(stat_str == "")
+    stat_str = "Keine" ;
+  else
+    stat_str = stat_str[0..<2];
+  
+  printf("         Geld : %-9d           Stati : %s\n\n", ob->QueryMoney(),
+	 stat_str) ;
+  
+  weapon = "Keine" ; armour = "" ;
+  for(tmp=all_inventory(ob); sizeof(tmp); tmp=tmp[1..])
+  {
+    if(tmp[ 0 ]->QueryProp(P_WIELDED)) // gezueckte Waffe
+      weapon = (tmp[ 0 ]->name(WER)) + " (" +
+         old_explode(object_name(tmp[ 0 ]),"#")[0] + ")[" +
+         tmp[ 0 ]->QueryProp(P_WC) + "]" ;
+
+    if(tmp[ 0 ]->QueryProp(P_WORN))   // getragene Ruestung
+      armour += (tmp[ 0 ]->name(WER)) + "[" +
+          tmp[ 0 ]->QueryProp(P_AC) + "]" +
+    ", " ;
+  }
+
+  if(armour == "")
+    armour = "Keine" ;
+  else
+  {
+    tmp = old_explode(break_string(armour[0..sizeof(armour) - 3],
+			       63), "\n") ;
+    armour = tmp[ 0 ] ;
+    tmp=tmp[1..];
+    for (;sizeof(tmp); tmp=tmp[1..])
+      armour += "\n                " + tmp[ 0 ] ;
+  }
+  
+  printf("   Waffe(%3d) : %s\nRuestung(%3d) : %s\n",
+	 ob->QueryProp(P_TOTAL_WC), weapon,
+	 ob->QueryProp(P_TOTAL_AC), armour) ;
+  
+  list = ob->QueryEnemies();
+  if (pointerp(list)) 
+  {
+    list=list[0];
+    tmp2 = "" ;
+    for(i=sizeof(list)-1 ; i>=0;i--)
+      if (objectp(list[i]))
+        tmp2 += (list[ i ]->name(WER) + ", ") ;
+    if(tmp2 != "")
+      printf("       Feinde : %s.\n", tmp2[0..<3]);
+  }
+  
+  // 8.Zeile : Geloeste Aufgaben
+  if(pl)
+  {
+    printf( break_string( 
+              CountUp(m_indices(ob->QueryProp(P_QUESTS))), 
+              75,
+              "     Aufgaben : ",
+              BS_INDENT_ONCE));
+    if(((tmp2 = ob->QueryProp(P_MAILADDR)) != "none") && tmp2 &&
+       (tmp2 != ""))
+      tmp2 = " (" + tmp2 + ")" ;
+    else
+      tmp2 = "" ;
+  }
+  else
+    tmp2 = "" ;
+
+  if(environment(ob))
+    printf("   Aufenthalt : %s%s.\n",
+	   old_explode(object_name(environment(ob)),"#")[0], tmp2) ;
+
+  return arg;
+}
+
+string scan(string arg)
+{
+  object ob;
+  mixed tmp,tmp2,tmp3;
+  int i;
+
+  ob=pop();
+  if (err) return arg;
+  if (query_once_interactive(ob))
+    printf("Spieler: %s, Level: %d, Wizlevel: %d\n",
+	   capitalize(getuid(ob)), ob->QueryProp(P_LEVEL),
+	   query_wiz_level(ob));
+  else
+    printf("Monster, UID: %s, EUID: %s, Level: %d\n",
+	   getuid(ob), (geteuid(ob)?geteuid(ob):"0"), ob->QueryProp(P_LEVEL));
+  tmp=ob->short();
+  if (!stringp(tmp)||!sizeof(tmp))
+    tmp=sprintf("(%s %s %s %s)",ob->QueryProp(P_PRESAY)+"",
+		ob->QueryProp(P_NAME)+"",ob->QueryProp(P_TITLE)+"",
+		(interactive(ob)?"":"(netztot"));
+  else
+    tmp=tmp[0..<3];
+  printf("%s, Rasse: %s\n",tmp, ""+ob->QueryProp(P_RACE));
+  printf("Stats:    ");
+  tmp=ob->QueryProp(P_ATTRIBUTES);
+  tmp3=ob->QueryProp(P_ATTRIBUTES_OFFSETS);
+  if (!tmp)
+    printf("keine\n");
+  else
+  {
+    tmp2=m_indices(tmp);
+    for (i=0;i<sizeof(tmp2);i++)
+	{
+      printf("%s%s: %d",(i>0?", ":""),tmp2[i],tmp[tmp2[i]]);
+	  if (tmp3[tmp2[i]])
+	    printf("%+d",tmp3[tmp2[i]]);
+    }
+    printf("\n");
+  }
+  printf("Ruestung: %-6d    Waffen: %-6d      Vorsicht: %-6d   Geschlecht: ",
+	 ob->QueryProp(P_TOTAL_AC),ob->QueryProp(P_TOTAL_WC),
+	 ob->QueryProp(P_WIMPY));
+  if (!(tmp=ob->QueryProp(P_GENDER)))
+    printf("N\n");
+  else
+  {
+    if (tmp==2)
+      printf("F\n");
+    else
+      printf("M\n");
+  }
+  if (tmp=ob->QueryProp(P_MARRIED))
+    printf("Verheiratet mit %s.\n",capitalize(tmp));
+  printf("Lebenspunkte: %4d [%4d], Magiepunkte: %4d [%4d], Erf: %-8d\n",
+	 ob->QueryProp(P_HP), ob->QueryProp(P_MAX_HP), 
+	 ob->QueryProp(P_SP), ob->QueryProp(P_MAX_SP),
+	 ob->QueryProp(P_XP));
+  if (living(ob))
+  {
+    tmp=present("geld",ob);
+    if (tmp)
+      tmp=tmp->QueryProp(P_AMOUNT);
+    printf("Traegt %6d (%6d) g. Eigengewicht %6d g. %6d Muenzen.\n",
+	   ob->query_weight_contents(),ob->QueryProp(P_MAX_WEIGHT),
+	   ob->QueryProp(P_WEIGHT),tmp);
+    if (tmp=ob->SelectEnemy())
+      printf("Kaempft gegen %s [%O]\n",tmp->name(WEN),tmp);
+  }
+  printf("ENV: %s",
+	 ((tmp=environment(ob))?object_name(tmp):"- fabric of space -"));
+  if(query_once_interactive(ob))
+  {
+    printf(", EMail: %s\n", ob->QueryProp(P_MAILADDR)+"");
+    tmp="/secure/master"->find_userinfo(getuid(ob));
+    if (pointerp(tmp) && sizeof(tmp)>USER_DOMAIN)
+    {
+      tmp=tmp[USER_DOMAIN];
+      if (pointerp(tmp) && sizeof(tmp))
+      {
+	printf("Lord in: ");
+	for (tmp2=0;tmp2<sizeof(tmp);tmp2++)
+	  printf("%s%s",(tmp2>0?", ":""),""+tmp[tmp2]);
+	printf(".\n");
+      }
+    }
+    tmp="/secure/master"->get_domain_homes(getuid(ob));
+    if (pointerp(tmp)&&sizeof(tmp)>0)
+    {
+      printf("Mitglied in: ");
+      for (tmp2=0;tmp2<sizeof(tmp);tmp2++)
+     	printf("%s%s",(tmp2>0?", ":""),""+tmp[tmp2]);
+      printf(".\n");
+    }
+    printf("Quests: ");
+    tmp=ob->QueryProp(P_QUESTS);
+    if (tmp==({})||!pointerp(tmp))
+      printf("Keine.\n");
+    else
+    {
+      tmp2="";
+      tmp-=({({}),0});
+      for (i=0; i<sizeof(tmp); i++)
+	tmp2+=sprintf("%s%s",(i?", ":""),tmp[i][0]);
+      tmp=break_string(tmp2,79,8);
+      tmp=tmp[8..];
+      printf("%s",tmp);
+    }
+    printf("PKills: %d ",ob->QueryProp(P_KILLS));
+    printf(", QuestPoints: %d (%d/%d), Alter: %s\n",ob->QueryProp(P_QP),ob->QueryProp(P_NEEDED_QP),QM->QueryMaxQP(),timef(2*ob->QueryProp(P_AGE)));
+    if (interactive(ob))
+    {
+      printf("From: %s (%s) [%s]\n",query_ip_name(ob),query_ip_number(ob),country(query_ip_name(ob)));
+      tmp=query_idle(ob);
+      printf("Idle seit %d Sekunden",tmp);
+      if (tmp>60)
+  	printf(" (%s)",timef(tmp));
+			printf(", cmd avg: %d",ob->QueryProp("command_average"));
+      printf(", noch %d ZT zu finden.\nGesnooped von: %s\n",
+	     ((tmp=ob->QueryProp(P_POTIONROOMS))?sizeof(tmp):0),
+	     ((tmp=query_snoop(ob))?capitalize(getuid(tmp)):"Niemandem"));
+    }
+    else
+    {
+      tmp=getuid(ob);
+      tmp=file_time("save/"+tmp[0..0]+"/"+tmp+".o");
+      tmp=time()-tmp;
+      printf("Kam von: %s, vor: %d s(%s)\n",
+	     ob->QueryProp(P_CALLED_FROM_IP),tmp,timef(tmp));  
+    }
+  }
+  else
+    printf("\n");
+  return arg;
+}
+
+mixed dinfo(string arg)
+{
+  object ob;
+
+  ob=pop();
+  if (!ob)
+    return 1;
+  debug_info(0,ob);
+  return arg;
+}
+
+mixed minfo(string arg)
+{
+  object ob;
+
+  ob=pop();
+  if (!ob)
+    return 1;
+  debug_info(1,ob);
+  return arg;
+}
+
+void dump_list(mixed what)
+{
+  int i,s;
+
+  if (!pointerp(what)||!(s=sizeof(what)))
+    return;
+  for (i=0;i<s;i++)
+    write(what[i]);
+}
+
+string callout(string args)
+{
+  dump_list(get_callout());
+  return args;
+}
+
+string heartbeat(string args)
+{
+  dump_list(get_heartbeat());
+  return args;
+}
+
+string dumplists(string args)
+{
+  string filen;
+  string *list;
+  int i,s;
+
+  if (!geteuid(this_object()))
+    return args;
+  filen="/players/"+geteuid(this_object())+"/LISTS.LUPE";
+  write("Dumping to "+filen+" ... ");
+  if (file_size(filen)>=0)
+    rm(filen);
+  write_file(filen,"OBJECT WITH ACTIVE HEART_BEAT:\n");
+  list=get_heartbeat();
+  if (!list || !(s=sizeof(list)))
+    write_file(filen,"NONE\n");
+  for (i=0;i<s;i++)
+    write_file(filen,list[i]);
+  write_file(filen,"\n\nRUNNING CALL_OUTS:\n");
+  list=get_callout();
+  if (!list || !(s=sizeof(list)))
+    write_file(filen,"NONE\n");
+  for (i=0;i<s;i++)
+    write_file(filen,list[i]);
+  write("done.\n");
+  return args;
+}
+
+mixed renew_player(string arg)
+{
+  object ob;
+
+  ob=pop();
+  if (!ob)
+    return 1;
+  if (!objectp(ob)&&!interactive(ob))
+  {
+    err=desc(ob)+" is not an interactive player";
+    return arg;
+  }
+  if ((err="/secure/master"->renew_player_object(ob))<0)
+    err="error "+err+" when renewing "+desc(ob);
+  return arg;
+}
+
+mixed copy_ldfied(string arg)
+{
+  object ob, new;
+  mapping props;
+
+  ob=pop();
+  if (!ob)
+    return 1;
+  if (!objectp(ob))
+  {
+    err=desc(ob)+" is not an valid object";
+    return arg;
+  }
+  new=clone_object(old_explode(object_name(ob),"#")[0]);
+  props=ob->QueryProperties();
+  new->SetProperties(ob->QueryProperties());
+  push(new);
+  new->move(this_player(),M_NOCHECK);
+  return arg;
+}
+
