diff --git a/p/daemon/objectd.c b/p/daemon/objectd.c
new file mode 100644
index 0000000..1b5d821
--- /dev/null
+++ b/p/daemon/objectd.c
@@ -0,0 +1,150 @@
+// MorgenGrauen MUDlib
+//
+// OBJECTD.C -- object daemon
+//
+// $Date: 1995/04/03 14:47:02 $
+// $Revision: 9510 $
+/* $Log: objectd.c,v $
+ * Revision 1.2  1995/04/03 14:47:02  Wargon
+ * QueryObject() verwendet bei BluePrints jetzt auch AddItem.
+ *
+ * Revision 1.1  1995/03/31  13:30:33  Hate
+ * Initial revision
+ *
+ */
+
+#pragma strong_types,save_types,rtt_checks
+#pragma no_clone, no_shadow
+
+#include <rooms.h>
+#include <properties.h>
+#include <defines.h>
+#include <daemon.h>
+
+mapping objects = ([]);
+private nosave int do_save;
+
+#define CLASS   0
+#define DATA    1
+
+protected void create()
+{
+  seteuid(getuid(ME));
+  restore_object(OBJECTD_SAVE);
+}
+
+protected void reset() {
+  if (do_save)
+  {
+    save_object(OBJECTD_SAVE);
+    do_save=0;
+  }
+}
+
+string AddObject(object obj, string env)
+{
+  if(!obj || !env || !objectp(obj) || !stringp(env))
+    return 0;
+
+  // save information
+  if(!member(objects, env))
+    objects[env] = ({ ({  object_name(obj), obj->QueryProp(P_AUTOLOAD) }) });
+  else
+    objects[env] += ({ ({ object_name(obj), obj->QueryProp(P_AUTOLOAD) }) });
+
+  do_save=1;
+  return env;
+}
+
+int RemoveObject(object|string obj, string env)
+{
+  if(!obj || !env || !stringp(env))
+    return 0;
+
+  // save information
+  if(member(objects, env))
+  {
+    mixed oblist = objects[env];
+    foreach(mixed arr: &oblist)
+    {
+      if (load_name(arr[CLASS]) == load_name(obj))
+      {
+        arr = 0;
+        // nur eins Austragen, nicht alle, falls mehr als einmal angemeldet
+        break;
+      }
+    }
+    objects[env] = oblist - ({0});
+  }
+  if(!sizeof(objects[env]))
+    m_delete(objects, env);
+
+  do_save=1;
+  return 1;
+}
+
+// Fragt nicht wirklich ab, sondern erstellt die angemeldeten Objekt in env.
+// Wenn kein env, wird previous_object() genommen.
+varargs void QueryObject(string envname)
+{
+  object env;
+  // take the caller as the questioning object
+  if(!envname || !stringp(envname))
+    env = previous_object();
+  else
+    env = find_object(envname);
+
+  // target must be a blueprint
+  if(IS_CLONE(env)) return 0;
+
+  envname=object_name(env);
+  if(member(objects, envname))
+  {
+    mixed oblist = objects[envname];
+    foreach(mixed arr : &oblist)
+    {
+       // Wir muessen unterscheiden, ob ein Clone angemeldete wurde oder eine
+       // Blueprint.
+       object o;
+       string *n = explode(arr[CLASS], "#");
+       if (sizeof(n) > 1 && sizeof(n[1]) > 0)
+         o = env->AddItem(n[0], REFRESH_DESTRUCT);
+       else
+         o = env->AddItem(n[0], REFRESH_DESTRUCT, 1);
+       o->SetProp(P_AUTOLOAD, arr[DATA]);
+       // Und das neue Objekt merken (ne Verwendung hat das zur Zeit aber
+       // nicht)
+       arr[CLASS] = object_name(o);
+    }
+  }
+}
+
+// Liefert eine Liste der in env angemeldeten Objekte. Wenn kein env, wird
+// previous_object() genommen.
+public varargs string QueryObjects(string envname)
+{
+  object env;
+  // take the caller as the questioning object
+  if(!envname || !stringp(envname))
+    env = previous_object();
+  else
+    env = find_object(envname);
+
+  // target must be a blueprint
+  if(IS_CLONE(env)) return 0;
+
+  mixed arrarr = objects[object_name(env)];
+  if (arrarr)
+  {
+    return CountUp(map(arrarr, #'[, CLASS),", ",", ");
+  }
+  return 0;
+}
+
+public varargs int remove(int silent)
+{
+  save_object(OBJECTD_SAVE);
+  destruct(ME);
+  return 1;
+}
+
