diff --git a/secure/npcmaster.c b/secure/npcmaster.c
new file mode 100644
index 0000000..33d8bdc
--- /dev/null
+++ b/secure/npcmaster.c
@@ -0,0 +1,124 @@
+// MorgenGrauen MUDlib
+//
+// npcmaster.c - Verwaltung der eindeutigen Nummernvergabe fuer NPCs und
+//               der Stufenpunkte, die sie geben
+//
+// $Id: npcmaster.c 9142 2015-02-04 22:17:29Z Zesstra $
+//
+/*
+ * $Log: npcmaster.c,v $
+ * Revision 1.6  1996/09/18 08:59:49  Wargon
+ * Globale Variablen private gemacht...
+ *
+ * Revision 1.5  1996/04/10 17:48:37  Jof
+ * Dump-Funktion eingebaut, damit man auch was zu lesen hat :)
+ * ,
+ *
+ * Revision 1.4  1996/04/10 14:32:24  Wargon
+ * QueryNPC(): int * -> mixed
+ *
+ * Revision 1.3  1996/04/04 12:33:06  Wargon
+ * QueryNPCbyNumber() gibt jetzt wirklich Nummer und Score zurueck...
+ *
+ * Revision 1.2  1996/03/06 14:34:51  Jof
+ * QueryNPCbyNumber eingebaut, Typos gefixed
+ *
+ * Revision 1.1  1996/03/06 13:45:36  Jof
+ * Initial revision
+ *
+ */
+
+#include "/secure/npcmaster.h"
+#include "/secure/wizlevels.h"
+
+private int lastNum;
+private mapping npcs;
+private nosave mapping by_num;
+
+void make_num(string key) {
+  by_num += ([ npcs[key,NPC_NUMBER] : key; npcs[key,NPC_SCORE] ]);
+}
+
+void create()
+{
+  seteuid(getuid());
+  if (!restore_object(NPCSAVEFILE))
+  {
+    lastNum=0;
+    npcs=m_allocate(0,2);
+  }
+  by_num = m_allocate(0,2);
+  filter_indices(npcs, #'make_num/*'*/);
+}
+
+static int DumpNPCs();
+
+varargs mixed QueryNPC(int score)
+{
+  string key, val;
+  
+  if (!previous_object())
+    return NPC_INVALID_ARG;
+  key=old_explode(object_name(previous_object()),"#")[0];
+  if (val=npcs[key,NPC_NUMBER])
+    return ({val,npcs[key,NPC_SCORE]});
+  if (score<=0 || member(inherit_list(previous_object()),"/std/living/life.c") < 0)
+    return NPC_INVALID_ARG;
+  npcs[key,NPC_SCORE]=score;
+  npcs[key,NPC_NUMBER]=++lastNum;
+  by_num += ([lastNum:key;score]);
+   save_object(NPCSAVEFILE);
+  call_out("DumpNPCs",0);
+  return ({lastNum,score});
+}
+
+int SetScore(string key,int score)
+{
+  if (!IS_ARCH(this_interactive())||!IS_ARCH(geteuid(previous_object())))
+    return NPC_NO_PERMISSION;
+  if (!npcs[key,NPC_NUMBER])
+    return NPC_INVALID_ARG;
+  npcs[key,NPC_SCORE]=score;
+  by_num += ([npcs[key,NPC_NUMBER]:key;score]);
+  save_object(NPCSAVEFILE);
+  DumpNPCs();
+  return 1;
+}
+
+static int DumpNPCs()
+{
+  mixed *keys;
+  int i, max;
+
+  keys=m_indices(npcs);
+  rm(NPCDUMPFILE);
+  for (i=sizeof(keys)-1, max=0;i>=0;i--) {
+    write_file(NPCDUMPFILE,sprintf("%5d %4d %s\n",npcs[keys[i],NPC_NUMBER],
+	   npcs[keys[i],NPC_SCORE],keys[i]));
+    max += npcs[keys[i],NPC_SCORE];
+  } 
+  write_file(NPCDUMPFILE,sprintf("====================\nGesamt: %d Punkte\n",max)); 
+  return 1;
+}
+
+mixed *QueryNPCbyNumber(int num)
+{
+  if (by_num[num])
+    return ({num,by_num[num,NPC_SCORE],by_num[num,NPC_NUMBER]});
+
+  return 0;
+}
+
+int Recalculate(string s)
+{
+  int i, j;
+
+  if (!s || !sizeof(s))
+    return 0;
+
+  for (j=0, i=6*sizeof(s)-1; i>0; i--) {
+    if (test_bit(s,i))
+      j+=by_num[i,NPC_SCORE];
+  }
+  return j;
+}
