diff --git a/p/daemon/debug.c b/p/daemon/debug.c
new file mode 100644
index 0000000..0ad6975
--- /dev/null
+++ b/p/daemon/debug.c
@@ -0,0 +1,128 @@
+
+#pragma strict_types,save_types
+#pragma no_clone,no_shadow
+
+#include <daemon.h>
+#include <logging.h>
+
+static int d_start, d_end, e_start, e_end;
+
+protected void create()
+{    
+    d_end = d_start = e_end = e_start = file_size(__DEBUG_LOG__);
+}
+
+int check( string ch, object pl, string cmd, string txt )
+{
+    mixed tmp;
+    
+    if ( ch != "Debug" && ch != "Entwicklung" && ch != "Warnungen" )
+        return 0;
+    
+    if( objectp(pl) && query_once_interactive(pl) && query_wiz_level(pl) > 15 )
+        switch(cmd){
+        case C_FIND:
+        case C_LIST:
+        case C_JOIN:
+        case C_LEAVE:
+            return 1;
+        case C_SEND:
+            // Wer (noch) nicht auf dem Kanal ist, bekommt auch keine
+            // Ausgabe - sonst gibt es selbige doppelt, da der CHMASTER
+            // einen automatisch den Kanal betreten laesst ...
+            if ( !objectp(pl) || !pointerp(tmp=(mixed)pl->QueryProp(P_CHANNELS)) ||
+                 member( tmp, lower_case(ch) ) == -1 )
+                return 1;
+
+            switch( lower_case(txt) ){
+            case "backtrace":
+                {
+                    string bt, log;
+                    int start, end;
+                    
+                    if ( ch == "Debug" ) {
+                        start = d_start;
+                        end = d_end;
+                    }
+                    else if (ch == "Entwicklung") {
+                        start = e_start;
+                        end = e_end;
+                    }
+		    else if (ch == "Warnungen") {
+			pl->Message( "[" + ch + ":] Backtrace fuer Warnungen "
+			    "nicht verfuegbar!\n");
+			return 0;
+		    }
+		    else return(1);
+                    
+                    if( start >= end ) 
+                        bt = "[" + ch + ":] Kein Backtrace verfuegbar!\n";
+                    else {
+                        log = regreplace( read_bytes( __DEBUG_LOG__, start,
+                                                      (end-start>10000)?10000:
+						      end - start ) || "\nFehler beim Einlesen des Debuglogs: Kein Backtrace verfuegbar!\n",
+                                          "(Misplaced|current_object|"
+                                          "Connection|Host)[^\n]*\n",
+                                          "", 1 );
+                        bt = "[" + ch + ":] -- BACKTRACE BEGIN --\n"
+                            + log
+                            + "[" + ch + ":] -- BACKTRACE END --\n";
+                    }
+                    
+                    call_out( symbol_function( "Message", pl ), 0, bt );
+                }
+                break;
+
+            default:
+		if ( ch != "Warnungen" ) {
+		  pl->Message( "[" + ch + ":] Hilfe...\n"
+                             "[" + ch + ":] Folgende Kommandos stehen zur "
+                             "Verfuegung:\n"
+                             "[" + ch + ":] 'backtrace' -- sendet den "
+                             "Backtrace zum Fehler\n"
+                             "[" + ch + ":] 'hilfe'     -- sendet diese "
+                             "Hilfeseite\n");
+		}
+		else {
+		  pl->Message( "[" + ch + ":] Keine Kommandos verfuegbar!\n");
+		}
+            }
+	}
+    
+    return 0;
+}
+
+string name() { return "<Debugger>"; }
+string Name() { return "<Debugger>"; }
+
+void ChannelMessage( mixed a )
+{
+    int fs;
+
+    fs = file_size(__DEBUG_LOG__);
+    
+    switch( a[0] ){
+    case "Debug":
+        if (  fs > d_end && fs > e_end ){
+	    d_start = max((d_end > e_end ? d_end : e_end),0);
+            d_end = fs;
+        }
+        else if (fs < d_start || fs <= d_end) {
+	    // Debuglog wurde wohl neu geoeffnet.
+	    d_start = d_end = e_start = e_end = fs;
+	}
+        break;
+        
+    case "Entwicklung":
+        if (  fs > d_end && fs > e_end ){
+	    e_start = max((e_end > d_end ? e_end : d_end),0);
+            e_end = fs;
+        }
+        else if (fs < e_start || fs <= e_end) {
+	    // Debuglog wurde wohl neu geoeffnet.
+	    d_start = d_end = e_start = e_end = fs;
+	}
+        break;
+    }
+}
+ 
