diff --git a/std/player/objects.c b/std/player/objects.c
deleted file mode 100644
index 9263ea3..0000000
--- a/std/player/objects.c
+++ /dev/null
@@ -1,243 +0,0 @@
-// 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})
-	 });
-}
