diff --git a/std/player/objects.c b/std/player/objects.c
new file mode 100644
index 0000000..9263ea3
--- /dev/null
+++ b/std/player/objects.c
@@ -0,0 +1,243 @@
+// MorgenGrauen MUDlib
+//
+// player/objects.c -- object handling for player
+//
+// $Id: objects.c 8675 2014-02-18 20:39:54Z Zesstra $
+#pragma strong_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#define NEED_PROTOTYPES
+#include "/sys/player/filesys.h"
+
+#include <config.h>
+#include <player.h>
+#include <properties.h>
+#include <language.h>
+#include <moving.h>
+#include <wizlevels.h>
+#include <thing/moving.h>
+
+static int update_object(string str) {
+  object ob;
+  string upd_file;
+  if (!(str=_unparsed_args())) {
+    notify_fail("Usage: Update <object_path>\n"); return 0;
+  }
+  upd_file = find_file(str,".c");
+  if (!upd_file) upd_file=find_file(str);
+  if (!upd_file) {
+    notify_fail(str+": No such file.\n"); return 0;
+  }
+  ob = find_object(upd_file);
+  if (!ob) {
+    notify_fail(upd_file+": No such object.\n"); return 0;
+  }
+  destruct(ob);
+  write(upd_file + ": will be reloaded at next reference.\n");
+  return 1;
+}
+
+/*
+ * "soft" means that the object is given the chance to self-destruct, thus
+ * allowing it to do necessary cleanup like subtracting from the carried
+ * weight of the environment(). We call remove() in the object to be
+ * destructed.
+ */
+static int soft_update_object(string str) 
+{
+  object ob;
+  string upd_file;
+  if (!(str=_unparsed_args())) {
+    notify_fail("Usage: update <object_path>\n"); return 0;
+  }
+  upd_file = find_file(str,".c");
+  if (!upd_file) upd_file=find_file(str);
+  if (!upd_file) {
+    notify_fail(str+": No such file.\n"); return 0;
+  }
+  ob = find_object(upd_file);
+  if (!ob) {
+    notify_fail(upd_file+": No such object.\n"); return 0;
+  }
+  if (ob->remove() == 0) {
+    notify_fail(upd_file+": doesn't want to be destructed!\n"); return 0;
+  }
+  write(upd_file + ": will be reloaded at next reference.\n");
+  return 1;
+}
+
+int clone(string str) 
+{
+  object ob;
+  string clone_file;
+
+  if (!(str=_unparsed_args())){
+    notify_fail("Usage: clone <object_path>\n"); return 0;
+  }
+  clone_file = find_file(str,".c");
+  if (!clone_file) clone_file=find_file(str);
+  if (!clone_file) {
+    notify_fail(str+": No such file.\n"); return 0;
+  }
+  if (!(ob = clone_object(clone_file)))
+    return notify_fail(str+": Failed to load.\n"), 0;
+
+  /* Some objects destruct themselves rather fast */
+  if (!objectp(ob))
+    return notify_fail(str+": Destructed whilst created.\n"), 0;
+  
+  /* try to move the object to my environment */
+  if ((ob->move(this_object(),M_GET)>0) || 
+      (ob->move(environment(),M_NOCHECK)>0))
+  {
+    if (!objectp(ob))
+      return notify_fail(str+": Destructed whilst created.\n"), 0;
+    write("Cloned "+object_name(ob)+".\n");
+    say(this_player()->name(WER,1) + " "
+		+ this_player()->QueryProp(P_CLONE_MSG)+".\n");
+    return 1;
+  }
+  say(this_player()->name(WER,1)+" malt wilde Zeichen in die Luft und "
+      +"murmelt vor sich hin, aber nichts passiert...\n");
+  destruct(ob);
+  write(clone_file+": failed to move\n");
+  return 1;
+}
+
+/*
+ * "soft" means that the object is given the chance to self-destruct, thus
+ * allowing it to do necessary cleanup like subtracting from the carried
+ * weight of the environment(). We call remove() in the object to be
+ * destructed.
+ */
+static int soft_destruct_object(string str)
+{ 
+  object ob;
+  object *obs;
+  string strWER,strWEN;
+
+  if (!(str=_unparsed_args())){
+    notify_fail("Usage: destruct <objectname>\n"); return 0;
+  }
+  strWER = lower_case(str);
+  obs = this_player()->find_obs(strWER,PUT_GET_NONE);
+  if (!obs || !sizeof(obs)) {
+    notify_fail("Kein \"" + str + "\" gefunden.\n");
+    return 0;
+  }
+  ob=obs[0];
+  strWER=ob->name(WER);
+  strWEN=ob->name(WEN);
+  if (!strWER)
+    strWER="jemand";
+  if (!strWEN)
+    strWEN="jemanden";
+
+  if (ob->remove() == 0) {
+    notify_fail(strWER+" will nicht 'destructed' werden!\n");
+    say(this_player()->name(WER,1)+" versucht vergeblich, "+strWEN+
+        " zu atomisieren.\n");
+    return 0;
+  }
+  say(capitalize(strWER)+" "+this_player()->QueryProp(P_DESTRUCT_MSG)+".\n");
+  write(capitalize(strWER)+" wird von dir zerstaeubt.\n");
+  return 1;
+}
+
+static int destruct_object(string str)
+{ 
+  object ob;
+  object *obs;
+  string strWER,strWEN;
+
+  if (!(str=_unparsed_args())) {
+    notify_fail("Usage: Destruct <objectname>\n"); return 0;
+  }
+  strWER = lower_case(str);
+  obs = this_player()->find_obs(strWER,PUT_GET_NONE);
+  if (!obs || !sizeof(obs)) {
+    notify_fail("Kein \"" + str + "\" gefunden.\n"); return 0;
+  }
+  ob=obs[0];
+  strWER=ob->name(WER);
+  strWEN=ob->name(WEN);
+
+  say(capitalize(strWER)+" "+this_player()->QueryProp(P_DESTRUCT_MSG)+".\n");
+  destruct( ob );
+  write(capitalize(strWER)+" wird von dir zerstaeubt.\n");
+  return 1;
+}
+
+static int load(string str)
+{ 
+  object env;
+  string file;
+  string err;
+
+  if (!(str=_unparsed_args())) {
+    notify_fail("Usage: load <object_path>\n"); return 0;
+  }
+  file = find_file(str,".c");
+  if (!file) file=find_file(str);
+  if (!file) {
+    notify_fail(str+": No such file.\n"); return 0;
+  }
+  if ( err = catch(load_object(file);publish) )
+    printf("Cannot load %O, err = %O\n",file,err);
+  else write(file+"\n");
+  return 1;
+}
+
+static int exec_playerob(string name)
+{
+  object ob, *inv;
+  int i;
+
+  if (!IS_LORD(this_object())) return 0;
+  if (this_player() != this_interactive()) return 0;
+  if (this_player() != this_object()) return 0;
+  if (!(name=_unparsed_args())) return 0;
+  name="secure/master"->_get_path(name,getuid(this_object()));
+  if (catch(load_object(name);publish) ) 
+  {
+    write("BUG in "+name+"\n");
+    return 1;
+  }
+  ob=clone_object(name);
+  if (!ob) return 0;
+  if (getuid(ob) != getuid(this_object()))
+  {
+    write("UID conflict.\n");
+    destruct(ob);
+    return 1;
+  }
+  log_file("EXEC", getuid(this_object())+" "+name+" "+dtime(time()));
+  disable_commands();
+  exec(ob,this_object());
+  if (interactive(this_object()) || !interactive(ob))
+  {
+    enable_commands();
+    write("Fehler in exec\n");
+    return 1;
+  }
+  inv=all_inventory(this_object());
+  ob->start_player(capitalize(getuid(this_object())));
+  remove();
+  return 1;
+}
+
+static mixed _query_localcmds()
+{
+  return ({
+           ({"clone","clone",0,WIZARD_LVL}),
+	   ({"destruct","soft_destruct_object",0,LEARNER_LVL}),
+	   ({"Destruct","destruct_object",0,LEARNER_LVL}),
+	   ({"load","load",0,WIZARD_LVL}),
+	   ({"update","soft_update_object",0,LEARNER_LVL}),
+	   ({"Update","update_object",0,LEARNER_LVL}),
+	   ({"exec","exec_playerob",0,LEARNER_LVL})
+	 });
+}
