diff --git a/secure/master.c b/secure/master.c
index cae4be1..22d4675 100644
--- a/secure/master.c
+++ b/secure/master.c
@@ -410,10 +410,6 @@
   for (i=sizeof(wl); i--; )
     set_extra_wizinfo(wl[i][WL_NAME], wl[i][WL_EXTRA] * 99 / 100);
 
-  // Dann noch Mails bearbeiten
-  mails_last_hour=0;
-  mailread();
-
   return;
 }
 
diff --git a/secure/master/network.c b/secure/master/network.c
index f60cc40..10beccb 100644
--- a/secure/master/network.c
+++ b/secure/master/network.c
@@ -60,165 +60,6 @@
     return (passwd == pwhash);
 }
 
-static int doReadMail( string file )
-{
-    string str, *lines, *parts, *tmp;
-    mixed *message;
-    int i, j;
-
-    if ( (i = file_size(file)) > 50000 || i < 5 ){
-        rm(file);
-        DEBUG( "Mail size invalid\n" );
-        return -1;
-    }
-
-    if ( !(str = read_bytes( file, 0, 50000 )) )
-        return -1;
-
-    if ( !(j = sizeof(lines = explode( str, "\n" ))) )
-        return -2;
-
-    i = 0;
-
-    while ( i < j && lines[i] != "" )
-        i++;
-
-    if ( i == j )
-        return -2;
-
- DEBUG( sprintf( "Have %d headerlines:\n", i ) );
-
-    message= allocate(9);
-    message[MSG_CC] = ({});
-    message[MSG_BCC] = ({});
-    message[MSG_BODY] = implode( lines[i..], "\n" );
-
-    for ( j = 0; j < i; j++ ){
-        parts = explode( lines[j], ":" );
-
-        if ( sizeof(parts) > 1 ){
-            str = lower_case(parts[0]);
-            parts[0] = implode( parts[1..], ":" );
-
-            switch (str){
-            case "subject":
-                message[MSG_SUBJECT] = parts[0];
-                break;
-
-            case "from":
-                DEBUG( "Found from\n" );
-                DEBUG( sprintf( "PARTS[0]=%s\n", parts[0] ) );
-                message[MSG_FROM] = mail_normalize(parts[0]);
-                message[MSG_SENDER] = parts[0];
-                DEBUG( sprintf( "FROM: %s\nSENDER: %s\n",
-                                message[MSG_FROM],
-                                message[MSG_SENDER] ) );
-                break;
-
-            case "cc":
-                DEBUG( sprintf("FOUND CC: %O\n", parts[0]) );
-                message[MSG_CC] += mk_rec_list(parts[0]);
-                break;
-
-            case "bcc":
-                DEBUG( sprintf("FOUND BCC: %O\n", parts[0]) );
-                message[MSG_BCC] += mk_rec_list(parts[0]);
-                break;
-
-            case "to":
-                DEBUG( sprintf("FOUND TO: %O\n", parts[0]) );
-                tmp = mk_rec_list(parts[0]);
-
-                if ( !message[MSG_RECIPIENT] )
-                    message[MSG_RECIPIENT] = tmp[0];
-
-                message[MSG_CC] += tmp;
-                break;
-
-            // Das MUD-TO: wird vom Perlskript als erste Headerzeile eingefuegt
-            case "mud-to":
-                DEBUG( sprintf("FOUND MUD-TO: %O\n", parts[0]) );
-                message[MSG_RECIPIENT] = mail_normalize(lower_case(parts[0]));
-                break;
-            }
-        }
-    }
-
-    // Eigentlichen Empfaenger aus CC: loeschen
-    message[MSG_CC] -= ({ message[MSG_RECIPIENT],
-                          message[MSG_RECIPIENT]+"@mg.mud.de",
-                          message[MSG_RECIPIENT]+"@morgengrauen.mud.de" });
-
-
- DEBUG( sprintf( "TO: %O\n", message[MSG_RECIPIENT] ) );
-    DEBUG( sprintf( "CC: %O\n", message[MSG_CC] ) );
-    DEBUG( sprintf( "BCC: %O\n", message[MSG_BCC] ) );
-
-    if ( !stringp(message[MSG_FROM]) )
-        return -2;
-
-    if ( !stringp(message[MSG_RECIPIENT]) ){
-        str = explode( file, "/" )[<1];
-        i = 0;
-        j = sizeof(str);
-
-        while ( i < j && str[i] <= '9' && str[i] >= '0' )
-            i++;
-
-        if ( i >= j )
-            return -2;
-        
-        message[MSG_RECIPIENT] = str[i..];
-  DEBUG( sprintf( "EMERGENCY RECIPIENT=%s\n", str[i..] ) );
-    }
-
-    rm(file);
-
-    // Da vom Master besser nichts von ausserhalb /secure #include't wird,
-    // direkt die '5'. Normalerweise hiesse der Aufruf:
-    // DeliverMail( message, NO_USER_ALIASES|NO_CARBON_COPIES );
-    "/secure/mailer"->DeliverMail( message, 5 );
-    return 1;
-}
-
-
-public void mailread()
-{
-    string *files;
-    int i;
-
-    DEBUG( "mailread called\n" );
-
-    if ( mails_last_hour >= MAX_MAILS_PER_HOUR )
-        return;
-
-    files = (get_dir( "/mail/inbound/*" )||({})) - ({ "..", "." });
-    i = sizeof(files);
-
-    while ( i-- && mails_last_hour < MAX_MAILS_PER_HOUR ){
-        DEBUG( "FOUND FILE \"" + files[i] + "\" ...\n" );
-        mails_last_hour++;
-
-        if ( doReadMail( "/mail/inbound/" + files[i]) < -1 ){
-            mixed message;
-
-            message = allocate(9);
-            mails_last_hour++;
-            rename( "/mail/inbound/" + files[i],
-                    "/secure/ARCH/MAIL/" + files[i] );
-            message[MSG_SENDER] = geteuid();
-            message[MSG_FROM] = getuid();
-            message[MSG_SUBJECT] = "Fehlerhafte Mail: /secure/ARCH/MAIL/" +
-                files[i];
-            message[MSG_RECIPIENT] = "mud@mg.mud.de";
-            message[MSG_BODY] = "Bitte Ueberpruefen!\n";
-            // NO_SYSTEM_ALIASES|NO_USER_ALIASES == 3
-            "/secure/mailer"->DeliverMail( message, 3 );
-        }
-    }
-}
-
-
 static void udp_query( string query, string host, int port )
 {
 #if __EFUN_DEFINED__(send_udp)
@@ -246,11 +87,6 @@
                             finger_single( lower_case(mess[2]), 0 ), "\n" );
         break;
 
-    case "mailread":
-        data = ({ "Okay" });
-        mailread();
-        break;
-
     default:
         data = ({ "Error: unknown request " + mess[1] + "\n" });
     }
