diff --git a/obj/tools/teller/teller.c b/obj/tools/teller/teller.c
new file mode 100644
index 0000000..5f34f06
--- /dev/null
+++ b/obj/tools/teller/teller.c
@@ -0,0 +1,686 @@
+// ----------------------------------------------------------------------
+// Tellerstapel, ein Stackorientiertes magiertool.
+// Rumata 15.09.93
+// ----------------------------------------------------------------------
+#include "teller.h"
+inherit "std/secure_thing";
+inherit T_CMDS;
+inherit T_EFUN;
+inherit "std/more";
+
+#include "/secure/wizlevels.h"
+
+nosave mapping tcommands;
+nosave string owner_name;
+
+void logaccess( string s );
+static void do_msg( string s, object o );
+static string|int parseNext( string str, mixed auxstack, string funname );
+static mixed nextAlpha( string s );
+static varargs void restore_stack( string* argv, int args );
+static int do_call( string fun, int mit_return );
+static int do_call_efun( string fun, int mit_return );
+static int do_lpc( string str, int mit_return );
+static int do_cmd( string str );
+int error( string s );
+
+static void tAddCmd( mixed cmd )
+{
+	int i;
+
+	//if (find_player("rikus")) tell_object(find_player("rikus"),sprintf("%O\n",cmd));
+	if( !pointerp(cmd) )
+    m_add(tcommands, cmd, cmd);
+	else
+		for( i=0; i<sizeof(cmd); i++ )
+      m_add(tcommands, cmd[i], cmd[0]);
+}
+
+void create()
+{
+	if( IS_BLUE(ME) ) return;
+	if( !find_player(getuid()) ) return;
+	owner_name = find_player(getuid())->name(WESSEN,1);
+
+	secure_thing::create();
+	t_cmds::create();
+	SetProp( P_NAME, "Tellerstapel" );
+	SetProp( P_GENDER, MALE );
+	AddId( ({"teller","stapel","tellerstapel"}) );
+	SetProp( P_NODROP, "Wozu denn?\n" );
+	SetProp( P_NEVERDROP, 1 );
+	SetProp( P_READ_MSG, "Die Gravur besagt: 'Aus der Rumata-Manufaktur'\n" );
+	tcommands = ([]);
+	
+	tAddCmd( "say" );
+	tAddCmd( ({"names","nam"}) );
+	tAddCmd( "secureinv" );
+	tAddCmd( "logaccess" );
+	tAddCmd( "pretty" );
+	tAddCmd( "doprofile" );
+	tAddCmd( ({"clear","clr"}));
+	tAddCmd( "pop" );
+	tAddCmd( "dup" );
+	tAddCmd( "swap" );
+	tAddCmd( ({"evaluate","eval"}) );
+
+	tAddCmd( "here" );
+	tAddCmd( "me" );
+
+	tAddCmd( ({"memory","mem"}) );
+	tAddCmd( "dump" );
+	tAddCmd( "restore" );
+	tAddCmd( "top" );
+	tAddCmd( "wer" );
+	tAddCmd( ({"stack","stk"}) );
+	tAddCmd( ({"snoopers","snoop"}) );
+	tAddCmd( "callouts" );
+	tAddCmd( ({"callouts_bang","callouts!"}) );
+	tAddCmd( ({"heartbeats","beats"}) );
+	tAddCmd( "inv" );
+	tAddCmd( ({"rekinv","rinv"}) );
+	tAddCmd( "scan" );
+	tAddCmd( "if" );
+
+	tAddCmd( ({"array","arr"}) );
+	tAddCmd( ({"split","spl"}) );
+	tAddCmd( ({"player","pl"}) );
+	tAddCmd( ({"living","lv"}) );
+	tAddCmd( ({"object","ob"}) );
+
+	tAddCmd( ({"debuginfo","dinfo"}) );
+	tAddCmd( ({"clone","cln"}) );
+	tAddCmd( ({"update","upd"}) );
+	tAddCmd( ({"update_bang","update!","upd!"}) );
+	tAddCmd( ({"move","mv"}) );
+	tAddCmd( ({"destruct","dest","des"}) );
+	tAddCmd( ({"remove","rem"}) );
+	tAddCmd( ({"destruct_bang","destruct!","dest!","des!","remove!","rem!"}) );
+	tAddCmd( ({"roomupdate","rupdate","rupd","rup"}) );
+	tAddCmd( ({"roomupdate_bang","roomupdate!","rupdate!","rupd!","rup!"}) );
+	tAddCmd( ({"extroomupdate","rupdate*","rupd*","rup*"}) );
+	tAddCmd( ({"extroomupdate_bang","roomupdate*!","rupdate*!","rupd*!","rup*!",
+		"rup!*" }) );
+	tAddCmd( ({"cleanof","clnof"}) );
+	tAddCmd( ({"cleanof_bang","cleanof!","clnof!"}) );
+
+	tAddCmd( "ping" );
+}
+
+void init()
+{
+	//logaccess( "init" );
+	::init();
+	if ( !IS_WIZARD(PL) || environment()!=PL )
+		return;
+	add_action( "parse", ",", 1 );
+	add_action( "jonglier", "jonglier", 1 );
+	add_action( "message", "message" );
+	add_action( "message", "msg" );
+}
+
+short()
+{
+	logaccess( "short" );
+	return "Ein Stapel Teller.\n";
+}
+
+id( str )
+{
+	logaccess( "id" );
+	return ::id(str);
+}
+
+name( casus, dem, force )
+{
+	logaccess( "name" );
+	return ::name( casus, dem, force );
+}
+
+long()
+{
+	string answer;
+	
+	answer =
+		 "Du betrachtest "+owner_name+" magischen Tellerstapel. Die einzelnen Teller sind\n"
+		+"bis auf eine kleine Inschrift auf dem Boden weiss. Wenn Du hiermit\n"
+		+"jonglierst, kann ALLES passieren.\n";
+
+	if( getuid(PL) == getuid() )
+	{
+		answer +=
+			( mit_say
+				? "Die Teller sind beim Jonglieren sichtbar.\n"
+				: "Die Teller sind beim Jonglieren unsichtbar.\n"
+			) + ( mit_namen
+				? "Die Teller nennen die Dinge beim Namen.\n"
+				: "Die Teller nennen die Dinge beim Filenamen.\n"
+			) + ( pretty
+				? "Die Teller haben ein verschnoerkeltes Muster.\n"
+				: "Die Teller sind geradezu schmucklos.\n"
+			) + ( dologaccess
+				? "Die Teller spueren Zugriffe.\n"
+				: ""
+			) + ( secureinv
+				? "Die Teller bewachen Dein Inventar.\n"
+				: ""
+			) + ( do_profile
+				? "Die Teller werden beim Einloggen aktiv.\n"
+				: ""
+			);
+	} 
+	return answer; 	
+}
+
+void _set_autoloadobj( mixed val )
+{
+	if( !pointerp(val) ) return;
+	val += ({ 0,0,0,0,0,0 });
+	mit_namen = val[0];
+	mit_say = val[1];	
+	set_heart_beat( secureinv = val[2] );
+	dologaccess = val[3];
+	pretty = val[4];
+	do_profile = val[5];
+	if( do_profile ) call_out( "_load_profile", 0, this_player() );
+}
+
+mixed _query_autoloadobj()
+{
+	return ({ mit_namen, mit_say, secureinv, dologaccess, pretty,
+		do_profile });
+}
+
+void _load_profile( object pl )
+{
+	string pf,errmsg;
+
+	if( geteuid() && pl && geteuid(pl)==geteuid()
+		&& file_size(pf="/players/"+geteuid()+"/.profile.c")>0
+		&& (errmsg=catch(call_other(pf,"setup",pl)))
+	)
+		printf( "Error loading profile: %O\n", errmsg );
+}
+
+void logaccess( string str )
+{
+	if( RPL && dologaccess && getuid()!=getuid(RPL) && find_player(getuid())
+		&& previous_object() && getuid(previous_object()) != ROOTID
+		&& query_wiz_level(getuid())>=query_wiz_level(getuid(RPL))
+	)
+		tell_object( find_player(getuid()), "MEMO: " + str + "() von "
+			+ RPL->name(WEM) + " via ["
+			+ object_name(previous_object())+"].\n"
+		);
+	if( secureinv && find_player(getuid()) && !member(heart_beat_info(),ME) )
+	{
+		tell_object( find_player(getuid()), "MEMO: heart_beat restartet!.\n" );
+		set_heart_beat(TRUE);
+	}
+}
+
+// ----------------------------------------------------------------------
+// Hilfe-Funktionen
+// ----------------------------------------------------------------------
+static int secure()
+{
+	int i;
+	if( process_call() || secure_level()<query_wiz_level(RPL) ) return 0;
+	for( i=0; previous_object(i)==RPL; i++ )
+		;
+	return (!previous_object(i) || previous_object()==ME)
+		 && getuid()==getuid(RPL) && IS_WIZARD(RPL);
+}
+
+int jonglier( string str )
+{
+	string arg;
+
+	logaccess( "jongliere" );
+	if( !str || id(str) || sscanf( str, "mit %s", arg ) == 1 )
+	{
+		if( !secure() )
+			write(
+				"Dieser Tellerstapel ist nichts fuer Dich. Suche Dir einen eigenen.\n"
+			);
+		else
+			write(
+			  "Der Jonglierbefehl lautet \";\" oder \",\".\n"
+			+	"\";hilfe <befehl>\" gibt Dir Hilfestellung.\n"
+			);
+		return TRUE;
+	}
+  return 0;
+}
+			
+static int zeige_hilfe( string str )
+{
+	if( !stringp(str) ) str = "general";
+	str = implode( old_explode( HELP(str), "/../" ), "/" );
+	if( file_size(str) > 0 )
+	{
+		More( str, 1 );
+		return TRUE;
+	}
+	write( "Zu diesem Thema gibt es keine Hilfe.\n" );
+	return TRUE;
+}
+
+int message( string str )
+{
+	string pl;
+	object dest;
+
+	if( !secure() ) return FALSE;
+
+	if( str )
+	{
+		if( sscanf( str, "to %s", pl ) == 1 )
+			str = pl;
+		if( !(dest = find_player(str) ) )
+		{
+			write( capitalize(str) + " ist nicht eingeloggt.\n" );
+			return TRUE;
+		}
+	}
+	else
+		dest = 0;
+
+	do_msg( "<Mitteilung von "+PL->name(WEM)+">", dest );
+	write( "Mitteilung"
+		+ ( dest ? " an " + dest->name(WEN) : "" )
+		+ " kann mit '**' beendet werden.\n" );
+
+	input_to( "more_message", 0, dest );
+	return TRUE;
+}
+
+static void do_msg( string str, object obj )
+{
+	if( obj )
+		tell_object( obj, str + "\n" );
+	else
+		say( str + "\n" );
+}
+
+static int more_message( string str, object obj )
+{
+	if( str != "**" )
+	{
+		do_msg( str, obj );
+		input_to( "more_message", 0, obj );
+	}
+	else
+		do_msg( "<Ende der Mitteilung>", obj );
+	return TRUE;
+}
+
+// ----------------------------------------------------------------------
+// Parse-Funktionen
+// ----------------------------------------------------------------------
+int parse( string str )
+{
+	int i;
+	string arg, rest;
+
+	if( !secure() ) return FALSE;
+
+	// Die Hilfe faellt aus der allgemeinen Syntax heraus !
+	if( query_verb()[1..] == "hilfe" || query_verb()[1..] == "help" )
+		return zeige_hilfe( str );
+
+	if( str=this_player()->_unparsed_args() )
+		str = query_verb()[1..]+" "+str;
+	else
+		str = query_verb()[1..];
+
+	fehler_passiert = FALSE;
+	while( !fehler_passiert && str && str!="" )
+		str = parseNext( str, ({}), "-ROOT-" );
+
+	if( mit_say && !PL->QueryProp(P_INVIS) )
+	{
+		if( !fehler_passiert )
+			say( PL->name(WER)+" jongliert mit "
+				+ PL->QPP(MALE,WEM,PLURAL)+" Tellern.\n" );
+		else
+			say( PL->name(WEM)+" faellt beim Jonglieren ein Teller herunter.\n" );
+	}
+	if( !fehler_passiert )
+		write( "OK.\n" );
+	return TRUE;
+}
+
+static string|int parseNext( string str, mixed auxstack, string funname )
+{
+	mixed *res;
+	string arg, rest;
+	bool mit_return;
+	int num;
+
+	while( str!="" && str[0]==' ' )
+		str = str[1..];
+	if( str=="" )
+		return FALSE;
+
+	switch( str[0] )
+	{
+		case ';': // ---------------------------------------- Kommandobeginn
+		case ',':
+			push( ";" );
+			return str[1..];
+		case '\"': // --------------------------------------- Stringkonstante
+			if( sscanf( str, "\"%s\"%s", arg, rest )==2 )
+			{
+				/* test auf numerisch fehlt hier noch */
+				push_str( arg );
+				return rest;
+			}
+			if( !sscanf( str, "\"%s\"", arg ) )
+				return error( "String ohne Ende" );
+			push_str( arg );
+			return FALSE;
+		case '#': // ---------------------------------------- Zahl
+			res = nextAlpha( str[1..] );
+			if( sscanf( res[0], "%d", num ) == 1 )
+			{
+				push( num );
+				return res[1];
+			}
+			return error( "'#': keine erlaubte Zahl" );
+		case '^': // ---------------------------------------- Hole env
+			if( !becomes_obj() )
+				return error( "'^': TOS ist kein Objekt" );
+			if( !environment(top()) )
+				return error( "'^': TOS hat kein Environment" );
+			push(environment(pop()));
+			return str[1..];
+		case '.': // ---------------------------------------- Hole aus inv
+			if( !becomes_obj() )
+				return error( "'.': TOS ist kein Objekt" );
+			res = nextAlpha( str[1..] );
+			calcinv( res[0] );
+			return res[1];
+		case '<': // ---------------------------------------- Recall
+			if( !sscanf( str, "<%s", arg ) || arg=="" )
+				return error( "'<': Variablenname fehlt" );
+			res = nextAlpha( str[1..] );
+			do_recall(res[0]);
+			return res[1];
+		case '>': // ---------------------------------------- Store
+			if( !sscanf( str, ">%s", arg ) || arg=="" )
+				return error( "'>': Variablenname fehlt" );
+			res = nextAlpha( str[1..] );
+			do_store(res[0]);
+			return res[1];
+		case '-': // ---------------------------------------- Call mit '-'
+			str = str[1..];
+			if( mit_return = (str[0] == '-') )
+				str = str[1..];
+			res = nextAlpha( str[1..] );
+			switch( str[0] )
+			{
+				case '>':
+					if( do_call( res[0], mit_return ) )
+						return res[1];
+					break;
+				case '*':
+					if( do_call_efun( res[0], mit_return ) )
+						return res[1];
+					break;
+				default:
+					return error( "'-': '>' oder '*' erwartet" );
+			}
+			return FALSE;
+		case '\'': // --------------------------------------- Call
+			str = str[1..];
+			if( mit_return = (str[0] == '\'') )
+				str = str[1..];
+			res = nextAlpha( str );
+			if( do_call( res[0], mit_return ) )
+				return res[1];
+			return FALSE;
+		case '`': // --------------------------------------- Call Efun
+			str = str[1..];
+			if( mit_return = (str[0] == '`') )
+				str = str[1..];
+			res = nextAlpha( str );
+			if( do_call_efun( res[0], mit_return ) )
+				return res[1];
+			return FALSE;
+		case '@': // --------------------------------------- Evaluate
+			str = str[1..];
+			if( mit_return = (str[0] == '@') )
+				str = str[1..];
+			if( do_lpc( str, mit_return ) )
+				return FALSE;
+			return FALSE;
+		case '!': // ------------------------------------------- META
+			if( sscanf(str,"!%d%s",num,arg)==2 )
+			{
+				if( num>=sizeof(auxstack) )
+					return error( "'"+funname+"': zu weing Argumente" );
+				push( auxstack[num] );
+			}
+			else
+			{
+				res = nextAlpha( str[1..] );
+				memory += ([ res[0]: res[1]; 1 ]);
+				return FALSE;
+			}
+			return arg;
+		default: // ----------------------------------------- default
+			res = nextAlpha( str );
+			do_cmd(res[0]);
+			return res[1];
+	}
+	return memo( "Etwas Seltsames ist passiert" );
+}
+
+static int do_cmd( string str )
+{
+	string fun, filename, *spl;
+	mixed* oldstack;
+	int i,max,num;
+
+	if( member(memory,str) )
+	{
+		fun = memory[str,0];
+		if( !memory[str,1] ) // normale Variablen
+		{
+			push( fun );
+			return TRUE;
+		}
+		oldstack = stack;
+		stack = ({});
+		spl = regexplode( fun, "![0-9][0-9]*" );
+		max = -1;
+		for( i=1; i<sizeof(spl); i+=2 )
+			if( sscanf(spl[i],"!%d",num) && max<num ) max = num;
+
+		while( !fehler_passiert && fun && fun!="" )
+			fun = parseNext( fun, oldstack, str );
+		if( fehler_passiert )
+		{
+			stack = oldstack;
+			return FALSE;
+		}
+		stack = stack + oldstack[(max+1)..];
+		return TRUE;
+	}
+  else if (fun=tcommands[str])
+		return call_other(ME,"cmd_"+fun);
+
+	if( sscanf( str, "%d", i ) )
+		push( i );
+	else
+	{
+		filename = MASTER->_get_path(str,getuid());
+		if( filename[<1] == '.' )
+			filename = filename[0..<2];
+		if( file_size( filename+".c" ) != -1 )
+			push( filename );
+		else
+			push( str );
+	}
+	return TRUE;
+}
+
+static mixed nextAlpha( string str )
+{
+	int pos;
+
+	for( 
+		pos=0;
+		pos<sizeof(str) && member( " #\";,^.><", str[pos] ) == -1;
+		pos++
+	)
+		;
+
+	if( pos==sizeof(str) )
+		return ({ str, 0 });
+	else
+		return ({ str[0..pos-1], str[pos..] });
+}
+
+static varargs void restore_stack( string* argv, int args )
+{
+	int i;
+	if( !args )
+		args = sizeof(argv);
+	if( sizeof(stack) ) push( ";" );
+	for( i=0; i<args; i++ )
+		push(argv[i]);
+}
+
+static int do_call( string fun, int mit_return )
+{
+	int args;
+	string err;
+	mixed result;
+	mixed arg, *argv;
+
+	argv = ({});
+	while( sizeof(stack) && (arg=pop())!=";" )
+		argv = ({arg}) + argv;
+	if( !becomes_obj(argv) )
+	{
+		restore_stack( argv );
+		return error( "call: Funktion nicht an Objekt gerichtet" );
+	}
+	if( !function_exists(fun,argv[0]) )
+	{
+		restore_stack(argv);
+		return error( "call: Funktion nicht gefunden" );
+	}
+
+	args = sizeof(argv);
+	argv += ({ 0,0,0,0,0 });
+	err=(catch(result=call_other(argv[0],fun,
+		argv[1],argv[2],argv[3],argv[4],argv[5])));
+	if( err )
+	{
+		restore_stack( argv, args );
+		return error( "call: "+err[1..<2] );
+	}
+	else
+	{
+		write( "=> " );
+		dump_obj( result, 3 );
+		if( mit_return )
+			push( result );
+	}
+	return TRUE;
+}
+
+static int do_call_efun( string fun, int mit_return )
+{
+	int args;
+	string err;
+	mixed result;
+	mixed arg, *argv;
+
+	argv = ({});
+	while( sizeof(stack) && (arg=pop())!=";" )
+		argv = ({arg}) + argv;
+
+	if( !function_exists( "efun_"+fun ) )
+		return error( "call efun: \""+fun+"\" nicht benutzbar" );
+	fun = "efun_"+fun;
+
+	args = sizeof(argv);
+	argv += ({ 0,0,0,0,0 });
+	err=(catch(result=call_other(ME,fun,
+			argv[0],argv[1],argv[2],argv[3],argv[4])));
+	if( err )
+	{
+		restore_stack( argv, args );
+		return error( "call efun: "+err[1..<2] );
+	}
+	else
+	{
+		write( "=> " );
+		dump_obj( result, 3 );
+		if( mit_return )
+			push( result );
+	}
+	return TRUE;
+}
+
+static int do_lpc( string str, int mit_return )
+{
+	int args, val;
+	string err;
+	string file, cmd, pre, post;
+	mixed result;
+	mixed arg, *argv;
+
+	argv = ({});
+	while( sizeof(stack) && (arg=pop())!=";" )
+		argv = argv + ({arg});
+
+	file = "/players/"+getuid()+"/.teller";
+	cmd = "#include <language.h>\n#include <properties.h>\n"
+		+ "#include <moving.h>\n#include <defines.h>\n#include <terminal.h>\n"
+		+ "#include <wizlevels.h>\n#include <ansi.h>\ncreate(){}doit(){";
+
+	while( str!="" && sscanf( str, "%s@%s", pre, post ) == 2 )
+	{
+		if( sscanf( str, "%s@%d@%s", pre, val, post ) == 3 )
+		{
+			if( sizeof(argv)<=val || val<0 )
+			{
+				restore_stack( argv, args );
+				return error( "lpc: Illegaler Index auf den Stack" );
+			}
+			cmd += pre + DumpObj(argv[val]);
+			str = post;
+		}
+		else
+			if( sscanf( str, "%s@%s", pre, post ) == 2 )
+			{
+				cmd += pre + "@";
+				str = post;
+			}
+	}
+	cmd += str;
+	rm( file+".c" );
+	write_file( file+".c" , cmd+";}\n" );
+	if( find_object(file) ) destruct( find_object(file) );
+	err=(catch(result=call_other(file,"doit")));
+	if( err )
+	{
+		//rm( file+".c" );
+		restore_stack( argv, args );
+		return error( "lpc: "+err[1..<2] );
+	}
+	else
+	{
+		//rm( file+".c" );
+		write( "=> " );
+		dump_obj( result, 3 );
+		if( mit_return )
+			push( result );
+	}
+	return TRUE;
+}
