diff --git a/secure/repmaster.c b/secure/repmaster.c
new file mode 100644
index 0000000..8ac817d
--- /dev/null
+++ b/secure/repmaster.c
@@ -0,0 +1,329 @@
+#pragma strict_types
+#pragma no_clone
+#pragma no_shadow
+#pragma no_inherit
+#pragma verbose_errors
+#pragma warn_deprecated
+
+#include <reputation.h>
+#include <wizlevels.h>
+
+/* Datenstruktur reputations:
+ * (["id": (["uids": ({ "uid1", "uid2" }), "name":"", "changemsg":"",  
+ *           "flags":x|x|x
+ *         ]) 
+ * ])
+ * Bsp:
+ * (["schaedlspalta": (["uids": ({"d.wald.nibel", "d.wald.kessa"}),
+ *                      "name": "Schaedlspalta-Klan", "active": 1,
+ *                      "changemsg":"beim Schaedlspalta-Klan" 
+ *                    ])
+ * ])
+ */
+
+private mapping reputations;
+
+protected void create() {
+  seteuid(getuid(this_object()));
+
+  if(!restore_object(REP_SAVEFILE) || !mappingp(reputations)) 
+    reputations = ([ ]);
+}
+
+// Zugriff auf Handlingmethoden fuer ROOT, EMs+
+private int Sec() {
+  if(process_call()) return 0;
+  if(previous_object() && geteuid(previous_object()) == ROOTID) return 1;
+  return objectp(previous_object()) && ARCH_SECURITY;
+}
+
+
+/* Argumente:
+ * repid = id im mapping reputations
+ * validuids = UIDs welche die Reputation veraendern duerfen, String
+ *             oder String-Array
+ * name = Name der Reputationsfraktion 
+ * changemsg = Text der in die Default-Changemsg eingefuegt wird
+ *             (Dein Ansehen %s hat sich ... verbessert.)
+ *
+ * Returns:
+ *  1 = Reputation erfolgreich hinzugefuegt
+ * -1 = Keine Zugriffsrechte
+ * -2 = Falsche Argumente
+ * -3 = Reputation bereits vorhanden
+ */
+public int AddReputation(string repid, mixed validuids, string name,
+                         string changemsg) {
+  if(!Sec()) 
+    return -1;
+  if(stringp(validuids)) validuids = ({ validuids });
+  if(!pointerp(validuids)) validuids = ({ });
+  // validuids + changemsgs kann auch erstmal leer bleiben
+  if(!stringp(repid) || !sizeof(repid) || !stringp(name) || !sizeof(name))
+    return -2;
+  if(member(reputations, repid))
+    return -3;
+  reputations += ([ repid : ([ 
+    "uids": validuids,
+    "name": name,
+    "flags": REP_FLAG_ACTIVE,
+    "changemsg": changemsg
+  ]) ]);
+  save_object(REP_SAVEFILE);
+  tell_object(this_interactive(), sprintf("Reputation eingetragen:\n"
+    "Name: %s\nValid UIDs: %O\nFlags: REP_FLAG_ACTIVE\nChangemsg: %s\n",
+    reputations[repid]["name"], reputations[repid]["uids"],
+    reputations[repid]["changemsg"]));
+  return 1;
+}
+
+/* Argumente:
+ * repid = id im mapping reputations
+ *
+ * Returns:
+ *  1 = wurde erfolgreich deaktiviert
+ * -1 = Keine Zugriffsrechte
+ * -2 = Falsche Argumente
+ * -3 = Rep nicht vorhanden
+ * -4 = Ist bereits deaktiviert
+ */
+public int DeactivateReputation(string repid) {
+  if(!Sec())
+    return -1;
+  if(!stringp(repid) || !sizeof(repid))
+    return -2;
+  if(!member(reputations, repid))
+    return -3;
+  if(!(reputations[repid]["flags"] & REP_FLAG_ACTIVE)) 
+    return -4;
+  reputations[repid]["flags"] |= REP_FLAG_ACTIVE;
+  save_object(REP_SAVEFILE);
+  return 1;
+}
+
+/* Argumente:
+ * repid = id im mapping reputations
+ *
+ * Returns:
+ *  1 = wurde erfolgreich aktiviert
+ * -1 = Keine Zugriffsrechte
+ * -2 = Falsche Argumente
+ * -3 = Rep nicht vorhanden
+ * -4 = Ist bereits aktiviert
+ */
+public int ActivateReputation(string repid) {
+  if(!Sec())
+    return -1;
+  if(!stringp(repid) || !sizeof(repid))
+    return -2;
+  if(!member(reputations, repid))
+    return -3;
+  if(reputations[repid]["flags"] & REP_FLAG_ACTIVE) 
+    return -4;
+  reputations[repid]["flags"] ^= REP_FLAG_ACTIVE;
+  save_object(REP_SAVEFILE);
+  return 1;
+}
+
+/* Argumente:
+ * repid = id im mapping reputations
+ * uid = UID welche die Reputation veraendern darf
+ *
+ * Returns:
+ *  1 = UID erfolgreich hinzugefuegt
+ * -1 = Keine Zugriffsrechte
+ * -2 = Falsche Argumente
+ * -3 = Rep nicht vorhanden
+ * -4 = UID ist bereits vorhanden
+ */
+public int AddReputationUid(string repid, string uid) {
+  if(!Sec())
+    return -1;
+  if(!stringp(repid) || !sizeof(repid) || !stringp(uid) || !sizeof(uid))
+    return -2;
+  if(!member(reputations, repid))
+    return -3;
+  if(member(reputations[repid]["uids"], uid) != -1) 
+    return -4;
+  reputations[repid]["uids"] += ({ uid });
+  save_object(REP_SAVEFILE);
+  return 1;
+}
+
+/* Argumente:
+ * repid = id im mapping reputations
+ * uid = UID welche die Reputation nicht mehr veraendern darf
+ *
+ * Returns:
+ *  1 = UID erfolgreich geloescht
+ * -1 = Keine Zugriffsrechte
+ * -2 = Falsche Argumente
+ * -3 = Rep nicht vorhanden
+ * -4 = UID nicht vorhanden
+ */
+public int RemoveReputationUid(string repid, string uid) {
+  if(!Sec())
+    return -1;
+  if(!stringp(repid) || !sizeof(repid) || !stringp(uid) || !sizeof(uid))
+    return -2;
+  if(!member(reputations, repid))
+    return -3;
+  if(member(reputations[repid]["uids"], uid) == -1) 
+    return -4;
+  reputations[repid]["uids"] -= ({ uid });
+  save_object(REP_SAVEFILE);
+  return 1;
+}
+
+/* Argumente:
+ * repid = id im mapping reputations
+ * name = Neuer Name der Rep
+ *
+ * Returns:
+ *  1 = Neuer Name erfolgreich gesetzt
+ * -1 = Keine Zugriffsrechte
+ * -2 = Falsche Argumente
+ * -3 = Rep nicht vorhanden
+ * -4 = Name entspricht dem derzeitigen
+ */
+public int ChangeReputationName(string repid, string name) {
+  if(!Sec())
+    return -1;
+  if(!stringp(repid) || !sizeof(repid) || !stringp(name) || !sizeof(name))
+    return -2;
+  if(!member(reputations, repid))
+    return -3;
+  if(reputations[repid]["name"] == name) 
+    return -4;
+  reputations[repid]["name"] = name;
+  save_object(REP_SAVEFILE);
+  return 1;
+}
+
+/* Argumente:
+ * repid = id im mapping reputations
+ * msg = Neuer String in der Default-Changemsg
+ *
+ * Returns:
+ *  1 = Neue Msg erfolgreich gesetzt
+ * -1 = Keine Zugriffsrechte
+ * -2 = Falsche Argumente
+ * -3 = Rep nicht vorhanden
+ * -4 = Msg entspricht der derzeitigen
+ */
+public int ChangeReputationMsg(string repid, string msg) {
+  if(!Sec())
+    return -1;
+  if(!stringp(repid) || !sizeof(repid) || !stringp(msg) || !sizeof(msg))
+    return -2;
+  if(!member(reputations, repid))
+    return -3;
+  if(reputations[repid]["changemsg"] == msg) 
+    return -4;
+  reputations[repid]["changemsg"] = msg;
+  save_object(REP_SAVEFILE);
+  return 1;
+}
+
+/* Argumente:
+ * repid = id(s) im mapping reputations, ohne Argument werden alle aufgelistet,
+ *         String oder String-array
+ *
+ * Returns:
+ *  1 = Liste ausgegeben
+ * -1 = Falsche Argumente
+ * -2 = Rep nicht vorhanden
+ */
+public varargs int ViewReputationData(mixed repids) {
+  // Fuer alle sichtbar, damit man ggf. weiss, wo man nachfragen muss
+  if(!repids) repids = m_indices(reputations);
+  else if(stringp(repids)) repids = ({ repids });
+  if(!pointerp(repids) || !sizeof(repids))
+    return -1;
+  // Textausgabe fuer alle richtigen IDs
+  foreach(string repid : repids) {
+    if(!member(reputations, repid)) continue;
+    tell_object(this_interactive(), sprintf("%s %s\n  Name: %s\n  Changemsg: "
+      "%s\n  ValidUIDS: %O\n\n", repid, 
+      (reputations[repid]["flags"] & REP_FLAG_ACTIVE ? "" :
+      "(Inaktiv)"), reputations[repid]["name"], 
+      reputations[repid]["changemsg"], reputations[repid]["uids"]));
+  }
+  // Min. 1 nicht vorhanden: return -2, sonst 1
+  return (sizeof(repids - m_indices(reputations)) ? -2 : 1);
+}
+
+/* Argumente:
+ * repid = id im mapping reputations
+ *
+ * Returns:
+ * mapping = Daten der Reputation
+ * 0 = Falsches Argument / Reputation nicht vorhanden
+ */
+public mapping GetReputationData(string repid) {
+  if(!stringp(repid) || !sizeof(repid) || !member(reputations, repid))
+    return 0;
+  return deep_copy(reputations[repid]);
+}
+
+/* Argumente:
+ * repid = id im mapping reputations
+ * value = Wert um den die Rep veraendert wird (+ / -)
+ *
+ * Returns:
+ * string = "Dein Ansehen %s hat sich ... .\n"
+ * 0 = Falsche Argumente / Rep nicht vorhanden
+ */
+public string GetDefaultChangeMsg(string repid, int value) {
+  string strength;
+  if(!stringp(repid) || !sizeof(repid) || !intp(value) || !value ||
+     !member(reputations, repid))
+    return 0;
+  switch(abs(value)) {
+    case    0..25  : strength = "kaum merklich"; break;
+    case   26..50  : strength = "leicht"; break;
+    case   51..100 : strength = "deutlich"; break;
+    case  101..250 : strength = "erheblich"; break;
+    case  251..1000: strength = "sehr stark"; break;
+    default:         strength = "ausserordentlich stark"; break;
+  }
+  return sprintf("Dein Ansehen %s hat sich%s%s.\n", 
+    reputations[repid]["changemsg"], (!strength ? " " : " "+ strength +" "),
+    (value < 0 ? "verschlechtert" : "verbessert"));
+}
+
+/* Argumente:
+ * repid = id im mapping reputations
+ * ob = Objekt, dessen UID geprueft wird, ohne Argument -> prev_ob()
+ *
+ * Returns:
+ * 1 = UID valid
+ * 0 = UID invalid
+ * -1 = Falsche Argumente 
+ * -2 = Rep nicht vorhanden 
+ */
+public int CheckValidUid(string repid, object ob) {
+  if(!stringp(repid) || !sizeof(repid) || !objectp(ob))
+    return -1;
+  if(!member(reputations, repid))
+    return -2;
+  return (member(reputations[repid]["uids"], getuid(ob)) != -1);
+}
+
+/* Argumente:
+ * repid = id im mapping reputations
+ *
+ * Returns:
+ * 1 = Rep aktiv
+ * 0 = Rep inaktiv
+ * -1 = Falsche Argumente 
+ * -2 = Rep nicht vorhanden 
+ */
+public int CheckRepActive(string repid) {
+  if(!stringp(repid) || !sizeof(repid))
+    return -1;
+  if(!member(reputations, repid))
+    return -2;
+  // Verboolung
+  return !!(reputations[repid]["flags"] & REP_FLAG_ACTIVE);
+}
