diff --git a/secure/errord.c b/secure/errord.c
new file mode 100644
index 0000000..0c9c4e8
--- /dev/null
+++ b/secure/errord.c
@@ -0,0 +1,1482 @@
+/*  MorgenGrauen MUDlib
+    /p/daemon/errord.c
+    speichert Fehler und Warnungen
+    Autor: Zesstra
+    $Id: errord.c 9439 2016-01-20 09:48:28Z Zesstra $
+    ggf. Changelog:
+*/
+
+#pragma strict_types,save_types,rtt_checks
+#pragma no_clone
+#pragma no_shadow
+#pragma no_inherit
+#pragma pedantic
+#pragma range_check
+#pragma warn_deprecated
+
+#include <config.h>
+#include <wizlevels.h>
+#include <defines.h>
+#include <debug_info.h>
+#include <commands.h>
+#include <wizlevels.h>
+#include <mail.h>
+#include <tls.h>
+#include <events.h>
+
+inherit "/secure/errord-structs";
+
+#define __NEED_IMPLEMENTATION__
+#include "errord.h"
+#undef __NEED_IMPLEMENTATION__
+
+#define SAVEFILE  (__DIR__+"ARCH/errord")
+
+#define TI this_interactive()
+
+private int       access_check(string uid,int mode);
+private varargs int set_lock(int issueid, int lock, string note);
+private varargs int set_resolution(int issueid, int resolution, string note);
+
+private int versende_mail(struct fullissue_s fehler);
+
+nosave mapping lasterror;   // die letzen 5 jeder Art.
+
+
+/* ******************* Helfer **************************** */
+
+public int getErrorID(string hashkey)
+{
+  int** row=sl_exec("SELECT id from issues WHERE hashkey=?1;",
+                    hashkey);
+  //DEBUG(sprintf("getEID: %s: %O\n",hashkey,row));
+  if (pointerp(row))
+  {
+    return row[0][0];
+  }
+  return -1;
+}
+
+// note->id muss auf einen Eintrag in issues verweisen, es erfolgt keine
+// Pruefung.
+int db_add_note(struct note_s note)
+{
+  sl_exec("INSERT INTO notes(issueid,time,user,txt) "
+          "VALUES(?1,?2,?3,?4);",
+          to_array(note)...);
+  return sl_insert_id();
+}
+
+private struct frame_s* db_get_stack(int issueid)
+{
+  mixed rows = sl_exec("SELECT * FROM stacktraces WHERE issueid=?1 "
+                       "ORDER BY rowid;", issueid);
+  if (pointerp(rows))
+  {
+    struct frame_s* stack = allocate(sizeof(rows));
+    int i;
+    foreach(mixed row : rows)
+    {
+      stack[i] = to_struct(row, (<frame_s>));
+      ++i;
+    }
+    return stack;
+  }
+  return 0;
+}
+
+private struct note_s* db_get_notes(int issueid)
+{
+  mixed rows = sl_exec("SELECT * FROM notes WHERE issueid=?1 "
+                       "ORDER BY rowid;", issueid);
+  if (pointerp(rows))
+  {
+    struct note_s* notes = allocate(sizeof(rows));
+    int i;
+    foreach(mixed row : rows)
+    {
+      notes[i] = to_struct(row, (<note_s>));
+      ++i;
+    }
+    return notes;
+  }
+  return 0;
+}
+
+// einen durch id oder hashkey bezeichneten Eintrag als fullissue_s liefern.
+private struct fullissue_s db_get_issue(int issueid, string hashkey)
+{
+  mixed rows = sl_exec("SELECT * FROM issues WHERE id=?1 OR hashkey=?2;",
+                       issueid, hashkey);
+  if (pointerp(rows))
+  {
+    // Einfachster Weg - funktioniert aber nur, solange die Felder in der DB
+    // die gleiche Reihenfolge wie in der struct haben! Entweder immer
+    // sicherstellen oder Ergebnisreihenfolge oben im select festlegen!
+    struct fullissue_s issue = to_struct( rows[0], (<fullissue_s>) );
+    if (issue->type == T_RTERROR)
+        issue->stack = db_get_stack(issue->id);
+    issue->notes = db_get_notes(issue->id);
+    return issue;
+  }
+  return 0;
+}
+
+private struct fullissue_s filter_private(struct fullissue_s issue)
+{
+    //momentan wird F_CLI, also die Spielereingabe vor dem Fehler
+    //ausgefiltert, wenn TI kein EM oder man in process_string() ist.
+
+    //Wenn EM und nicht in process_string() oder die Spielereingabe gar nicht
+    //im Fehlereintrag drinsteht: ungefiltert zurueck
+    if (!issue->command ||
+        (!process_call() && ARCH_SECURITY) )
+        return issue;
+
+    //sonst F_CLI rausfiltern, also Kopie und in der Kopie aendern.
+    issue->command="Bitte EM fragen";
+    return issue;
+}
+
+// setzt oder loescht die Loeschsperre.
+// Prueft, ob <issueid> existiert und aendert den Zustand nur, wenn noetig.
+// Rueckgabe: -1, wenn Issue nicht existiert, -2 wenn bereits resolved, -3
+//            wenn keine Aenderung noetig, sonst den neuen Sperrzustand
+int db_set_lock(int issueid, int lockstate, string note)
+{
+  int** rows = sl_exec("SELECT locked,resolved FROM issues WHERE id=?1;",
+                       issueid);
+  if (!rows)
+    return -1;  // nicht vorhanden.
+
+  if (rows[0][1])
+      return -2; // bereits resolved -> Sperre nicht moeglich.
+
+
+  if (lockstate && !rows[0][0])
+  {
+    // Sperren
+//    sl_exec("BEGIN TRANSACTION;");
+    sl_exec("UPDATE issues SET locked=1,locked_by=?2,locked_time=?3,mtime=?3 "
+            "WHERE id=?1;",
+            issueid, getuid(TI), time());
+    db_add_note( (<note_s> id: issueid, time: time(), user: getuid(TI),
+                           txt: sprintf("Lock gesetzt: %s", 
+                                        note ? note : "<kein Kommentar>")) );
+//    sl_exec("COMMIT;");
+    return 1;
+  }
+  else if (!lockstate && rows[0][0])
+  {
+    // entsperren
+//    sl_exec("BEGIN TRANSACTION;");
+    sl_exec("UPDATE issues SET locked=0,locked_by=0,locked_time=0,mtime=?2 "
+            "WHERE id=?1;", issueid, time());
+    db_add_note( (<note_s> id: issueid, time: time(), user: getuid(TI),
+                           txt: sprintf("Lock geloescht: %s", 
+                                        note ? note : "<kein Kommentar>")) );
+//    sl_exec("COMMIT;");
+    return 0;
+  }
+  // nix aendern.
+  return -3;
+}
+
+// markiert ein Issue als gefixt oder nicht gefixt.
+// Prueft, ob <issueid> existiert und aendert den Zustand nur, wenn noetig.
+// Rueckgabe: -1, wenn Issue nicht existiert, -3 wenn keine Aenderung noetig,
+//            sonst den neuen Sperrzustand
+int db_set_resolution(int issueid, int resolved, string note)
+{
+  int** rows = sl_exec("SELECT resolved FROM issues WHERE id=?1;",
+                       issueid);
+  if (!rows)
+    return -1;  // nicht vorhanden.
+
+  if (resolved && !rows[0][0])
+  {
+    // Als gefixt markieren.
+//    sl_exec("BEGIN TRANSACTION;");
+    sl_exec("UPDATE issues SET resolved=1,resolver=?2,mtime=?3 "
+            "WHERE id=?1;",
+            issueid, getuid(TI),time());
+    db_add_note( (<note_s> id: issueid, time: time(), user: getuid(TI),
+                           txt: sprintf("Fehler gefixt: %s", 
+                                        note ? note : "<kein Kommentar>")) );
+//    sl_exec("COMMIT;");
+    return 1;
+  }
+  else if (!resolved && rows[0][0])
+  {
+    // als nicht gefixt markieren.
+//    sl_exec("BEGIN TRANSACTION;");
+    sl_exec("UPDATE issues SET resolved=0,resolver=0,mtime=?2 "
+            "WHERE id=?1;", issueid, time());
+    db_add_note( (<note_s> id: issueid, time: time(), user: getuid(TI),
+                           txt: sprintf("Fix zurueckgezogen: %s", 
+                                        note ? note : "<kein Kommentar>")) );
+//    sl_exec("COMMIT;");
+    return 0;
+  }
+  // nix aendern.
+  return -3;
+
+}
+
+// Transferiert ein Issue zu einer neuen zustaendigen UID
+// Prueft, ob <issueid> existiert und aendert den Zustand nur, wenn noetig.
+// Rueckgabe: -1, wenn Issue nicht existiert, -3 wenn keine Aenderung noetig,
+//            1, wenn erfolgreich neu zugewiesen
+int db_reassign_issue(int issueid, string newuid, string note)
+{
+  string** rows = sl_exec("SELECT uid FROM issues WHERE id=?1;",
+                       issueid);
+  if (!rows)
+    return -1;  // nicht vorhanden.
+
+  if (!stringp(newuid))
+    return(-2);
+
+  if (newuid != rows[0][0])
+  {
+//    sl_exec("BEGIN TRANSACTION;");
+    sl_exec("UPDATE issues SET uid=?2,mtime=?3 WHERE id=?1;",
+            issueid, newuid,time());
+    db_add_note( (<note_s> id: issueid, time: time(), user: getuid(TI),
+                           txt: sprintf("Fehler von %s an %s uebertragen. (%s)",
+                                        rows[0][0], newuid,
+                                        note ? note : "<kein Kommentar>")) );
+//    sl_exec("COMMIT;");
+    return 1;
+  }
+
+  return -3;
+}
+
+// inkrementiert count und aktualisiert mtime, atime.
+// Ausserdem wird ggf. das Loeschflag genullt - ein erneut aufgetretener
+// Fehler sollte anschliessend nicht mehr geloescht sein. Geloeste
+// (resolved) Eintraege werden NICHT auf ungeloest gesetzt. Vermutlich trat
+// der Fehler in einem alten Objekte auf...
+// Issue muss in der DB existieren.
+int db_countup_issue(int issueid)
+{
+  sl_exec("UPDATE issues SET count=count+1,mtime=?2,atime=?2,deleted=0 WHERE id=?1;",
+          issueid,time());
+  return 1;
+}
+
+// Das Issue wird ggf. ent-loescht und als nicht resvolved markiert.
+// Sind pl und msg != 0, wird eine Notiz angehaengt.
+// aktualisiert mtime, atime.
+// Issue muss in der DB existieren.
+int db_reopen_issue(int issueid, string pl, string msg)
+{
+  int** row=sl_exec("SELECT deleted,resolved from issues WHERE id=?1;",
+                    issueid);
+  if (pointerp(row)
+      && (row[0][0] || row[0][1]) )
+  {
+//    sl_exec("BEGIN TRANSACTION;");
+    if (pl && msg)
+    {
+      db_add_note( (<note_s> id: issueid,
+                             time: time(),
+                             user: pl,
+                             txt: msg) );
+    }
+    sl_exec("UPDATE issues SET "
+        "deleted=0,resolved=0,resolver=0,mtime=?2,atime=?2 WHERE id=?1;",
+        issueid,time());
+//    sl_exec("COMMIT;");
+  }
+  return 1;
+}
+
+int db_insert_issue(struct fullissue_s issue)
+{
+  //DEBUG(sprintf("db_insert: %O\n", issue));
+
+  mixed row=sl_exec("SELECT id from issues WHERE hashkey=?1;",
+                    issue->hashkey);
+  //DEBUG(sprintf("insert: %s: %O\n",issue->hashkey,row));
+  if (pointerp(row))
+  {
+    issue->id=row[0][0];
+    return db_countup_issue(issue->id);
+  }
+//  sl_exec("BEGIN TRANSACTION;");
+  sl_exec("INSERT INTO issues(hashkey,uid,type,mtime,ctime,atime,count,"
+          "deleted,resolved,locked,locked_by,locked_time,resolver,message,"
+          "loadname,obj,prog,loc,titp,tienv,hbobj,caught,command,verb) "
+          "VALUES(?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15,"
+          "?16,?17,?18,?19,?20,?21,?22,?23,?24);",
+          (to_array(issue)[1..24])...); 
+  issue->id=sl_insert_id();
+
+  if (pointerp(issue->stack))
+  {
+    foreach(struct frame_s entry : issue->stack)
+    {
+      entry->id = issue->id;
+      sl_exec("INSERT INTO stacktraces(issueid,type,name,prog,obj,loc,ticks) "
+              "VALUES(?1,?2,?3,?4,?5,?6,?7);",
+              to_array(entry)...);
+    }
+  }
+  if (pointerp(issue->notes))
+  {
+    foreach(struct note_s entry : issue->notes)
+    {
+      entry->id = issue->id;
+      sl_exec("INSERT INTO notes(issueid,time,user,txt) "
+              "VALUES(?1,?2,?3,?4);",
+              to_array(entry)...);
+    }
+  }
+//  sl_exec("COMMIT;");
+
+  return issue->id;
+}
+
+
+// loggt einen T_REPORTED_ERR, T_REPORTED_IDEA, T_REPORTED_TYPO, T_REPORTED_MD
+public string LogReportedError(mapping err)
+{
+    //darf nur von Spielershells oder Fehlerteufel gerufen werden.
+    if (extern_call() && !previous_object()
+        || (strstr(load_name(previous_object()),"/std/shells/") == -1
+           && load_name(previous_object()) != "/obj/tools/fehlerteufel"))
+        return 0;
+
+    //DEBUG("LogReportedError\n");
+    // DEBUG(sprintf("%O\n",err));
+    string uid = (string)master()->creator_file(err[F_OBJ]);
+
+    // default-Typ
+    if (!member(err, F_TYPE)) err[F_TYPE] = T_REPORTED_ERR;
+
+    // div. Keys duerfen nicht gesetzt sein.
+    err -= ([F_STATE, F_READSTAMP, F_CAUGHT, F_STACK, F_CLI, F_VERB,
+             F_LOCK, F_RESOLVER, F_NOTES]);
+
+    // Errormapping in issue-struct umwandeln und befuellen.
+    struct fullissue_s issue = (<fullissue_s>);
+    issue->type = err[F_TYPE];
+    issue->uid = uid;
+    issue->mtime = issue->ctime = issue->atime = time();
+    issue->count=1;
+    issue->loadname = load_name(err[F_OBJ]);
+    issue->message = err[F_MSG];
+    issue->obj = object_name(err[F_OBJ]);
+    // Normalisieren auf fuehrenden / und kein .c
+    if (err[F_PROG]!="unbekannt")
+        issue->prog = load_name(err[F_PROG]);
+    else
+        issue->prog = "unbekannt";
+    issue->titp = getuid(this_interactive() || this_player());
+    if (objectp(err[F_OBJ]))
+      issue->tienv = object_name(environment(err[F_OBJ]));
+
+    //DEBUG(sprintf("%O\n",issue));
+    issue->hashkey = hash(TLS_HASH_MD5,
+        sprintf("%d%s%s", issue->type, issue->loadname, issue->message));
+
+    // ggf. vorhandenen Fehler suchen - zugegeben: sollte bei von Spielern
+    // gemeldeten Dingen vermutlich nie vorkommen...
+    int oldid = getErrorID(issue->hashkey);
+    if (oldid >= 0)
+    {
+      // ggf. sicherstellen, dass er wieder eroeffnet wird.
+      db_reopen_issue(oldid, "<ErrorD>",
+                      "Automatisch wiedereroeffnet wegen erneutem Auftreten.");
+      db_countup_issue(oldid);
+      return issue->hashkey;
+    }
+
+    // sonst fuegen wir einen neuen Eintrag hinzu
+    // Spielergemeldete Bugs werden erstmal vor automatischem Loeschen
+    // geschuetzt, bis ein zustaendiger Magier ihn zur Kenntnis nimmt und
+    // entsperrt.
+    issue->locked = 1;
+    issue->locked_by = getuid(TI || PL);
+    issue->locked_time = time();
+
+    // In DB eintragen.
+    issue->id = db_insert_issue(issue);
+
+    lasterror[issue->type]=issue->id;
+
+    // Event triggern, aber nur eine Teilmenge der Daten direkt mitliefern.
+    EVENTD->TriggerEvent(EVT_LIB_NEW_ERROR,
+              ([F_TYPE: issue->type, F_HASHKEY:issue->hashkey,
+               F_UID:issue->uid, F_ID: issue->id]));
+
+    DEBUG(sprintf("LogReportedError: %s\n",issue->hashkey));
+
+    return issue->hashkey;
+}
+
+//Fehler registrieren
+//Diese Funktion darf nicht mehr als 200k Ticks verbrauchen und wird nur vom
+//Master gerufen!
+public int LogError(string msg,string prg,string curobj,int line,mixed culprit,
+    int caught)
+{
+    //DEBUG(sprintf("LogError: Prog: %O, Obj: %O,\n",prg,curobj));
+
+    //darf nur vom Master gerufen werden
+    if (!extern_call() || 
+        (previous_object() && previous_object() != master()))
+        return 0;
+
+    struct fullissue_s issue = (<fullissue_s>);
+
+    //UID bestimmen
+    issue->uid=(string)master()->creator_file(curobj);
+    //DEBUG(sprintf("LogError: UID: %s\n",uid));
+
+    //Loadname (besser als BP, falls rename_object() benutzt wurde) bestimmen
+    if (!stringp(curobj) || !sizeof(curobj))
+        issue->loadname = curobj = "<Unbekannt>";
+    else
+    {
+        //load_name nimmt Strings und Objects und konstruiert den loadname,
+        //wie er sein sollte, wenn das Objekt nicht mehr existiert.
+        issue->loadname=load_name(curobj);
+    }
+    if (!stringp(issue->loadname))
+    {
+        //hier kommt man rein, falls curobj ein 'kaputter' Name ist,
+        //d.h. load_name() 0 liefert.
+        issue->loadname="<Illegal object name>";
+    }
+
+    // Wenn curobj in /players/ liegt, es einen TI gibt, welcher ein Magier
+    // ist und dieser die Prop P_DONT_LOG_ERRORS gesetzt hat, wird der FEhler
+    // nicht gespeichert.
+    if (this_interactive() && IS_LEARNER(this_interactive())
+        && strstr(issue->loadname,WIZARDDIR)==0
+        && this_interactive()->QueryProp(P_DONT_LOG_ERRORS))
+    {
+        return 0;
+    }
+
+    // prg und curobj auf fuehrenden / und ohne .c am Ende normieren.
+    if (stringp(prg))
+        issue->prog = load_name(prg);
+    if (stringp(curobj) && curobj[0]!='/')
+    {
+      curobj="/"+curobj;
+    }
+
+    issue->obj = curobj;
+    issue->loc = line;
+    issue->message = msg;
+    issue->ctime = issue->mtime = issue->atime = time();
+    issue->type = T_RTERROR;
+    issue->count = 1;
+    issue->caught = caught;
+
+    //Hashkey bestimmen: Typ, Name der Blueprint des buggenden Objekts,
+    //Programmname, Zeilennr., Fehlermeldung
+    //TODO: evtl. sha1() statt md5()?
+    issue->hashkey=hash(TLS_HASH_MD5,
+        sprintf("%d%s%s%d%s", T_RTERROR, issue->loadname||"",
+                            issue->prog || "", issue->loc,
+                            issue->message||"<No error message given.>"));
+    DEBUG(sprintf("LogError: Hashkey: %s", issue->hashkey));
+
+    // ggf. vorhandenen Fehler suchen
+    int oldid = getErrorID(issue->hashkey);
+    if (oldid >= 0)
+    {
+      db_reopen_issue(oldid, "<ErrorD>",
+                      "Automatisch wiedereroeffnet wegen erneutem Auftreten.");
+      db_countup_issue(oldid);
+      return oldid;
+    }
+
+    //sonst fuegen wir einen neuen Eintrag hinzu
+    //DEBUG(sprintf("LogError: OBJ: %s, BP: %s",curobj,loadname));
+    // Wenn Fehler im HB, Objektnamen ermitteln
+    if (objectp(culprit))
+        issue->hbobj = object_name(culprit);
+
+    //gibt es einen TI/TP? Name mit erfassen
+    mixed tienv;
+    if(objectp(this_interactive()))
+    {
+        issue->titp=getuid(this_interactive());
+        tienv=environment(this_interactive());
+    }
+    else if (objectp(PL) && query_once_interactive(PL))
+    {
+        issue->titp=getuid(PL);
+        tienv=environment(PL);
+    }
+    else if (objectp(PL))
+    {
+        issue->titp=object_name(PL);
+        tienv=environment(PL);
+    }
+    if (objectp(tienv))
+        issue->tienv=object_name(tienv);
+
+    // Mal schauen, ob der Commandstack auch was fuer uns hat. ;-)
+    mixed cli;
+    if (pointerp(cli=command_stack()) && sizeof(cli))
+    {
+        issue->verb=cli[0][CMD_VERB];
+        issue->command=cli[0][CMD_TEXT];
+    }
+
+    //stacktrace holen
+    mixed stacktrace;
+    if (caught)
+        stacktrace=debug_info(DINFO_TRACE,DIT_ERROR);
+    else
+        stacktrace=debug_info(DINFO_TRACE,DIT_UNCAUGHT_ERROR);
+    // gueltige Stacktraces haben min. 2 Elemente.
+    // (leerer Trace: ({"No trace."}))
+    if (sizeof(stacktrace) > 1)
+    {
+      int i;
+      issue->stack = allocate(sizeof(stacktrace)-1);
+      // erstes Element ist 0 oder HB-Objekt: kein frame, daher ueberspringen
+      foreach(mixed entry : stacktrace[1..])
+      {
+        // frame->id will be set later by db_insert_issue().
+        struct frame_s frame = (<frame_s> type : entry[TRACE_TYPE],
+                                          name:  entry[TRACE_NAME],
+                                          prog:  entry[TRACE_PROGRAM],
+                                          obj:   entry[TRACE_OBJECT],
+                                          loc:   entry[TRACE_LOC],
+                                          ticks: entry[TRACE_EVALCOST]);
+        issue->stack[i] = frame;
+        ++i;
+      }
+    }
+
+    issue->id = db_insert_issue(issue);
+
+    lasterror[T_RTERROR]=issue->id;
+
+    // Event triggern, aber nur eine Teilmenge der Daten direkt mitliefern.
+    EVENTD->TriggerEvent(EVT_LIB_NEW_ERROR,
+              ([ F_TYPE: T_RTERROR, F_HASHKEY: issue->hashkey, F_UID:
+               issue->uid, F_ID: issue->id ]));
+
+//    DEBUG(sprintf("LogError: Fehlereintrag:\n%O\n",
+//          errors[uid][hashkey]));
+//    DEBUG(sprintf("LogError: Verbrauchte Ticks: %d\n",
+//          200000-get_eval_cost()));
+    return issue->id;
+}
+
+//Warnungen registrieren
+//Diese Funktion darf nicht mehr als 200k Ticks verbrauchen und wird nur vom
+//Master gerufen!
+public int LogWarning(string msg,string prg,string curobj,int line, int in_catch)
+{
+    //DEBUG(sprintf("LogWarning: Prog: %O, Obj: %O,\n",prg,curobj));
+
+    //darf nur vom Master gerufen werden
+    if (!extern_call() || 
+        (previous_object() && previous_object() != master()))
+        return 0;
+
+    struct fullissue_s issue = (<fullissue_s>);
+
+    //UID bestimmen
+    issue->uid=(string)master()->creator_file(curobj);
+    //DEBUG(sprintf("LogWarning UID: %s\n",uid));
+
+    //Loadname (besser als BP, falls rename_object() benutzt wurde) bestimmen
+    if (!stringp(curobj) || !sizeof(curobj))
+        issue->loadname = curobj = "<Unbekannt>";
+    else
+    {
+        //load_name nimmt Strings und Objects und konstruiert den loadname,
+        //wie er sein sollte, wenn das Objekt nicht mehr existiert.
+        issue->loadname=load_name(curobj);
+    }
+
+    if (!stringp(issue->loadname))
+        //hier sollte man reinkommen, falls curobj ein 'kaputter' Name ist,
+        //d.h. load_name() 0 liefert.
+        issue->loadname="<Illegal object name>";
+
+    // prg und curobj auf abs. Pfade normalisieren.
+    if (stringp(prg))
+        issue->prog=load_name(prg);
+    if (stringp(curobj) && curobj[0]!='/')
+    {
+      curobj="/"+curobj;
+    }
+
+    //DEBUG(sprintf("LogWarning: OBJ: %s, BP: %s\n",curobj,blue));
+
+    // Wenn curobj in /players/ liegt, es einen TI gibt, welcher ein Magier
+    // ist und dieser die Prop P_DONT_LOG_ERRORS gesetzt hat, wird der FEhler
+    // nicht gespeichert.
+    if (this_interactive() && IS_LEARNER(this_interactive())
+        && strstr(issue->loadname,WIZARDDIR)==0
+        && this_interactive()->QueryProp(P_DONT_LOG_ERRORS)) {
+        return 0;
+    }
+
+    //Hashkey bestimmen, Typ, Name der Blueprint des buggenden Objekts, Programm
+    //Zeilennr., Warnungsmeldung
+    issue->hashkey=hash(TLS_HASH_MD5,
+        sprintf("%d%s%s%d%s", T_RTWARN, issue->loadname, issue->prog, line,
+                           msg));
+    //DEBUG(sprintf("LogWarning: Hashkey: %s",hashkey));
+
+
+    // ggf. vorhandenen Fehler suchen
+    int oldid = getErrorID(issue->hashkey);
+    if (oldid >= 0)
+    {
+      db_reopen_issue(oldid, "<ErrorD>",
+                      "Automatisch wiedereroeffnet wegen erneutem Auftreten.");
+      db_countup_issue(oldid);
+      return oldid;
+    }
+
+    //sonst fuegen wir einen neuen Eintrag hinzu
+    // erstmal vervollstaendigen
+    issue->obj = curobj;
+    issue->message = msg;
+    issue->ctime = issue->mtime = issue->atime = time();
+    issue->loc = line;
+    issue->count = 1;
+    issue->type = T_RTWARN;
+    issue->caught = in_catch;
+
+    //gibt es einen TI/TP? Name mit erfassen
+    mixed tienv;
+    if(objectp(this_interactive()))
+    {
+        issue->titp=getuid(this_interactive());
+        tienv=environment(this_interactive());
+    }
+    else if (objectp(PL) && query_once_interactive(PL))
+    {
+        issue->titp=getuid(PL);
+        tienv=environment(PL);
+    }
+    else if (objectp(PL))
+    {
+        issue->titp=object_name(PL);
+        tienv=environment(PL);
+    }
+    if (objectp(tienv))
+        issue->tienv=object_name(tienv);
+
+    // Mal schauen, ob der Commandstack auch was fuer uns hat. ;-)
+    mixed cli;
+    if (pointerp(cli=command_stack()) && sizeof(cli))
+    {
+        issue->verb=cli[0][CMD_VERB];
+        issue->command=cli[0][CMD_TEXT];
+    }
+
+    issue->id = db_insert_issue(issue);
+
+    lasterror[T_RTWARN]=issue->id;
+    // Event triggern, aber nur eine Teilmenge der Daten direkt mitliefern.
+    EVENTD->TriggerEvent(EVT_LIB_NEW_ERROR,
+        ([F_TYPE: issue->type, F_ID: issue->id,
+          F_UID: issue->uid, F_HASHKEY: issue->hashkey]) );
+
+//    DEBUG(sprintf("LogWarning: Warnungseintrag:\n%O\n",
+//          warnings[uid][hashkey]));
+//    DEBUG(sprintf("LogWarning: Verbrauchte Ticks: %d\n",
+//          200000-get_eval_cost()));
+    return issue->id;
+}
+
+//Warnungen und Fehler beim Kompilieren  registrieren
+//Diese Funktion darf nicht mehr als 200k Ticks verbrauchen und wird nur vom
+//Master gerufen!
+public int LogCompileProblem(string file,string msg,int warn) {
+
+    //DEBUG(sprintf("LogCompileProblem: Prog: %O, Obj: %O,\n",file,msg));
+
+    //darf nur vom Master gerufen werden
+    if (!extern_call() || 
+        (previous_object() && previous_object() != master()))
+        return 0;
+
+    struct fullissue_s issue = (<fullissue_s>);
+
+    //UID bestimmen
+    issue->uid=(string)master()->creator_file(file);
+    //DEBUG(sprintf("LogCompileProblem UID: %s\n",uid));
+
+    // An File a) fuehrenden / anhaengen und b) endendes .c abschneiden. Macht
+    // beides netterweise load_name().
+    issue->loadname = load_name(file);
+    issue->type = warn ? T_CTWARN : T_CTERROR;
+
+    //loggen wir fuer das File ueberhaupt?
+    if (member(BLACKLIST,explode(issue->loadname,"/")[<1])>=0)
+        return 0;
+
+    //Hashkey bestimmen, in diesem Fall einfach, wir koennen die
+    //Fehlermeldunge selber nehmen.
+    issue->hashkey=hash(TLS_HASH_MD5,sprintf(
+          "%d%s%s",issue->type,issue->loadname, msg));
+    //DEBUG(sprintf("LogCompileProblem: Hashkey: %s",hashkey));
+
+    // ggf. vorhandenen Fehler suchen
+    int oldid = getErrorID(issue->hashkey);
+    if (oldid >= 0)
+    {
+      db_reopen_issue(oldid, "<ErrorD>",
+                      "Automatisch wiedereroeffnet wegen erneutem Auftreten.");
+      db_countup_issue(oldid);
+      return oldid;
+    }
+
+    // neuen Eintrag
+    issue->message = msg;
+    issue->count = 1;
+    issue->ctime = issue->mtime = issue->atime = time();
+
+    issue->id = db_insert_issue(issue);
+
+    if (warn) lasterror[T_CTWARN]=issue->id;
+    else lasterror[T_CTERROR]=issue->id;
+
+//    DEBUG(sprintf("LogCompileProblem: Eintrag:\n%O\n",
+//          (warn ? ctwarnings[uid][hashkey] : cterrors[uid][hashkey])));
+//   DEBUG(sprintf("LogCompileProblem: Verbrauchte Ticks: %d\n",
+//          200000-get_eval_cost()));
+   return issue->id;
+}
+
+/* ****************  Public Interface ****************** */
+
+//Einen bestimmten Fehler nach Hashkey suchen und als fullissue_s inkl. Notes
+//und Stacktrace liefern.
+struct fullissue_s QueryIssueByHash(string hashkey)
+{
+  struct fullissue_s issue = db_get_issue(0, hashkey);
+  if (structp(issue))
+    return filter_private(issue);
+  return 0;
+}
+//Einen bestimmten Fehler nach ID suchen und als fullissue_s inkl. Notes
+//und Stacktrace liefern.
+struct fullissue_s QueryIssueByID(int issueid)
+{
+  struct fullissue_s issue = db_get_issue(issueid, 0);
+  if (structp(issue))
+    return filter_private(issue);
+  return 0;
+}
+
+// den letzten Eintrag den jeweiligen Typ liefern.
+struct fullissue_s QueryLastIssue(int type)
+{
+    if (!member(lasterror,type))
+        return 0;
+    //einfach den kompletten letzten Eintrag zurueckliefern
+    return(QueryIssueByID(lasterror[type]));
+}
+
+// Liefert alle Issues, deren obj,prog oder loadname gleich <file> ist.
+public struct fullissue_s* QueryIssuesByFile(string file, int type)
+{
+  mixed rows = sl_exec("SELECT * FROM issues "
+                       "WHERE (loadname=?1 OR prog=?1 OR obj=?1) "
+                       "AND deleted=0 AND resolved=0 AND type=?2"
+                       "ORDER BY type,mtime;", file, type);
+  if (pointerp(rows))
+  {
+    struct fullissue_s* ilist = allocate(sizeof(rows));
+    int i;
+    foreach(mixed row : rows)
+    {
+      // Einfachster Weg - funktioniert aber nur, solange die Felder in der DB
+      // die gleiche Reihenfolge wie in der struct haben! Entweder immer
+      // sicherstellen oder Ergebnisreihenfolge oben im select festlegen!
+      struct fullissue_s issue = to_struct( row, (<fullissue_s>) );
+      if (issue->type == T_RTERROR)
+          issue->stack = db_get_stack(issue->id);
+      issue->notes = db_get_notes(issue->id);
+      ilist[i] = filter_private(issue);
+      ++i;
+    }
+    return ilist;
+  }
+  return 0;
+}
+
+// Liefert eine Liste von allen IDs, Loadnames, UIDs und Typen fuer die
+// angebenen <type> und <uid>.
+varargs < <int|string>* >* QueryIssueListByFile(string file)
+{
+  mixed rows = sl_exec("SELECT id,loadname,obj,prog,loc FROM issues "
+                       "WHERE (loadname=?1 OR prog=?1 OR obj=?1) "
+                       "AND deleted=0 AND resolved=0 "
+                       "ORDER BY type,mtime;", file);
+  return rows;
+}
+
+// Liefert eine Liste von allen IDs, Loadnames, UIDs und Typen fuer die
+// angebenen <type> und <uid>.
+varargs < <int|string>* >* QueryIssueListByLoadname(string file, int type)
+{
+  mixed rows;
+  if (type && file)
+  {
+     rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
+                       "WHERE loadname=?1 AND type=?2 AND deleted=0 "
+                       "AND resolved=0 "
+                       "ORDER BY type,mtime;", file, type);
+  }
+  else if (type)
+  {
+     rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
+                       "WHERE type=?1 AND deleted=0 AND resolved=0 "
+                       "ORDER BY type,mtime;", type);
+  }
+  else if (file)
+  {
+    rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
+                       "WHERE loadname=?1 AND deleted=0 AND resolved=0 "
+                       "ORDER BY type,mtime;", file);
+  }
+  return rows;
+}
+
+
+// Liefert eine Liste von allen IDs, Loadnames, UIDs und Typen fuer die
+// angebenen <type> und <uid>.
+varargs < <int|string>* >* QueryIssueList(int type, string uid)
+{
+  mixed rows;
+  if (type && uid)
+  {
+    rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
+                   "WHERE type=?1 AND uid=?2 AND deleted=0 "
+                   "AND resolved=0 "
+                   "ORDER BY type,rowid;", type,uid);
+  }
+  else if (type)
+  {
+    rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
+                   "WHERE type=?1 AND deleted=0 AND resolved=0 "
+                   "ORDER BY type,rowid;", type);
+  }
+  else if (uid)
+  {
+    rows = sl_exec("SELECT id,loadname,uid,type FROM issues "
+                   "WHERE uid=?1 AND deleted=0 AND resolved=0 "
+                   "ORDER BY type,rowid;", uid);
+  }
+  return rows;
+}
+
+varargs string* QueryUIDsForType(int type) {
+    //liefert alle UIDs fuer einen Fehlertyp oder fuer alle Fehlertypen
+    string** rows;
+
+    if (type)
+    {
+      rows = sl_exec("SELECT uid FROM issues "
+                     "WHERE type=?1 AND deleted=0 AND resvoled=0;", type);
+    }
+    else
+      rows = sl_exec("SELECT uid FROM issues WHERE deleted=0 "
+                     "AND resolved=0;");
+
+    return map(rows, function string (string* item)
+                     {return item[0];} );
+}
+
+//Wieviele unterschiedliche Fehler in diesem Typ?
+varargs int QueryUniqueIssueCount(int type, string uid)
+{
+  int** rows;
+
+  if (type && uid)
+  {
+    rows = sl_exec("SELECT count(*) FROM issues "
+                   "WHERE type=?1 AND uid=?2 AND deleted=0 AND resolved=0;",
+                   type, uid);
+  }
+  else if (type)
+  {
+    rows = sl_exec("SELECT count(*) FROM issues "
+                   "WHERE type=?1 AND deleted=0 AND resolved=0;",
+                   type);
+  }
+  else if (uid)
+  {
+    rows = sl_exec("SELECT count(*) FROM issues "
+                   "WHERE uid=?1 AND deleted=0 AND resolved=0;",
+                   uid);
+  }
+  else
+    rows = sl_exec("SELECT count(*) FROM issues "
+                   "WHERE deleted=0 AND resolved=0;");
+
+  return rows[0][0];
+}
+
+//Einen bestimmten Fehler loeschen
+varargs int ToggleDeleteError(int issueid, string note)
+{
+  mixed rows = sl_exec("SELECT uid,deleted from issues WHERE id=?1;",
+                       issueid);
+  if (!pointerp(rows))
+    return -1;
+  
+  if (!access_check(rows[0][0], M_DELETE))
+    //zugriff zum Schreiben nicht gestattet
+    return -10;
+
+//  sl_exec("BEGIN TRANSACTION;");
+  if (rows[0][1])
+  {
+    // was deleted -> undelete it
+    sl_exec("UPDATE issues SET deleted=0,mtime=?2 WHERE id=?1;",
+            issueid,time());
+    db_add_note((<note_s> id: issueid, time: time(), user: getuid(TI),
+                          txt: sprintf("Loeschmarkierung entfernt. (%s)",
+                                       note ? note: "<kein Kommentar>")
+                ));
+  }
+  else
+  {
+    // was not deleted -> delete it.
+    sl_exec("UPDATE issues SET deleted=1,mtime=?2 WHERE id=?1;",
+            issueid, time());
+    db_add_note((<note_s> id: issueid, time: time(), user: getuid(TI),
+                          txt: sprintf("Loeschmarkierung gesetzt. (%s)",
+                                       note ? note: "<kein Kommentar>")
+                ));
+  }
+//  sl_exec("COMMIT;");
+  return !rows[0][1];
+}
+
+
+// sperrt den Eintrag oder entsperrt ihn.
+// Sperre heisst hier, dass der Fehler vom Expire nicht automatisch geloescht
+// wird.
+varargs int LockIssue(int issueid, string note) {
+    return set_lock(issueid, 1, note);
+}
+
+varargs int UnlockIssue(int issueid, string note) {
+    return set_lock(issueid, 0, note);
+}
+
+// einen Fehler als gefixt markieren
+varargs int ResolveIssue(int issueid, string note) {
+    return set_resolution(issueid, 1, note);
+}
+// einen Fehler als nicht gefixt markieren
+varargs int ReOpenIssue(int issueid, string note) {
+    return set_resolution(issueid, 0, note);
+}
+
+varargs int AddNote(int issueid, string note)
+{
+
+    if (!stringp(note) || !sizeof(note))
+      return(-3);
+
+    // existiert die ID in der DB?
+    struct fullissue_s issue = db_get_issue(issueid,0);
+    if (!issue)
+      return -1;
+
+    if (!access_check(issue->uid, M_WRITE))
+        //zugriff zum Schreiben nicht gestattet
+        return(-10);
+
+    return db_add_note((<note_s> id: issueid, time: time(), user: getuid(TI),
+                                 txt: note));
+}
+
+//Einen bestimmten Fehler einer anderen UID zuweisen.
+//Hashkey ist zwar eindeutig, aber Angabe der
+//der UID ist deutlich schneller. Weglassen des Typs nochmal langsamer. ;-)
+//Potentiell also sehr teuer, wenn man UID oder UID+Typ weglaesst.
+varargs int ReassignIssue(int issueid, string newuid, string note)
+{
+    struct fullissue_s issue = db_get_issue(issueid,0);
+    if (!issue)
+      return -1;
+
+    if (!access_check(issue->uid, M_REASSIGN))
+        //zugriff zum Schreiben nicht gestattet
+        return(-10);
+
+    return db_reassign_issue(issueid, newuid, note);
+}
+
+/* *********** Eher fuer Debug-Zwecke *********************** */
+/*
+mixed QueryAll(int type) {
+    //das koennte ein sehr sehr grosses Mapping sein, ausserdem wird keine
+    //Kopie zurueckgegeben, daher erstmal nur ich...
+    if (!this_interactive() || 
+        member(MAINTAINER,getuid(this_interactive()))<0)
+        return(-1);
+    if (process_call()) return(-2);
+    if (!type) return(-3);
+    return(errors[type]);
+}
+
+mixed QueryResolved()
+{
+    //das koennte ein sehr sehr grosses Mapping sein, ausserdem wird keine
+    //Kopie zurueckgegeben, daher erstmal nur ich...
+    if (!this_interactive() || 
+        member(MAINTAINER,getuid(this_interactive()))<0)
+        return(-1);
+    if (process_call()) return(-2);
+    return(resolved);
+}
+*/
+
+/* *****************  Internal Stuff   ******************** */
+void create() {
+    seteuid(getuid(ME));
+
+    if (sl_open("/secure/ARCH/errord.sqlite") != 1)
+    //if (sl_open("/errord.sqlite") != 1)
+    {
+      raise_error("Datenbank konnte nicht geoeffnet werden.\n");
+    }
+    sl_exec("PRAGMA foreign_keys = ON; PRAGMA temp_store = 2; ");
+    //string* res=sl_exec("PRAGMA quick_check(N);");
+    //if (pointerp(res))
+    //{
+    //  raise_error("");
+    //}
+    //sl_exec("CREATE TABLE issue(id INTEGER,haskey TEXT);");
+    foreach (string cmd :
+        explode(read_file("/secure/ARCH/errord.sql.init"),";\n"))
+    {
+      if (sizeof(cmd) && cmd != "\n")
+      {
+        sl_exec(cmd);
+      }
+    }
+    sl_exec("ANALYZE main;");
+
+    lasterror=([]);
+}
+
+string name() {return("<Error-Daemon>");}
+
+void save_me(int now) {
+  if (now)
+    save_object(SAVEFILE);
+  else if (find_call_out(#'save_object)==-1) {
+    call_out(#'save_object, 30, SAVEFILE);
+  }
+}
+
+varargs int remove(int silent) {
+    save_me(1);
+    destruct(ME);
+    return(1);
+}
+
+
+// sperrt den Eintrag (lock!=0) oder entsperrt ihn (lock==0). 
+// Sperre heisst hier, dass der Fehler vom Expire nicht automatisch geloescht
+// wird.
+// liefert <0 im Fehlerfall, sonst Array mit Lockdaten
+private varargs int set_lock(int issueid, int lock, string note)
+{
+    struct fullissue_s issue = db_get_issue(issueid,0);
+    if (!issue)
+      return -1;
+
+    if (!access_check(issue->uid, M_WRITE))
+        //zugriff zum Schreiben nicht gestattet
+        return(-10);
+
+    return db_set_lock(issueid, lock, note);
+}
+
+//markiert einen Fehler als gefixt, mit 'note' als Bemerkung (res!=0) oder
+//markiert einen Fehler wieder als nicht-gefixt (resolution==0)
+//liefert < 0 im Fehlerfall, sonst den neuen Zustand.
+private varargs int set_resolution(int issueid, int resolution, string note)
+{
+    struct fullissue_s issue = db_get_issue(issueid,0);
+    if (!issue)
+      return -1;
+
+    // Fixen duerfen nur zustaendige
+    if (resolution
+        && !access_check(issue->uid, M_FIX))
+      return -10;
+    // ggf. Fix zurueckziehen darf jeder mit M_WRITE
+    if (!resolution &&
+        !access_check(issue->uid, M_WRITE))
+      return -10;
+
+    int res = db_set_resolution(issueid, resolution, note);
+
+    if (res == 1)
+    {
+      // Fehler jetzt gefixt.
+      versende_mail(db_get_issue(issueid,0));  // per Mail verschicken
+    }
+
+    return res;
+}
+
+//ist der Zugriff auf uid erlaubt? Geprueft wird TI (wenn kein TI, auch kein
+//Schreibzugriff)
+//mode gibt an, ob lesend oder schreibend
+private int access_check(string uid, int mode) {
+
+    if (mode==M_READ)
+        return LEARNER_SECURITY;  //lesen darf jeder Magier
+
+    // In process_string() schonmal gar nicht.
+    if (process_call()) return(0);
+    // EM+ duerfen alles loeschen.
+    if (ARCH_SECURITY) return(1);
+    // eigene UIDs darf man auch vollumfaenglich bearbeiten.
+    if (secure_euid()==uid) return(1);
+
+    // alles andere wird speziell geprueft
+    switch(mode)
+    {
+      // M_WRITE ist zur zeit eigentlich immer nen Append - das duerfen zur
+      // Zeit alle ab Vollmagier
+      case M_WRITE:
+        return LEARNER_SECURITY;
+        break;
+      // Loeschen und Fixen duerfen zur Zeit nur Zustaendige.
+      case M_DELETE:
+      case M_REASSIGN:
+      case M_FIX:
+        // Master nach UIDs fragen, fuer die der jew. Magier
+        // zustaendig ist.
+        if (member((string *)master()->QueryUIDsForWizard(secure_euid()),uid) >= 0)
+          return 1;
+
+        break;
+    }
+
+    return(0);        //Fall-through, neinRNER_SECURITY
+}
+
+public string format_stacktrace(struct frame_s* stacktrace) {
+    string *lines;
+
+    if (!pointerp(stacktrace) || !sizeof(stacktrace))
+        return("");
+
+    lines=allocate(sizeof(stacktrace));
+    int i;
+    foreach(struct frame_s frame: stacktrace)
+    {
+      lines[i]=sprintf("Fun: %.20O in Prog: %.40s\n"
+                       "   Zeile: %.8d [%.50s]\n"
+                       "   Evalcosts: %d",
+                       frame->name,frame->prog,
+                       frame->loc,frame->obj,frame->ticks);
+      ++i;
+    }
+    return(implode(lines,"\n"));
+}
+
+public string format_notes(struct note_s* notes)
+{
+  int i;
+  string text="";
+  foreach(struct note_s note: notes)
+  {
+    text+=sprintf("Notiz %d von %.10s am %.30s\n%s",
+        ++i,capitalize(note->user),dtime(note->time),
+        break_string(note->txt, 78,"  "));
+  }
+  return text;
+}
+
+public string format_error_spieler(struct fullissue_s issue)
+{
+  string txt;
+  string *label;
+
+  if (!issue)
+    return 0;
+
+  switch(issue->type)
+  {
+    case T_RTERROR:
+      label=({"Laufzeitfehler","Dieser Laufzeitfehler"});
+      break;
+    case T_REPORTED_ERR:
+      label=({"Fehlerhinweis","Dieser Fehlerhinweis"});
+      break;
+    case T_REPORTED_TYPO:
+      label=({"Typo","Dieser Typo"});
+      break;
+    case T_REPORTED_IDEA:
+      label=({"Idee","Diese Idee"});
+      break;
+    case T_REPORTED_MD:
+      label=({"Fehlendes Detail","Dieses fehlende Detail"});
+      break;
+    case T_RTWARN:
+      label=({"Laufzeitwarnung","Diese Laufzeitwarnung"});
+      break;
+    case T_CTWARN:
+      label=({"Ladezeitwarnung","Diese Ladezeitwarnung"});
+      break;
+    case T_CTERROR:
+      label=({"Ladezeitfehler","Dieser Ladezeitfehler"});
+      break;
+    default: return 0;
+  }
+
+  txt=sprintf( "\nDaten fuer %s mit ID '%s':\n"
+               "Zeit: %25s\n",
+               label[0], issue->hashkey,
+               dtime(issue->ctime)
+              );
+
+  txt+=sprintf("%s",break_string(issue->message,78,
+                  "Meldung:    ",BS_INDENT_ONCE));
+
+  if (pointerp(issue->notes))
+      txt+="Bemerkungen:\n"+format_notes(issue->notes)+"\n";
+
+  return txt;
+}
+
+public string format_error(struct fullissue_s issue, int only_essential)
+{
+  string txt;
+  string *label;
+
+  if (!issue)
+    return 0;
+
+  switch(issue->type)
+  {
+    case T_RTERROR:
+      label=({"Laufzeitfehler","Dieser Laufzeitfehler"});
+      break;
+    case T_REPORTED_ERR:
+      label=({"Fehlerhinweis","Dieser Fehlerhinweis"});
+      break;
+    case T_REPORTED_TYPO:
+      label=({"Typo","Dieser Typo"});
+      break;
+    case T_REPORTED_IDEA:
+      label=({"Idee","Diese Idee"});
+      break;
+    case T_REPORTED_MD:
+      label=({"Fehlendes Detail","Dieses fehlende Detail"});
+      break;
+    case T_RTWARN:
+      label=({"Laufzeitwarnung","Diese Laufzeitwarnung"});
+      break;
+    case T_CTWARN:
+      label=({"Ladezeitwarnung","Diese Ladezeitwarnung"});
+      break;
+    case T_CTERROR:
+      label=({"Ladezeitfehler","Dieser Ladezeitfehler"});
+      break;
+    default: return 0;
+  }
+
+  txt=sprintf( "\nDaten fuer %s mit ID %d:\n"
+               "Hashkey: %s\n"
+               "Zeit: %25s (Erstmalig: %25s)\n",
+               label[0], issue->id, issue->hashkey,
+               dtime(abs(issue->mtime)),dtime(issue->ctime)
+              );
+
+  if (stringp(issue->prog))
+      txt += sprintf(
+               "Programm:   %.60s\n"
+               "Zeile:      %.60d\n",
+               issue->prog, issue->loc
+               );
+
+  if (stringp(issue->obj))
+      txt+=sprintf("Objekt:     %.60s\n",
+               issue->obj);
+
+  txt += sprintf("Loadname:   %.60s\n"
+                 "UID:        %.60s\n",
+                 issue->loadname, issue->uid);
+
+  txt+=sprintf("%s",break_string(issue->message,78,
+                  "Meldung:    ",BS_INDENT_ONCE));
+  if (stringp(issue->hbobj))
+      txt+=sprintf(
+               "HB-Obj:     %.60s\n",issue->hbobj);
+
+  if (stringp(issue->titp)) {
+      txt+=sprintf(
+               "TI/TP:      %.60s\n",issue->titp);
+      if (stringp(issue->tienv))
+          txt+=sprintf(
+               "Environm.:  %.60s\n",issue->tienv);
+  }
+
+  if (!stringp(issue->command) ||
+      !ARCH_SECURITY || process_call())
+  {
+      // Kommandoeingabe ist Privatsphaere und darf nicht von jedem einsehbar
+      // sein.
+      // in diesem Fall aber zumindest das Verb ausgeben, so vorhanden
+      if (issue->verb)
+          txt+=sprintf(
+              "Verb:        %.60s\n",issue->verb);
+  }
+  // !process_call() && ARCH_SECURITY erfuellt...
+  else if (stringp(issue->command))
+      txt+=sprintf(
+          "Befehl:     %.60s\n",issue->command);
+
+  if (issue->caught)
+      txt+=label[1]+" trat in einem 'catch()' auf.\n";
+
+  if (!only_essential)
+  {
+    if (issue->deleted)
+        txt+=label[1]+" wurde als geloescht markiert.\n";
+
+    if (issue->locked)
+        txt+=break_string(
+            sprintf("%s wurde von %s am %s vor automatischem Loeschen "
+            "geschuetzt (locked).\n",
+            label[1],issue->locked_by, dtime(issue->locked_time)),78);
+    if (issue->resolved)
+        txt+=label[1]+" wurde als erledigt markiert.\n";
+  }
+
+  txt+=sprintf("%s trat bisher %d Mal auf.\n",
+               label[1],issue->count);
+
+  if (pointerp(issue->stack))
+      txt+="Stacktrace:\n"+format_stacktrace(issue->stack)+"\n";
+
+  if (pointerp(issue->notes))
+      txt+="Bemerkungen:\n"+format_notes(issue->notes)+"\n";
+
+  return txt;
+}
+
+// letzter Aenderung eines Spieler-/Magiersavefiles. Naeherung fuer letzten
+// Logout ohne das Savefile einzulesen und P_LAST_LOGOUT zu pruefen.
+private int recent_lastlogout(string nam, int validtime)
+{
+  if (!nam || sizeof(nam)<2) return 0;
+  return file_time("/"LIBSAVEDIR"/" + nam[0..0] + "/" + nam + ".o") >= validtime;
+}
+
+// Versendet Mail an zustaendigen Magier und ggf. Spieler, der den Eintrag
+// erstellt hat.
+// ACHTUNG: loescht issue->command.
+private int versende_mail(struct fullissue_s issue)
+{
+  // Versendet eine mail mit dem gefixten Fehler.
+  mixed *mail;
+  string text, *empf;
+  int res = -1;
+
+  mail = allocate(9);
+  mail[MSG_FROM] = "<Fehler-Daemon>";
+  mail[MSG_SENDER] = getuid(TI);
+  mail[MSG_BCC] = 0;
+  mail[MSG_SUBJECT] = sprintf("Fehler/Warnung in %s behoben", issue->loadname);
+  mail[MSG_DATE] = dtime(time());
+
+  // auch wenn ein EM fixt, sollen die Empfaenger nicht automatisch die
+  // Spielereingabe erhalten, also command loeschen.
+  issue->command = 0;
+
+  // erstmal eine Mail an zustaendige Magier.
+  empf = (string*)master()->QueryWizardsForUID(issue->uid);
+  // lang (180 Tage) nicht eingeloggte Magier ausfiltern
+  empf = filter(empf, #'recent_lastlogout, time() - 15552000);
+  if (sizeof(empf))
+  {
+
+    text = break_string(
+      sprintf(STANDARDMAILTEXT,capitalize(getuid(TI)))
+      +format_error(issue, 1),78,"",BS_LEAVE_MY_LFS);
+
+    mail[MSG_RECIPIENT] = empf[0];
+    if (sizeof(empf)>1)
+      mail[MSG_CC] = empf[1..];
+    else
+      mail[MSG_CC] = 0;
+    mail[MSG_BODY]=text;
+    mail[MSG_ID]=sprintf(MUDNAME": %d.%d",time(),random(__INT_MAX__));
+
+    if (!sizeof("/secure/mailer"->DeliverMail(mail,0)))
+      res = -1; // an niemanden erfolgreich zugestellt. :-(
+    else
+      res = 1;
+  }
+
+  // Bei von Spielern gemeldeten Fehler werden Spieler bei
+  // Erledigung informiert, wenn deren letzter Logout weniger als 180 Tage her
+  // ist.
+  if ( (issue->type &
+        (T_REPORTED_ERR|T_REPORTED_TYPO|T_REPORTED_IDEA|T_REPORTED_MD))
+      && issue->titp
+      && recent_lastlogout(issue->titp, time() - 15552000) )
+  {
+    text = break_string(
+      sprintf(STANDARDMAILTEXT_ERRORHINT,
+        capitalize(issue->titp), capitalize(getuid(TI)))
+      +format_error_spieler(issue), 78,"",BS_LEAVE_MY_LFS);
+
+    mail[MSG_ID]=sprintf(MUDNAME": %d.%d",time(),random(__INT_MAX__));
+    mail[MSG_RECIPIENT] = issue->titp;
+    mail[MSG_CC] = 0;
+    mail[MSG_SUBJECT] = sprintf("Fehler/Idee/Typo wurde von %s behoben",
+                                getuid(TI));
+    mail[MSG_BODY] = text;
+
+    if (!sizeof("/secure/mailer"->DeliverMail(mail,0)))
+      res |= -1;
+    else
+      res |= 1;
+  }
+
+  return res;
+}
+
+void reset()
+{
+  // geloeschte Issues sofort, gefixte 30 Tage nach letzter Aenderung
+  // loeschen.
+  sl_exec("DELETE FROM issues WHERE deleted=1;");
+  sl_exec("DELETE FROM issues WHERE resolved=1 AND mtime<?1;",
+          time()-30*24*3600);
+  set_next_reset(3600*24);
+}
+
+// Nicht jeder Magier muss den ErrorD direkt zerstoeren koennen.
+public string NotifyDestruct(object caller) {
+  if( (caller!=this_object() && !ARCH_SECURITY) || process_call() ) {
+    return "Du darfst den Error-Daemon nicht zerstoeren!\n";
+  }
+  return 0;
+}
+
