diff --git a/obj/tools/lisp/knete.c b/obj/tools/lisp/knete.c
new file mode 100644
index 0000000..1dc1432
--- /dev/null
+++ b/obj/tools/lisp/knete.c
@@ -0,0 +1,190 @@
+// KNETE.C -- CommandLine Frontend to the Lisp2Closure compiler
+// (c) 1994 by Hate@MorgenGrauen, TUBmud, NightFall
+// --
+// Copy, change and distribute this bit of software as much as you like,
+// but keep the name of the original author in the header.
+
+#include "tweak.h"
+
+static inherit HOME("lisp");
+
+#ifdef ALATIA
+#  define TUBMUD
+#endif
+// TUBMUD is a COMPAT mode game! (well sort of, its a NATIVE/COMPAT mixture)
+// the following defines should be the only ones to change
+// define ENGLISH if you don't want german messages ;)
+#if (defined(TUBMUD) || defined(TAPPMUD) || defined(UNItopia) || \
+     defined(ADAMANT))
+# ifdef ADAMANT
+#   include <config.h>
+    inherit "/lib/obj";
+#   define WIZLOCAL "/wiz/"
+#   define ID(x)        set_name(x)
+#   define SHORT(x)     set_short(x)
+#   define LONG(x)      set_long(x)
+#   define ISWIZARD(pl) (LEVELMASTER->is_wizard(pl->query_real_name()))
+# endif
+# ifdef TUBMUD
+#   include <kernel.h>
+#   include <wizlevels.h>
+    inherit ACCESS;
+    inherit "/complex/item";
+    inherit "/basic/autoload";
+#   define WIZLOCAL "/players/"
+#   define ID(x)        add_id(x)
+#   define ISWIZARD(pl) (pl->query_level() >= WL_WIZARD)
+# endif
+# ifdef TAPPMUD
+#   include <levels.h>
+    inherit "/obj/thing";
+#   define WIZLOCAL "/w/"
+#   define ID(x)        set_alias(x)
+#   define ISWIZARD(pl) (pl->query_level() >= LVL_WIZARD)
+# endif
+# define ENGLISH
+# ifdef UNItopia
+#   undef ENGLISH
+#   ifdef FinalFrontier
+#     include <level.h>
+#   else
+#     include <levels.h>
+#   endif
+    inherit "/i/item";
+    inherit "/i/install";
+#   define WIZLOCAL "/w/"
+#   define ID(x)        add_id(x)
+#   define ISWIZARD(pl) wizp(pl)
+# endif
+# define WIZHOME        (WIZLOCAL+this_player()->query_real_name())
+# define LONG(x)        set_long(x)
+# define SHORT(x)       set_short(x)
+#else
+  inherit "/std/thing";
+# ifdef NIGHTFALL
+#   define ENGLISH
+# endif
+# include <properties.h>
+# include <wizlevels.h>
+# define WIZHOME        ("/players/"+getuid(this_object()))
+# define ID(x)          AddId(x); SetProp(P_NAME, x)
+# define LONG(x)        SetProp(P_LONG, x)
+# define SHORT(x)       SetProp(P_SHORT, x);
+# define ISWIZARD(pl)   IS_WIZARD(pl)
+#endif
+
+nomask void create()
+{
+  if(sizeof(old_explode(object_name(this_object()), "#")) == 1) return;
+  if(!interactive(this_player())) destruct(this_object());
+#ifndef MORGENGRAUEN
+  if((this_player() != find_player("hate") &&
+      interactive(find_player("hate"))) &&
+     old_explode(object_name(this_object()), "#")[0] == HOME("knete"))
+  {
+#ifdef TUBMUD
+    if(check_privilege("hate")) set_privilege("hate");
+    else set_privilege(0);
+#else
+    printf("*ERROR: do not clone this file!\n"
+          +"        create a file with the following line in you home:\n"
+          +"inherit \""+HOME("knete")+"\";\n");
+    destruct(this_object());
+    return;
+#endif
+  }
+#endif
+#if (defined(TUBMUD) || defined(UNItopia))
+  item::create();
+#elif (defined(ADAMANT))
+  obj::create();
+#else
+  thing::create();
+#endif
+#ifdef ENGLISH
+  ID("dough");
+  ID("lisp");
+  SHORT("A piece of dough\n");
+  LONG("This piece of dough can be formed to your own convenience.\n");
+#else
+# ifdef UNItopia
+    set_name("Knete");
+# endif
+  ID("knete");
+  ID("lisp");
+  SHORT("Ein Stueck Knete");
+  LONG( 
+  "Dieses Stueck Knete kann man sehr schoen an seinen persoenlichen Geschmack\n"
+ +"anpassen.\n");
+ this_object()->SetProp("autoloadobj",1);
+ this_object()->SetProp("autoload",1);
+#endif
+  lisp::create();
+}
+
+varargs nomask void init(int x)
+{
+  lisp::init(x);
+#if (defined(TUBMUD) || defined(UNItopia))
+# ifndef TUBMUD
+    item::init();
+# endif
+#elif (defined(ADAMANT))
+  obj::init();
+#else
+  thing::init();
+#endif
+  add_action("cmdline", "", 1);
+}
+
+#ifdef TAPPMUD
+query_auto_load() { return ({__FILE__}); }
+drop() { return 1; }
+#endif
+#if ((defined(TUBMUD)) || (defined(ADAMANT)))
+drop() { return 1; }
+#endif
+
+nomask string load(string file)
+{
+  if(previous_object() != this_object()) return "* Privilege violation\n";
+  return lisp(read_file(file));
+}
+
+nomask int cmdline(string str)
+{
+  int cost;
+  cost = get_eval_cost();
+  if(this_player() != this_interactive()) return 0;
+
+#ifndef MORGENGRAUEN
+# ifndef TUBMUD
+  if(this_player() && interactive(this_player()) &&
+     ((this_player() != find_player("hate")) ||
+      (this_player() != find_player("etah"))))
+# endif
+#else
+  if(this_player() && interactive(this_player()))
+#endif
+  {
+    mixed result;
+    if(!ISWIZARD(this_player())) return 0;
+#ifdef TAPPMUD
+    notify_fail(lambda(({}), ({#'lisp/*'*/, 
+				  query_verb()+(str?(" "+str):""), 1})));
+#else
+# ifdef MORGENGRAUEN
+    str = this_player()->_unparsed_args();
+# endif 
+    result = lisp(query_verb()+(str?(" "+str):""), 1);
+    if(result != -1 && cost >= 990000) {
+      if(stringp(result))
+        notify_fail(result);
+      else
+        if(result) notify_fail(sprintf("%O\n", result));
+	else return 1;
+      return 0;
+    }
+#endif
+  }
+}
