diff --git a/secure/awmaster.c b/secure/awmaster.c
index f1ce7d4..d9f0bbc 100644
--- a/secure/awmaster.c
+++ b/secure/awmaster.c
@@ -152,16 +152,16 @@
     {
       armours += ([ id : 
         ([
-            AWM_TYPE      : ob->QueryProp(P_ARMOUR_TYPE) ,
-            AWM_CLASS     : ob->QueryProp(P_AC) ,
-            AWM_EFF_CLASS : ob->QueryProp(P_EFFECTIVE_AC) ,
+            AWM_TYPE      : ({string})ob->QueryProp(P_ARMOUR_TYPE) ,
+            AWM_CLASS     : ({int})ob->QueryProp(P_AC) ,
+            AWM_EFF_CLASS : ({int})ob->QueryProp(P_EFFECTIVE_AC) ,
             AWM_FLAGS     : xflags(ob),
-            AWM_WEIGHT    : ob->QueryProp(P_WEIGHT) ,
-            AWM_VALUE     : ob->QueryProp(P_VALUE) ,
-            AWM_HANDS     : ob->QueryProp(P_NR_HANDS) , // Fuer Schilde
-            AWM_D_TYPE    : ob->QueryProp(P_DAM_TYPE) ,
-            AWM_X_CLASS   : ob->QueryProp(P_EFFECTIVE_WC) ||
-                            ob->QueryProp(P_WC),
+            AWM_WEIGHT    : ({int})ob->QueryProp(P_WEIGHT) ,
+            AWM_VALUE     : ({int})ob->QueryProp(P_VALUE) ,
+            AWM_HANDS     : ({int})ob->QueryProp(P_NR_HANDS) , // Fuer Schilde
+            AWM_D_TYPE    : ({string*})ob->QueryProp(P_DAM_TYPE) ,
+            AWM_X_CLASS   : ({int})ob->QueryProp(P_EFFECTIVE_WC) ||
+                            ({int})ob->QueryProp(P_WC),
             AWM_TIME      : time()
         ]) ]);
     }
@@ -206,16 +206,16 @@
     {
       weapons += ([ id :
         ([
-            AWM_TYPE      : ob->QueryProp(P_WEAPON_TYPE) ,
-            AWM_CLASS     : ob->QueryProp(P_WC) ,
-            AWM_EFF_CLASS : ob->QueryProp(P_EFFECTIVE_WC) ,
+            AWM_TYPE      : ({string})ob->QueryProp(P_WEAPON_TYPE) ,
+            AWM_CLASS     : ({int})ob->QueryProp(P_WC) ,
+            AWM_EFF_CLASS : ({int})ob->QueryProp(P_EFFECTIVE_WC) ,
             AWM_FLAGS     : xflags(ob),
-            AWM_WEIGHT    : ob->QueryProp(P_WEIGHT) ,
-            AWM_VALUE     : ob->QueryProp(P_VALUE) ,
-            AWM_HANDS     : ob->QueryProp(P_NR_HANDS) ,
-            AWM_D_TYPE    : ob->QueryProp(P_DAM_TYPE) ,
-            AWM_X_CLASS   : ob->QueryProp(P_EFFECTIVE_AC) || 
-                            ob->QueryProp(P_AC),
+            AWM_WEIGHT    : ({int})ob->QueryProp(P_WEIGHT) ,
+            AWM_VALUE     : ({int})ob->QueryProp(P_VALUE) ,
+            AWM_HANDS     : ({int})ob->QueryProp(P_NR_HANDS) ,
+            AWM_D_TYPE    : ({string*})ob->QueryProp(P_DAM_TYPE) ,
+            AWM_X_CLASS   : ({int})ob->QueryProp(P_EFFECTIVE_AC) || 
+                            ({int})ob->QueryProp(P_AC),
             AWM_TIME      : time()
         ]) ]);
     }
diff --git a/secure/errord.c b/secure/errord.c
index 884d3c1..a17639b 100644
--- a/secure/errord.c
+++ b/secure/errord.c
@@ -459,7 +459,7 @@
     // nicht gespeichert.
     if (this_interactive() && IS_LEARNER(this_interactive())
         && strstr(issue->loadname,WIZARDDIR)==0
-        && this_interactive()->QueryProp(P_DONT_LOG_ERRORS))
+        && ({int})this_interactive()->QueryProp(P_DONT_LOG_ERRORS))
     {
         return 0;
     }
@@ -624,7 +624,7 @@
     // nicht gespeichert.
     if (this_interactive() && IS_LEARNER(this_interactive())
         && strstr(issue->loadname,WIZARDDIR)==0
-        && this_interactive()->QueryProp(P_DONT_LOG_ERRORS)) {
+        && ({int})this_interactive()->QueryProp(P_DONT_LOG_ERRORS)) {
         return 0;
     }
 
@@ -1435,7 +1435,7 @@
     mail[MSG_BODY]=text;
     mail[MSG_ID]=sprintf(MUDNAME": %d.%d",time(),random(__INT_MAX__));
 
-    if (!sizeof("/secure/mailer"->DeliverMail(mail,0)))
+    if (!sizeof(({string*})"/secure/mailer"->DeliverMail(mail,0)))
       res = -1; // an niemanden erfolgreich zugestellt. :-(
     else
       res = 1;
@@ -1462,7 +1462,7 @@
                                 getuid(TI));
     mail[MSG_BODY] = text;
 
-    if (!sizeof("/secure/mailer"->DeliverMail(mail,0)))
+    if (!sizeof(({string*})"/secure/mailer"->DeliverMail(mail,0)))
       res |= -1;
     else
       res |= 1;
diff --git a/secure/explorationmaster.c b/secure/explorationmaster.c
index 6bcb346..ecc6ee9 100644
--- a/secure/explorationmaster.c
+++ b/secure/explorationmaster.c
@@ -28,7 +28,7 @@
 
 #include <living/comm.h>
 #define ZDEBUG(x) if (find_player("zesstra")) \
-  find_player("zesstra")->ReceiveMsg(x,MT_DEBUG,0,object_name()+":",this_object())
+  ({int})find_player("zesstra")->ReceiveMsg(x,MT_DEBUG,0,object_name()+":",this_object())
 //#define ZDEBUG(x)
 
 // Struktur: ([ string filename : string* action, int number, int type ]) 
@@ -95,8 +95,8 @@
   //ZDEBUG(sprintf("check %s...",pl));
   // Letzte Loginzeit ermitteln, wenn laenger als 90 Tage her und nicht
   // eingeloggt, wird der Spieler uebersprungen.
-  pldata->ReleasePlayer();
-  pldata->LoadPlayer(pl);
+  ({int})pldata->ReleasePlayer();
+  ({int})pldata->LoadPlayer(pl);
   // Testspieler ausnehmen, Spieler, die 90 Tage nicht da waren.
   if ( (({int})pldata->QueryProp(P_LAST_LOGIN) < time() - 7776000
         && !find_player(pl))
@@ -154,7 +154,7 @@
   int avgspieler = extra[5];
 
   if (objectp(pldata))
-    pldata->remove(1);
+    ({int})pldata->remove(1);
 
   if (file_size(BY_EP) >= 0)
     rm(BY_EP);
@@ -524,7 +524,7 @@
       return;
     }
     if (!what || what == "") {
-      this_interactive()->More(DUMPFILE, 1);
+      ({void})this_interactive()->More(DUMPFILE, 1);
       log_file("ARCH/EPZugriffe", ctime(time())+": "+
         capitalize(getuid(this_interactive()))+" schaute sich das DUMPFILE an.\n");
       return;
@@ -538,13 +538,13 @@
       if (!what || what == "")
        what = "/"+getuid(this_interactive())+"/";
       else {
-       if (!master()->domain_master(getuid(this_interactive()), what)) {
+       if (!({int})master()->domain_master(getuid(this_interactive()), what)) {
          write("Sorry, Du kannst nur Objekte in Deiner eigenen Region abfragen!\n");
          return;
        }
        if (!magname || magname=="")
          magname = getuid(this_interactive());
-//        if (!master()->domain_member(magname, what)) {
+//        if (!({int})master()->domain_member(magname, what)) {
 //         write(capitalize(magname)+" ist gar kein Mitarbeiter in Deiner Region!\n");
 //          return;
 //       }
@@ -563,9 +563,9 @@
        what="/"+what+"/";
       }
   if (allowed())
-    this_interactive()->More(getMatchArch(what));
+    ({void})this_interactive()->More(getMatchArch(what));
   else
-    this_interactive()->More(getMatch(what));
+    ({void})this_interactive()->More(getMatch(what));
   log_file("ARCH/EPZugriffe", ctime(time())+": "+
     capitalize(getuid(this_interactive()))+" schaute sich "+what+" an.\n");
   return;
@@ -669,8 +669,8 @@
 
   if (!previous_object() || !this_interactive() || !this_player() ||
        this_player() != this_interactive() ||
-       this_player()->QueryProp(P_KILLS) ||
-       this_player()->QueryGuest()       )
+       ({int})this_player()->QueryProp(P_KILLS) ||
+       ({int})this_player()->QueryGuest()       )
     return 0;
 
   fn = old_explode(object_name(previous_object()), "#")[0];
@@ -681,7 +681,7 @@
   if (member(obs[fn],key) < 0)
     return 0;
 
-  ep = (MASTER->query_ep(getuid(this_interactive())) || "");
+  ep = (({string})MASTER->query_ep(getuid(this_interactive())) || "");
 
   gesetzt=test_bit(ep,obs[fn,1]);
   check_to_fast(getuid(this_player()),fn,gesetzt);
@@ -698,7 +698,7 @@
   string ep;
   int gesetzt;
   
-  if (!objectp(ob) || ob->QueryProp(P_KILLS ))
+  if (!objectp(ob) || ({int})ob->QueryProp(P_KILLS ))
     return 0;
 
   fn = old_explode(object_name(previous_object()), "#")[0];
@@ -709,7 +709,7 @@
   if (member(obs[fn],key) < 0)
     return 0;
 
-  ep = (MASTER->query_ep(getuid(ob)) || "");
+  ep = (({string})MASTER->query_ep(getuid(ob)) || "");
 
   gesetzt=test_bit(ep,obs[fn,1]);
   check_to_fast(getuid(this_player()),fn,gesetzt);
@@ -723,7 +723,7 @@
 
 private int QueryRealExplorationPoints(string pl)
 {
-  return count_bits(MASTER->query_ep(pl) || " ");
+  return count_bits(({string})MASTER->query_ep(pl) || " ");
 }
 
 nomask int QueryExplorationPoints(mixed pl)
@@ -753,7 +753,7 @@
 {
   int i,j,k,t,maxEP;
   string ep;
-  ep = (MASTER->query_ep(pl) || "");
+  ep = (({string})MASTER->query_ep(pl) || "");
 
   maxEP = QueryMaxEP();
   for( i=0; i<num; i++)
@@ -765,7 +765,7 @@
     if( j==maxEP ) break;
     ep = clear_bit(ep, k);
   }
-  MASTER->update_ep(pl,ep);
+  ({int})MASTER->update_ep(pl,ep);
   return i;
 }
 
@@ -794,13 +794,13 @@
   if (!pl) return -2;
   i=remove_fp(num, pl);
   log_file("ARCH/fp_strafen", ctime(time())+": "
-    +this_interactive()->Name(WER)+" loescht "+pl+" "+i
+    +({string})this_interactive()->Name(WER)+" loescht "+pl+" "+i
     +" FPs\nGrund:"+grund+"\n");
   if( i>0 ) {
      text =
      "Hallo "+capitalize(pl)+",\n\n"+
      break_string(
-      this_interactive()->Name(WER)+" hat soeben veranlasst, dass Dir "+i
+      ({string})this_interactive()->Name(WER)+" hat soeben veranlasst, dass Dir "+i
       +" FPs abgezogen wurden.\nGrund:"+grund+"\n", 78 );
 
      mail = allocate(9);
@@ -814,7 +814,7 @@
      mail[MSG_ID]=MUDNAME":"+time();
      mail[MSG_BODY]=text;
 
-     "/secure/mailer"->DeliverMail(mail,1);
+     ({string*})"/secure/mailer"->DeliverMail(mail,1);
   }
   return i;
 }
@@ -824,7 +824,7 @@
 {
   int i,j,k,t,maxEP;
   string ep;
-  ep = (MASTER->query_ep(pl) || "");
+  ep = (({string})MASTER->query_ep(pl) || "");
 
   maxEP = QueryMaxEP();
   for( i=0; i<num; i++)
@@ -836,7 +836,7 @@
     if( j==maxEP ) break;
     ep = set_bit(ep, k);
   }
-  MASTER->update_ep(pl,ep);
+  ({int})MASTER->update_ep(pl,ep);
   return i;
 }
 
@@ -848,7 +848,7 @@
   if (!pl) return -2;
   i=add_fp(num, pl);
   log_file("ARCH/fp_strafen", ctime(time())+": "
-    +this_interactive()->Name(WER)+" gibt "+pl+" "+i
+    +({string})this_interactive()->Name(WER)+" gibt "+pl+" "+i
     +" FPs\n");
 
   return i;
@@ -861,12 +861,12 @@
   if (!allowed()) return -1;
   if ( num<0 ) return -3;
   if (!pl) return -2;
-  ep = (MASTER->query_ep(pl) || "");
+  ep = (({string})MASTER->query_ep(pl) || "");
 
   maxEP = QueryMaxEP();
   if (num<0 || num>=maxEP) return -4;
   ep = set_bit(ep, num);
-  MASTER->update_ep(pl,ep);
+  ({int})MASTER->update_ep(pl,ep);
   return num;
 }
 
@@ -877,12 +877,12 @@
   if (!allowed()) return -1;
   if ( num<0 ) return -3;
   if (!pl) return -2;
-  ep = (MASTER->query_ep(pl) || "");
+  ep = (({string})MASTER->query_ep(pl) || "");
 
   maxEP = QueryMaxEP();
   if (num<0 || num>=maxEP) return -4;
   ep = clear_bit(ep, num);
-  MASTER->update_ep(pl,ep);
+  ({int})MASTER->update_ep(pl,ep);
   return num;
 }
 
@@ -896,7 +896,7 @@
 {
   string ep,teststring;
   if (!allowed()) return -1;
-  ep = (MASTER->query_ep(pl) || "");
+  ep = (({string})MASTER->query_ep(pl) || "");
 
   output="";
   if (!pattern || pattern=="")
@@ -908,7 +908,7 @@
         if ( test_bit(ep, v2) && sscanf(fn, teststring, unused, unused) )
           printep(v2, fn, v3, v1);
       });
-  this_interactive()->More(output);
+  ({void})this_interactive()->More(output);
   return 1;
 }
 
diff --git a/secure/gildenmaster.c b/secure/gildenmaster.c
index dfd411d..6018d9f 100644
--- a/secure/gildenmaster.c
+++ b/secure/gildenmaster.c
@@ -57,9 +57,9 @@
               "Bitte verstaendige einen Erzmagier.\n");
       return -2;
   }
-  pl->SetProp(P_GUILD,gname);
+  ({string})pl->SetProp(P_GUILD,gname);
   // Event Gildenwechsel triggern
-  EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
+  ({int})EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
       E_OBJECT: pl, E_PLNAME: getuid(pl),
       E_ENVIRONMENT: environment(pl),
       E_GUILDNAME: gname,
@@ -94,7 +94,7 @@
       write("Du kannst hier nicht aus einer anderen Gilde austreten.\n");
       return -1;
   }
-  if (gname[8..]==(pl->QueryProp(P_DEFAULT_GUILD)||DEFAULT_GUILD))
+  if (gname[8..]==(({string})pl->QueryProp(P_DEFAULT_GUILD)||DEFAULT_GUILD))
   {
         write("Aus dieser Gilde kannst Du nicht austreten.\n");
         return -1;
@@ -102,18 +102,18 @@
   if (loss<=0) loss=20;
   skills=({mapping})pl->QueryProp(P_NEWSKILLS);
   walk_mapping(skills,"loose_ability",this_object(),loss);
-  pl->SetProp(P_NEWSKILLS,skills);
-  pl->SetProp(P_GUILD,0);
+  ({mapping})pl->SetProp(P_NEWSKILLS,skills);
+  ({string})pl->SetProp(P_GUILD,0);
   // Event Gildenwechsel triggern
-  EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
+  ({int})EVENTD->TriggerEvent(EVT_GUILD_CHANGE, ([
       E_OBJECT: pl, E_PLNAME: getuid(pl),
       E_ENVIRONMENT: environment(pl),
-      E_GUILDNAME: pl->QueryProp(P_GUILD),
+      E_GUILDNAME: ({string})pl->QueryProp(P_GUILD),
       E_LAST_GUILDNAME: gname ]) );
 
   // Defaultgilde ggf. neuen Titel setzen lassen.
   gname = ({string})pl->QueryProp(P_GUILD);
-  (GUILD_DIR+"/"+gname)->adjust_title(pl);
+  ({void})(GUILD_DIR+"/"+gname)->adjust_title(pl);
 
   return 1;
 }
diff --git a/secure/lepmaster.c b/secure/lepmaster.c
index 6e53834..592b624 100644
--- a/secure/lepmaster.c
+++ b/secure/lepmaster.c
@@ -305,8 +305,8 @@
   DEBUG("Es geht um: %O\n", player);
 
   // Abenteuerpunkte
-  DEBUG("Abenteuerpunkte: %d ("+REQ_QP+")\n", player->QueryProp(P_QP));
-  if (player->QueryProp(P_QP) < REQ_QP) {
+  DEBUG("Abenteuerpunkte: %d ("+REQ_QP+")\n", ({int})player->QueryProp(P_QP));
+  if (({int})player->QueryProp(P_QP) < REQ_QP) {
     s += sprintf(" * Dir fehlen noch mindestens %d Abenteuerpunkte.\n", 
 		 REQ_QP - ({int})player->QueryProp(P_QP));
     i--;
@@ -345,7 +345,7 @@
   int minlevel = QueryLevel(REQ_LEP);
 
   // Restliche Stufenpunkte 
-  DEBUG("Stufenpunkte: %d ("+REQ_LEP+")\n", player->QueryProp(P_LEP));
+  DEBUG("Stufenpunkte: %d ("+REQ_LEP+")\n", ({int})player->QueryProp(P_LEP));
   if (({int})(player->QueryProp(P_LEP)) < REQ_LEP) {
     s += sprintf(" * Du musst mindestens %d Stufenpunkte, entspricht Stufe %d, "
         "erreichen.\n", REQ_LEP, minlevel);
@@ -353,7 +353,7 @@
   }
   
   // Demnach mindestens REQ/100-Level 
-  DEBUG("Level: %d ("+REQ_LEP/100+")\n", player->QueryProp(P_LEVEL));
+  DEBUG("Level: %d ("+REQ_LEP/100+")\n", ({int})player->QueryProp(P_LEVEL));
   if (({int})player->QueryProp(P_LEVEL) < minlevel) {
     s += sprintf(" * Du musst mindestens Stufe %d erreichen.\n", minlevel);
     i--;
diff --git a/secure/login.c b/secure/login.c
index ab6ee16..3652e21 100644
--- a/secure/login.c
+++ b/secure/login.c
@@ -192,9 +192,9 @@
     // machen das natuerlich nicht fuer die IP vom Mudrechner...
     if (query_ip_number(this_object()) != "87.79.24.60")
     {
-      "/p/daemon/dnslookup"->check_tor(query_ip_number(this_object()),
+      ({int})"/p/daemon/dnslookup"->check_tor(query_ip_number(this_object()),
           query_mud_port());
-      "/p/daemon/dnslookup"->check_dnsbl(query_ip_number(this_object()));
+      ({int})"/p/daemon/dnslookup"->check_dnsbl(query_ip_number(this_object()));
     }
 
     // ggf. muss TLS (initiiert durch STARTTLS) noch ausverhandelt werden.
@@ -232,7 +232,7 @@
     ip = query_ip_number(this_object());
     u = filter(users(), function status (object ob, string addr, int a) {
         return query_ip_number(ob) == addr
-               && ob->QueryProp(P_AGE) < a;
+               && ({int})ob->QueryProp(P_AGE) < a;
     }, ip, 12*60*60); // 24h in heart_beats
 
     if ( sizeof(u) > 25 ){
@@ -266,8 +266,8 @@
       // check connection from Tor exit node
       string eff_ip = (sizeof(realip) ? realip
                                       : query_ip_number(this_object()));
-      if ("/p/daemon/dnslookup"->check_tor(eff_ip, query_mud_port())
-          || "/p/daemon/dnslookup"->check_dnsbl(eff_ip))
+      if (({int})"/p/daemon/dnslookup"->check_tor(eff_ip, query_mud_port())
+          || ({int})"/p/daemon/dnslookup"->check_dnsbl(eff_ip))
         res = 
             "\nSorry, von Deiner Adresse kamen ein paar Idioten, die "
             "ausschliesslich\nAerger machen wollten. Deshalb haben wir "
@@ -346,8 +346,8 @@
         realip=str[sizeof(SSL_GRRETING)..];
       } // andere IPs werden einfach ignoriert. -> log/PROXY.REQ ?
       // ggf. Lookup fuer Torexits anstossen.
-      "/p/daemon/dnslookup"->check_tor(realip,query_mud_port());
-      "/p/daemon/dnslookup"->check_dnsbl(realip);
+      ({int})"/p/daemon/dnslookup"->check_tor(realip,query_mud_port());
+      ({int})"/p/daemon/dnslookup"->check_dnsbl(realip);
 
       input_to( "logon2", INPUT_PROMPT,
           "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? ");
@@ -391,7 +391,7 @@
     loginname = str;
 
     /* read the secure save file to see if character already exists */
-    string ssavef=master()->secure_savefile(loginname);
+    string ssavef=({string})master()->secure_savefile(loginname);
     if ( loginname != "gast"
          && (!ssavef || !sizeof(ssavef) || !restore_object(ssavef) ))
     {
@@ -529,7 +529,7 @@
 
     password = str;
 
-    if ( !master()->good_password( str, loginname ) ) {
+    if ( !({int})master()->good_password( str, loginname ) ) {
         input_to( "new_password", INPUT_NOECHO|INPUT_PROMPT,
             "Bitte gib ein Passwort an: ");
         return 1;
@@ -736,7 +736,7 @@
             return;
         }
 
-        write( call_other( races[num - 1][0], "QueryProp", P_RACE_DESCRIPTION ));
+        write( ({string})call_other( races[num - 1][0], "QueryProp", P_RACE_DESCRIPTION ));
         input_to( "get_race_answer", INPUT_PROMPT,
             "\nWas willst Du tun: ");
         return;
@@ -1057,7 +1057,7 @@
     seteuid(ROOTID);
 
     /* read the secure save file to see if character already exists */
-    if ( !restore_object( master()->secure_savefile(loginname) ) ){
+    if ( !restore_object( ({string})master()->secure_savefile(loginname) ) ){
         write( "Kein solcher Spieler!\n" );
         destruct( this_object() );
         return 0;
diff --git a/secure/mailer.c b/secure/mailer.c
index ecfb649..bc22db9 100644
--- a/secure/mailer.c
+++ b/secure/mailer.c
@@ -357,7 +357,7 @@
             sender = regreplace( sender, "@", "%", 1 );
             // Zustellung via Intermud-Mail an andere Muds.
             if ( member( mud, '.' ) == -1 ) {
-                "/secure/udp_mail"->deliver_mail( rec, mud, sender,
+                ({void})"/secure/udp_mail"->deliver_mail( rec, mud, sender,
                                                   msg[MSG_SUBJECT],
                                                   msg[MSG_BODY] );
                 recok += ({ recipients[i] });
@@ -392,7 +392,7 @@
 
         }
         else
-            if (master()->find_userinfo(recipients[i]) )
+            if (({int})master()->find_userinfo(recipients[i]) )
             {
                 save_msg( newmsg, recipients[i] );
                 recok += ({ recipients[i] });
@@ -603,13 +603,13 @@
 public int query_recipient_ok( string name )
 {
 #if INTERNET_MAIL_ENABLED
-    return  (master()->find_userinfo(name)
+    return  (({int})master()->find_userinfo(name)
              || member( name, '%' ) > 0 || member( name, '@' ) > 0 );
 #else
     // es darf zwar ein @ in der Adresse vorkommen, dahinter aber kein . mehr
     // (dann ist es ne Mail via Intermud-Mail, nicht ins Internet).
     string *tmp;
-    return  (master()->find_userinfo(name)
+    return  (({int})master()->find_userinfo(name)
              || member( name, '%' ) > 0
              || (sizeof(tmp=explode(name,"@")) == 2 && strstr(tmp[1],".") == -1));
 #endif
diff --git a/secure/master.c b/secure/master.c
index bdbf779..b853771 100644
--- a/secure/master.c
+++ b/secure/master.c
@@ -300,7 +300,7 @@
 
   ++loading_simul_efuns;
 
-  if (!(err=catch(SIMUL_EFUN_FILE->start_simul_efun())) ) {
+  if (!(err=catch(({void})SIMUL_EFUN_FILE->start_simul_efun())) ) {
     --loading_simul_efuns;
     return ({SIMUL_EFUN_FILE});
   }
@@ -308,7 +308,7 @@
   debug_message("Failed to load simul efun " + SIMUL_EFUN_FILE +
       " " + err, DMSG_STDOUT | DMSG_LOGFILE | DMSG_STAMP);
 
-  if (!(err=catch(SPARE_SIMUL_EFUN_FILE->start_simul_efun())) ) {
+  if (!(err=catch(({void})SPARE_SIMUL_EFUN_FILE->start_simul_efun())) ) {
     --loading_simul_efuns;
     return ({SPARE_SIMUL_EFUN_FILE});
   }
@@ -593,7 +593,7 @@
 
 // Was machen bei disconnect?
 protected void disconnect(object who, string remaining) {
-    who->NetDead(); return;
+    ({void})who->NetDead(); return;
 }
 
 // Es gibt kein File 'filename'. VC aktivieren so vorhanden ...
@@ -640,8 +640,8 @@
 // Spieler bei Shutdown entfernen
 protected void remove_player(object victim)
 {
-  catch(victim->quit());
-  if (victim) catch(victim->remove());
+  catch(({int})victim->quit());
+  if (victim) catch(({int})victim->remove());
   if (victim) destruct(victim);
   return;
 }
@@ -652,7 +652,7 @@
   //sollte nur vom GD gerufen werden. Oder allenfalls Master selbst
   filter(users(),#'tell_object,
   "Der Gamedriver ruft: Der Speicher wird knapp ! Bereitet euch auf das Ende vor !\n");
-  "/obj/shut"->shut(minutes);
+  ({int})"/obj/shut"->shut(minutes);
   return;
 }
 
@@ -885,7 +885,7 @@
   if (efun::object_info(culprit, OI_ONCE_INTERACTIVE))
     call_out("restart_heart_beat", 5, culprit);
   else
-    catch(culprit->make_immortal(); publish);
+    catch(({void})culprit->make_immortal(); publish);
   return 0;
 }
 
@@ -1006,7 +1006,7 @@
   // nicht waehrend des ladens der simulefuns auftrat, bei der Ausgabe der
   // Meldung ueber die Kaenaele wieder sefuns genutzt werden.
   if (!loading_simul_efuns) {
-    if (titp && (IS_LEARNER(titp) || (titp->QueryProp(P_TESTPLAYER))))
+    if (titp && (IS_LEARNER(titp) || (({int|string})titp->QueryProp(P_TESTPLAYER))))
     {
       catch(send_channel_msg("Entwicklung",
                              capitalize(objectp(po) ? REAL_UID(po) : ""),
diff --git a/secure/master.h b/secure/master.h
index e0b8ea7..b9988b7 100644
--- a/secure/master.h
+++ b/secure/master.h
@@ -90,6 +90,7 @@
 string         _get_path(string path, string user);
 string         QueryBanished(string str);
 int            TBanishName(string name, int days);
+varargs void   BanishName(string name, string reason, int force);
 
 // sendet bei Befoerderungen Infomail an Magier
 protected void SendWizardHelpMail(string name, int level);
diff --git a/secure/master/destruct.c b/secure/master/destruct.c
index 1b7c19a..bd36571 100644
--- a/secure/master/destruct.c
+++ b/secure/master/destruct.c
@@ -28,10 +28,10 @@
           && ob) {
             // Spieler speichern, dann erst Inventar entleeren, dann remove() und
         // und destruct() anwenden.
-        catch(ob->save_me(1); publish);
+        catch(({void})ob->save_me(1); publish);
         filter(all_inventory(ob), #'recursive_remove, immediate_destruct);
         if (!immediate_destruct) 
-          catch(ob->remove(0);publish);
+          catch(({int})ob->remove(0);publish);
         if (ob) 
           destruct(ob);
     }
@@ -43,7 +43,7 @@
     filter(all_inventory(ob), #'recursive_remove, immediate_destruct);
     // ggf. zuerst remove versuchen
     if (!immediate_destruct)
-      catch(ob->remove(1);publish);
+      catch(({int})ob->remove(1);publish);
     if (ob)
       destruct(ob);
   }
@@ -82,7 +82,7 @@
       old_env=environment(item);
       // M_MOVE_ALL, falls item nen Unitobjekt ist. Sonst clonen die u.U. noch
       // wieder nen neues Objekt im alten Env.
-      if(catch(item->move(env, M_NOCHECK|M_MOVE_ALL);publish))
+      if(catch(({int})item->move(env, M_NOCHECK|M_MOVE_ALL);publish))
         recursive_remove(item, 1);
       else if (item && environment(item) == old_env)
         recursive_remove(item, 1);
diff --git a/secure/master/domain.c b/secure/master/domain.c
index ade06ba..b73378d 100644
--- a/secure/master/domain.c
+++ b/secure/master/domain.c
@@ -25,8 +25,8 @@
 {
   string *domains;
   
-  if ((call_other(SIMUL_EFUN_FILE, "process_call") ||
-        call_other(SIMUL_EFUN_FILE, "secure_level") < GOD_LVL) ||
+  if ((({int})call_other(SIMUL_EFUN_FILE, "process_call") ||
+        ({int})call_other(SIMUL_EFUN_FILE, "secure_level") < GOD_LVL) ||
         !find_userinfo(user))
     return 0;
   domains=query_userlist(user, USER_DOMAIN);
diff --git a/secure/master/guild.c b/secure/master/guild.c
index d0c025c..e863409 100644
--- a/secure/master/guild.c
+++ b/secure/master/guild.c
@@ -26,8 +26,8 @@
 {
   string *guilds;
   
-  if ((call_other(SIMUL_EFUN_FILE, "process_call") ||
-       call_other(SIMUL_EFUN_FILE, "secure_level") < GOD_LVL) ||
+  if ((({int})call_other(SIMUL_EFUN_FILE, "process_call") ||
+       ({int})call_other(SIMUL_EFUN_FILE, "secure_level") < GOD_LVL) ||
       !find_userinfo(user))
     return 0;
 
diff --git a/secure/master/misc.c b/secure/master/misc.c
index 7d41566..d952d6e 100644
--- a/secure/master/misc.c
+++ b/secure/master/misc.c
@@ -35,12 +35,12 @@
     {
       // sonst faken wir eins. *seufz*
       sender=clone_object("/p/daemon/namefake");
-      sender->SetProp(P_NAME, sendername); 
-      sender->SetProp(P_ARTICLE,0);
+      ({string})sender->SetProp(P_NAME, sendername); 
+      ({int})sender->SetProp(P_ARTICLE,0);
       // Dieses Objekt zerstoert sich nach 3s automatisch.
     }
   }
-  CHMASTER->send(channel, sender, msg);
+  ({int})CHMASTER->send(channel, sender, msg);
 }
 
 static string *explode_files(string file) {
@@ -180,7 +180,7 @@
       return;
   }
 
-/*  if (!("/secure/login"->valid_name(name))) return;*/
+/*  if (!(({int})"/secure/login"->valid_name(name))) return;*/
   if ( lower_case(reason) != "loeschen" ){
       names = ({ name + " " + reason });
 
@@ -416,8 +416,8 @@
     // Lese- und Schreibberechtigungen fuer die Rubrik 'polizei' setzen
     ob = load_object("secure/news");
     ginfo = (({mixed*})ob->GetGroup("polizei"))[5..6];
-    ob->RemoveAllowed( "polizei", 0, ginfo[0], ginfo[1] );
-    ob->AddAllowed( "polizei", 0, deputies, deputies );
+    ({int})ob->RemoveAllowed( "polizei", 0, ginfo[0], ginfo[1] );
+    ({int})ob->AddAllowed( "polizei", 0, deputies, deputies );
     LoadDeputyFileList();
 }
 
@@ -471,7 +471,7 @@
     {
       tell_object(player, "Arbeitszimmer " + castle + " erzeugt.\n");
       // Arbeitszimmer als Home setzen
-      player->SetProp(P_START_HOME,castle[0..<3]);
+      ({string})player->SetProp(P_START_HOME,castle[0..<3]);
     }
     else
       tell_object(player, "Arbeitszimmer konnte nicht erzeugt werden !\n");
@@ -497,7 +497,7 @@
   mixed mail = ({"Merlin", "<Master>", name, 0, 0, subject,
                  call_sefun("dtime",time()),
                  MUDNAME+time(), text });
-  MAILDEMON->DeliverMail(mail, 0);
+  ({string*})MAILDEMON->DeliverMail(mail, 0);
 }
 
 int allowed_advance_wizlevel(mixed ob)
@@ -558,13 +558,12 @@
 
 void restart_heart_beat(object heart_beat)
 {
-  if (heart_beat) heart_beat->_restart_beat();
+  if (heart_beat) ({void})heart_beat->_restart_beat();
 }
 
 int renew_player_object(string|object who)
 {
   object newob;
-  object *obs, *obs2;
   mixed err;
   string ob_name;
   object *armours, weapon;
@@ -585,7 +584,7 @@
     return -2;
   if (!object_info(who, OI_ONCE_INTERACTIVE))
     return -3;
-  if (who->QueryGuest())
+  if (({int})who->QueryGuest())
   {
     printf("Can't renew guests!\n");
     return -6;
@@ -604,11 +603,11 @@
   if (!newob)
     return -5;
   /* Ok, the object is here now ... lets go for it ... */
-  who->save_me(0);
+  ({void})who->save_me(0);
   /* SSL ip weiterreichen */
   if( call_sefun("query_ip_number", who) != efun::interactive_info(who,II_IP_NUMBER) )
   {
-    newob->set_realip( call_sefun("query_ip_number",who) );
+    ({string})newob->set_realip( call_sefun("query_ip_number",who) );
   }
   efun::configure_object(who, OC_COMMANDS_ENABLED, 0);
   efun::set_this_player(0);
@@ -634,7 +633,7 @@
     {
       send_channel_msg("Debug",previous_object(),
                        "ERROR: exec() during Renew unsuccessful.\n");
-      newob->remove();
+      ({int})newob->remove();
       return 0;
     }
   }
@@ -643,7 +642,7 @@
   {
     send_channel_msg("Debug",previous_object(),
                      "ERROR: still active !\n");
-    newob->remove();
+    ({int})newob->remove();
     return 0;
   }
   // newob->start_player(capitalize(getuid(who)),who->_query_my_ip());
@@ -657,65 +656,64 @@
                                              })
                                       ), who
                       ),
-          capitalize(getuid(who)), who->_query_my_ip() );
+          capitalize(getuid(who)), ({string})who->_query_my_ip() );
 
-  newob->move(environment(who),M_TPORT|M_NOCHECK|M_NO_SHOW|M_SILENT
+  ({int})newob->move(environment(who),M_TPORT|M_NOCHECK|M_NO_SHOW|M_SILENT
               |M_NO_ATTACK);
-  obs=all_inventory(who);
   foreach(object tob: all_inventory(who)) {
-    if (!tob->QueryProp(P_AUTOLOADOBJ))
+    if (!({mixed})tob->QueryProp(P_AUTOLOADOBJ))
     {
       // kein Autoloader...
       foreach(object ob: deep_inventory(tob))
       {
         // aber enthaltene Autoloader entsorgen...
-        if (ob->QueryProp(P_AUTOLOADOBJ))
+        if (({mixed})ob->QueryProp(P_AUTOLOADOBJ))
         {
-          catch(ob->remove();publish);
+          catch(({int})ob->remove();publish);
           if (ob) destruct(ob);
         }
       }
       // objekt ohne die AL bewegen.
-      catch(tob->move(newob,M_NOCHECK);publish);
+      catch(({int})tob->move(newob,M_NOCHECK);publish);
     }
     else {
       // Inhalt von Autoloadern retten.
       // neue instanz des ALs im neuen Objekt.
       object new_al_instance = present_clone(tob, newob);
       foreach(object ob: deep_inventory(tob)) {
-        if (ob->QueryProp(P_AUTOLOADOBJ)) {
+        if (({mixed})ob->QueryProp(P_AUTOLOADOBJ)) {
             // autoloader in Autoloadern zerstoeren...
-            catch(ob->remove(1);publish);
+            catch(({int})ob->remove(1);publish);
             if (ob) destruct(ob);
         }
         // alle nicht autoloader in die AL-Instanz im neuen Objekt oder
         // notfalls ins Inv.
         else {
           if (objectp(new_al_instance))
-            catch(ob->move(new_al_instance, M_NOCHECK);publish);
+            catch(({int})ob->move(new_al_instance, M_NOCHECK);publish);
           else
-            catch(ob->move(newob, M_NOCHECK);publish);
+            catch(({int})ob->move(newob, M_NOCHECK);publish);
         }
       }
       // Autoloader zerstoeren. Wird nicht vom Spielerobjekt im remove()
       // gemacht, wenn nicht NODROP.
-      catch(tob->remove(1);publish);
+      catch(({int})tob->remove(1);publish);
       if (tob) destruct(tob);
     }
   }
-  who->remove();
+  ({int})who->remove();
   if ( objectp(who) )
       destruct(who);
   rename_object(newob,ob_name);
-  newob->__reload_explore();
+  ({void})newob->__reload_explore();
   tp=this_player();
   efun::set_this_player(newob);
   if (objectp(weapon))
-    weapon->DoWield();
+    ({int})weapon->DoWield();
   if (pointerp(armours))
     for (i=sizeof(armours)-1;i>=0;i--)
       if (objectp(armours[i]))
-        armours[i]->do_wear("alles");
+        ({int})armours[i]->do_wear("alles");
   efun::set_this_player(tp);
   //Rueckgabewert noetig, weil Funktion vom Typ 'int'
   return(1);
diff --git a/secure/master/network.c b/secure/master/network.c
index 31a59b3..b3178b1 100644
--- a/secure/master/network.c
+++ b/secure/master/network.c
@@ -80,7 +80,7 @@
         if ( sizeof(mess) < 3 )
             data = ({ "Error: Wen soll ich fingern ?" });
         else
-            data = explode( "/p/daemon/finger"->
+            data = explode( ({string})"/p/daemon/finger"->
                             finger_single( lower_case(mess[2]), 0 ), "\n" );
         break;
 
@@ -147,13 +147,13 @@
   // Die folgenden Services sind keine Intermud-Dienste
   if(strstr(msg_text, "IPLOOKUP\n") == 0)
   {
-    "/p/daemon/iplookup"->update( msg_text );
+    ({void})"/p/daemon/iplookup"->update( msg_text );
     return;
   }
 
   if( strstr(msg_text, "DNSLOOKUP\n") == 0)
   {
-    "/p/daemon/dnslookup"->update( msg_text );
+    ({void})"/p/daemon/dnslookup"->update( msg_text );
     return;
   }
 
@@ -162,7 +162,7 @@
     return udp_query(msg_text[10..],host,port);
   }
   // Rest an inetd fuer Bearbeitung als Intermud-Nachricht.
-  "secure/inetd"->_receive_udp(host, msg_text);
+  ({void})"secure/inetd"->_receive_udp(host, msg_text);
 }
 
 
diff --git a/secure/master/userinfo.c b/secure/master/userinfo.c
index bde7788..e62a1db 100644
--- a/secure/master/userinfo.c
+++ b/secure/master/userinfo.c
@@ -872,9 +872,9 @@
   m_delete(userlist,real_name);
   
   if (wlevel >= LEARNER_LVL)
-    TO->BanishName(real_name, "So hiess mal ein Magier hier");
+    ({void})TO->BanishName(real_name, "So hiess mal ein Magier hier");
   else if (wlevel >= SEER_LVL)
-    TO->BanishName(real_name, "So hiess mal ein Seher hier");
+    ({void})TO->BanishName(real_name, "So hiess mal ein Seher hier");
 
 #ifdef _PUREFTPD_
     if (member(ftpuser,real_name)) {
@@ -1080,7 +1080,7 @@
     }
   }
   // Gildenname?
-  else if (GUILDMASTER->ValidGuild(alias)) {
+  else if (({int})GUILDMASTER->ValidGuild(alias)) {
       uids += ({GUILDID"."+alias});
       //hat die Gilde ein Projektverzeichnis?
       if (file_size("/"PROJECTDIR"/"+alias) == FSIZE_DIR) {
diff --git a/secure/merlin.c b/secure/merlin.c
index 21a4333..d010058 100644
--- a/secure/merlin.c
+++ b/secure/merlin.c
@@ -73,8 +73,8 @@
   move("/gilden/abenteurer",0);
   MBanishListe = m_allocate(0,2);
   restore_object(SAVEFILE);
-  EVENTD->RegisterEvent(EVT_LIB_PLAYER_CREATION, "player_change", ME);
-  EVENTD->RegisterEvent(EVT_LIB_LOGIN, "player_change", ME);
+  ({int})EVENTD->RegisterEvent(EVT_LIB_PLAYER_CREATION, "player_change", ME);
+  ({int})EVENTD->RegisterEvent(EVT_LIB_LOGIN, "player_change", ME);
   // absichtlich kein EVT_LIB_LOGOUT, s. Kommentar zu notify_player_leave().
 }
 
@@ -112,7 +112,7 @@
 {
   if (!stringp(str)||str=="")
     return 0;
-  return call_other(this_object(),"_query_"+str);
+  return ({mixed})call_other(this_object(),"_query_"+str);
 }
 
 varargs int id(string str)
@@ -144,7 +144,7 @@
 
 string long()
 {
-  EPMASTER->GiveExplorationPoint("merlin");
+  ({int})EPMASTER->GiveExplorationPoint("merlin");
   return break_string(
       "Merlin - der maechtige Urvater aller Magier - ist ein hagerer "
       "Mann, der einen blauen, mit Monden und Sternen uebersaeten Umhang "
@@ -227,7 +227,7 @@
 string QueryPossPronoun( mixed what, int casus, int number )
 {
   int gen2;
-  gen2 = ( intp( what ) ) ? what : what->QueryProp(P_GENDER);
+  gen2 = ( intp( what ) ) ? what : ({int})what->QueryProp(P_GENDER);
   return "sein" + query_g_suffix( gen2, casus, number );
 }
 
@@ -273,7 +273,7 @@
   mixed *art;
 
   art=({"stufen","Merlin",0,0,sprintf("%s ist jetzt ein%s Seher%s!",who,(g==2?"e":""),(g==2?"in":"")),sprintf("\nAm %s hat %s die noetigen Bedingungen\nerfuellt und ist vom Spielerstatus zum Seherstatus aufgestiegen. \n\n Herzlichen Glueckwunsch, %s!\n",dtime(time()),who,who)});
-  "/secure/news"->WriteNote(art,1);
+  ({int})"/secure/news"->WriteNote(art,1);
 }
 
 static void PostMagier(string who, string prom, int gender)
@@ -282,7 +282,7 @@
 
   art=({"stufen","Merlin",0,0,sprintf("%s ist jetzt ein%s Magier%s!",who,(gender==2?"e":""),(gender==2?"in":"")),sprintf("\nAm %s hat %s %s zu%s Magier%s\nberufen. Herzlichen Glueckwunsch, %s. Glueckwuensche auch an Dich,\n %s, zu Deine%s neuen %s!\n",dtime(time()),prom,who,(gender==2?"r":"m"),(gender==2?"in":""),who,prom,
 (gender==2?"r":"m"),(gender==2?"Tochter":"Sohn"))});
-  "/secure/news"->WriteNote(art,1);
+  ({int})"/secure/news"->WriteNote(art,1);
 }
 
 
@@ -290,9 +290,9 @@
   if (!objectp(wiz))
       return;
 
-  clone_object(FEHLERTEUFEL)->move(wiz, M_NOCHECK|M_GET);
+  ({int})clone_object(FEHLERTEUFEL)->move(wiz, M_NOCHECK|M_GET);
   tell_object(wiz, break_string(
-    "Huhu "+wiz->Name(WER) + "! Ich habe gesehen, dass Du keinen "
+    "Huhu "+({string})wiz->Name(WER) + "! Ich habe gesehen, dass Du keinen "
     "Fehlerteufel hast. Dieses Tool ist zum Debuggen von Fehlern im "
     "Mud sehr praktisch. Bitte schau ihn Dir mal an. :-) Die Hilfe zum "
     "Fehlerteufel kannst Du mit 'man fehlerteufel' lesen. BTW: Wenn "
@@ -324,7 +324,7 @@
   object ob = find_player(who);
   if (ob && rein && IS_WIZARD(ob)
       && !present_clone(FEHLERTEUFEL,ob)
-      && ob->QueryProp(P_LAST_LOGOUT) < 1237329604 )
+      && ({int})ob->QueryProp(P_LAST_LOGOUT) < 1237329604 )
     GibFehlerteufel(ob);
 }
 
@@ -343,7 +343,7 @@
     return;
   }
 
-  if (!pl->QueryGuest()) {
+  if (!({int})pl->QueryGuest()) {
   string plname = ({string})pl->Name(WER);
     CHMASTER->send("Anfaenger", this_object(),
       sprintf("%s macht nun ebenfalls das Morgengrauen unsicher. "
@@ -373,16 +373,16 @@
         tell_object(pl,break_string(sprintf("Huhu %s, um einen Bug in "
                 "Deinem Spielerobjekt zu beheben, wirst Du in ca. 8s "
                 "neugeladen. Bitte warte bis dahin ab und bleibe, wo "
-                "Du gerade bist.",pl->Name()),78,"Merlin teilt Dir mit: "));
+                "Du gerade bist.",({string})pl->Name()),78,"Merlin teilt Dir mit: "));
         return;
     }
 
     plname=getuid(pl);
     tell_object(pl,break_string(sprintf("Huhu %s, um einen Bug in "
             "Deinem Spielerobjekt zu beheben, wirst Du jetzt "
-            "neugeladen.",pl->Name()),78,"Merlin teilt Dir mit: "));
+            "neugeladen.",({string})pl->Name()),78,"Merlin teilt Dir mit: "));
 
-    if (err=catch(master()->renew_player_object(pl);publish)) {
+    if (err=catch(({int})master()->renew_player_object(pl);publish)) {
         log_file("zesstra/failed_rewew.log",sprintf("%s: Fehler %O beim "
               "Renew von %s\n",dtime(time()),err,plname));
         tell_object(pl,break_string("Beim Neuladen Deines Spielerobjekts "
@@ -444,7 +444,7 @@
   write("Merlin gibt Dir eine schallende Ohrfeige.\n");
   say(sprintf("Merlin gibt %s eine schallende Ohrfeige.\n",
               capitalize((string)this_player()->name(WEM))), this_player());
-  en->StopHuntFor(this_object(), 1);
+  ({int})en->StopHuntFor(this_object(), 1);
 }
 */
 void shoutansw()
@@ -455,11 +455,11 @@
 
   if (!(env=environment()))
     return;
-  if (!(ti=this_interactive())||ti->QueryProp(P_LEVEL)<19||ti->QueryProp(P_GHOST))
+  if (!(ti=this_interactive())||({int})ti->QueryProp(P_LEVEL)<19||({int})ti->QueryProp(P_GHOST))
     return;
   tell_object(ti,"Du spuerst einen sengenden Schmerz.\n");
-  ti->do_damage( ti->QueryProp(P_HP) / 2 + 5);
-  if(ti->QueryProp(P_GHOST)) return;
+  ({int})ti->do_damage( ({int})ti->QueryProp(P_HP) / 2 + 5);
+  if(({int})ti->QueryProp(P_GHOST)) return;
   ans="ich hab nicht die leiseste Idee, wo ich hier bin ...\n";
   path=old_explode(object_name(env),"/");
   if (path[0]=="d")
@@ -526,8 +526,8 @@
                 if( path[0]=="p" && path[1]=="verein" ) {
                         ans="ich stehe in Port Vain.";
                 }
-  if (!this_interactive()->QueryProp(P_INVIS))
-    ans=this_interactive()->Name(WER)+", "+ans;
+  if (!({int})this_interactive()->QueryProp(P_INVIS))
+    ans=({string})this_interactive()->Name(WER)+", "+ans;
   else ans=capitalize(ans);
   call_out("myshout",0,break_string(ans, 78, "Merlin ruft: "));
 }
@@ -577,7 +577,7 @@
     if (sscanf(str,"%s sagt: %s",name,message)!=2)
       return;
 
-  if (!name || !sizeof(name) || !master()->find_userinfo(name))
+  if (!name || !sizeof(name) || !({int})master()->find_userinfo(name))
     return;
 
   if (name!=getuid(this_interactive()) && !ARCH_SECURITY)
@@ -646,7 +646,7 @@
   if (IS_SEER(pl))
     return 1;
   
-  if (LEPMASTER->QueryReadyForWiz(pl)==1)
+  if (({int})LEPMASTER->QueryReadyForWiz(pl)==1)
     return 1;
 
   s=({string})LEPMASTER->QueryReadyForWizText(pl); 
@@ -660,7 +660,7 @@
                                78, "Merlin teilt Dir mit: "));
 
   if (environment() == environment(pl))
-    say(pl->name(WER)
+    say(({string})pl->name(WER)
         +" erfuellt noch nicht alle Anforderungen fuer den "+was+
         "status.\n",pl);
   
@@ -689,11 +689,11 @@
   //
   // player is second?
   //
-  if (who->QueryProp(P_SECOND))
+  if (({string})who->QueryProp(P_SECOND))
   {
      tell_object(who,"Du bist ein Zweitspieler und kannst als solcher kein Magier werden.\n"
           +"Versuchs Doch mal mit Deinem Erstie.\n");
-     write("Du kannst "+who->name()+" nicht zum Magier machen. Das geht bei "
+     write("Du kannst "+({string})who->name()+" nicht zum Magier machen. Das geht bei "
           +"Zweities\nleider nicht. Frag doch mal nach dem Erstie.\n");
      return 1;
   }
@@ -713,15 +713,15 @@
   {
     tell_object(promoter,capitalize(who)+" darf nur von einem Erzmagier zum "+
                     "Magier gemacht werden.\n");
-    say(promoter->name(WER)+" ist kein Erzmagier und darf "+capitalize(who)+
+    say(({string})promoter->name(WER)+" ist kein Erzmagier und darf "+capitalize(who)+
             " nicht zum Magier machen.\n");
     return 1;
   }
   //
   // player has PK?
   //
-  if (who->QueryProp("playerkills")) {
-     tell_room(environment(who),who->name()+" hat noch einen Playerkill und kann somit kein Magier werden.\n"
+  if (({string})who->QueryProp("playerkills")) {
+     tell_room(environment(who),({string})who->name()+" hat noch einen Playerkill und kann somit kein Magier werden.\n"
                            "Am besten den Sheriff oder einen Erzmagier verstaendigen.\n");
          return 1;
   }
@@ -741,7 +741,7 @@
   {
     if (!ARCH_SECURITY) {
       Write("Dich kann nur ein Erzmagier zum \"richtigen\" Magier machen!\n");
-      Say("Nur ein Erzmagier kann "+who->name(WEN)+" zum \"richtigen\" Magier machen!\n");
+      Say("Nur ein Erzmagier kann "+({string})who->name(WEN)+" zum \"richtigen\" Magier machen!\n");
       return 0;
     }
     ret=({int})"secure/master"->advance_wizlevel(geteuid(who),21);
@@ -750,11 +750,11 @@
       say("Merlin: error "+ret+"\n");
       write("Merlin: error "+ret+"\n");
     }
-    write("Merlin ruft: "+who->name(WER)+" ist in den Kreis der Magier "+
+    write("Merlin ruft: "+({string})who->name(WER)+" ist in den Kreis der Magier "+
               "aufgenommen worden!\n");
-    shout("Merlin ruft: "+who->name(WER)+" ist in den Kreis der Magier "+
+    shout("Merlin ruft: "+({string})who->name(WER)+" ist in den Kreis der Magier "+
               "aufgenommen worden!\n");
-    "secure/master"->renew_player_object(who);
+    ({int})"secure/master"->renew_player_object(who);
     return 1;
   }
 
@@ -766,7 +766,7 @@
     domains=({string*})"secure/master"->get_domain_homes(getuid(who));
     if (!domains || !pointerp(domains) || !sizeof(domains))
     {
-      Say(who->name(WER)+" gehoert noch keiner Region an und kann daher noch "+
+      Say(({string})who->name(WER)+" gehoert noch keiner Region an und kann daher noch "+
               "kein Voll-\nmagier werden.\n");
       Write("Du gehoerst noch keiner Region an. Schliess Dich zunaechst einer "+
                 "an und komm\ndann wieder!\n");
@@ -775,8 +775,8 @@
     ret=({int})"secure/master"->advance_wizlevel(geteuid(who),25);
     if(ret>0)
     {
-      shout(who->name(WER)+" arbeitet jetzt an einer Region mit!\n");
-      "secure/master"->renew_player_object(who);
+      shout(({string})who->name(WER)+" arbeitet jetzt an einer Region mit!\n");
+      ({int})"secure/master"->renew_player_object(who);
       return 1;
     }
     write("RETURNVALUE "+ret+"\n");
@@ -791,7 +791,7 @@
   {
     if (!ARCH_SECURITY) {
       Write("Dich kann nur ein Erzmagier zum \"richtigen\" Magier machen!\n");
-      Say("Nur ein Erzmagier kann "+who->name(WEN)+" zum \"richtigen\" Magier machen!\n");
+      Say("Nur ein Erzmagier kann "+({string})who->name(WEN)+" zum \"richtigen\" Magier machen!\n");
       return 0;
     }
     ret=({int})"secure/master"->advance_wizlevel(geteuid(who),20);
@@ -801,7 +801,7 @@
       write("Merlin: error "+ret+"\n");
     }
     string wizname = ({string})who->query_real_name();
-    "secure/master"->renew_player_object(who);
+    ({int})"secure/master"->renew_player_object(who);
     // Fehlerteufel geben
     call_out(#'GibFehlerteufel,4,find_player(wizname));
     return 1;
@@ -815,7 +815,7 @@
     tell_object(promoter,"Du musst derzeit mindestens Level "+
                     (DOMAINMEMBER_LVL+1)+" haben, um jemanden befoerden zu "+
                                 "koennen.\n");
-    say(promoter->name(WER)+" ist kein Vollmagier und darf daher niemanden "+
+    say(({string})promoter->name(WER)+" ist kein Vollmagier und darf daher niemanden "+
             "zum Vollmagier machen.\n");
     return 1;
   }
@@ -824,19 +824,19 @@
   // Er schlaegt fehl, wenn der Vertrag der Clone einer alten BP ist.
   if (!(vertrag=present_clone("/obj/vertrag",who)) ||
       object_name(blueprint(vertrag))!="/obj/vertrag" ||
-      !(vertrag->is_unterschrieben()) )
+      !(({int})vertrag->is_unterschrieben()) )
   {
     Write("Du hast ja gar keinen unterschriebenen Vertrag bei Dir. Besorg Dir "+
               "einen Ver-\ntrag, unterschreibe ihn und komm dann wieder!\n");
-    Say(who->name(WER)+" hat keinen unterschriebenen Vertrag.\n");
+    Say(({string})who->name(WER)+" hat keinen unterschriebenen Vertrag.\n");
     return 1;
   }
   if (geteuid(vertrag)!=secure_euid())
   {
     tell_object(promoter,"Das geht nicht, er hat einen Vertrag von "+
                     capitalize(geteuid(vertrag))+" bei sich.\n");
-    say(promoter->name(WER)+" versucht, "+who->name(WER)+" zum Magier zu "+
-            "machen, doch "+who->name(WER)+" hat einen Vertrag\nvon "+
+    say(({string})promoter->name(WER)+" versucht, "+({string})who->name(WER)+" zum Magier zu "+
+            "machen, doch "+({string})who->name(WER)+" hat einen Vertrag\nvon "+
                 capitalize(geteuid(vertrag))+" bei sich.\n",promoter);
     return 0;
   }
@@ -847,18 +847,18 @@
   {
     PostMagier(capitalize(getuid(who)),
                capitalize(secure_euid()),
-               who->QueryProp(P_GENDER));
+               ({int})who->QueryProp(P_GENDER));
     write_file("/log/SPONSOR",dtime(time())+": "+capitalize(getuid(promoter))+" macht "+
-             who->name(WER)+" zum Learner.\n");
-    write(who->name(WER)+" ist in den Kreis der Magier aufgenommen worden!\n");
-    shout(who->name(WER)+" ist in den Kreis der Magier aufgenommen worden!\n");
-    if ("secure/master"->set_player_object(geteuid(who),"/std/shells/magier")
+             ({string})who->name(WER)+" zum Learner.\n");
+    write(({string})who->name(WER)+" ist in den Kreis der Magier aufgenommen worden!\n");
+    shout(({string})who->name(WER)+" ist in den Kreis der Magier aufgenommen worden!\n");
+    if (({int})"secure/master"->set_player_object(geteuid(who),"/std/shells/magier")
             <=0)
     {
       say("MERLIN: konnte Magiershell nicht einstellen.\n");
       write("MERLIN: konnte Magiershell nicht einstellen.\n");
     }
-    "secure/master"->renew_player_object(who);
+    ({int})"secure/master"->renew_player_object(who);
     return 1;
   }
   write(" --RETURNVALUE IS "+ret+"\n");
@@ -904,7 +904,7 @@
                        +"um %s herum auf.\n\nDie Aura verschwindet langsam.\n",
                        plname),78,0,1), ({player}));
  
-  if ("secure/master"->advance_wizlevel(geteuid(player),1)<=0)
+  if (({int})"secure/master"->advance_wizlevel(geteuid(player),1)<=0)
   {
     write("Merlin sagt: Da geht was schief ... sag mal Zook Bescheid.\n");
     say("Merlin sagt: Da geht was schief ... sag mal Zook Bescheid.\n");
@@ -912,18 +912,18 @@
     return;
   }
   playername = geteuid(player);
-  "secure/master"->renew_player_object(player);
+  ({int})"secure/master"->renew_player_object(player);
   player = find_player(playername);
   text = sprintf(" ist jetzt ein%s Seher%s!\n",
-    ((player->QueryProp(P_GENDER))==2?"e":""),
-    ((player->QueryProp(P_GENDER))==2?"in":""));
+    ((({int})player->QueryProp(P_GENDER))==2?"e":""),
+    ((({int})player->QueryProp(P_GENDER))==2?"in":""));
   write("Merlin ruft: "+capitalize(playername)+text);
   shout("Merlin ruft: "+capitalize(playername)+text);
   PostSeher(capitalize(playername),({int})player->QueryProp(P_GENDER));
   if(!catch(
         faq=clone_object("/d/seher/haeuser/special/seherfaqmobil") ;publish))
   {
-    faq->move(player,M_NOCHECK);
+    ({int})faq->move(player,M_NOCHECK);
     tell_object(player, "Aus dem Nichts erscheint eine kleine Belohnung fuer Dich.\n");
   }
   
@@ -971,7 +971,7 @@
             break_string(sprintf("Das ist eine grosse Freude. %s hat sich "
      "tapfer durch das "MUDNAME" geschlagen und mittlerweile alle "
      "Anforderungen erfuellt, um %s zu werden.",                                  
-     plname, (player->QueryProp(P_GENDER))==1?"Seher":"Seherin"),
+     plname, (({int})player->QueryProp(P_GENDER))==1?"Seher":"Seherin"),
               78, "Merlin sagt: "));
 
   call_out("seer_sequenz2", 4, player, plname);
@@ -997,7 +997,7 @@
                                    "erfuellt. Warte einen Moment...", 78,
                                    "Merlin teilt Dir mit: "));
   busy=1;
-  call_out("seer_sequenz1",4,player, player->Name());
+  call_out("seer_sequenz1",4,player, ({string})player->Name());
   return(0); //non-void funktion
 }
 
@@ -1019,8 +1019,8 @@
 }
 
 public int remove(int silent) {
-  EVENTD->UnregisterEvent(EVT_LIB_LOGIN, ME);
-  EVENTD->UnregisterEvent(EVT_LIB_PLAYER_CREATION, ME);
+  ({int})EVENTD->UnregisterEvent(EVT_LIB_LOGIN, ME);
+  ({int})EVENTD->UnregisterEvent(EVT_LIB_PLAYER_CREATION, ME);
   destruct(this_object());
   return 1;
 }
@@ -1044,7 +1044,7 @@
   foreach(object ob: all_inventory(environment()))
   {
     if (interactive(ob) && query_idle(ob)<180
-        && ob->QueryProp(P_XP)>999999)
+        && ({int})ob->QueryProp(P_XP)>999999)
       return;
   }
   // Ausgaenge durchsuchen
@@ -1082,17 +1082,17 @@
 {
   string descr;
 
-  if( IS_LEARNER(who) && who->QueryProp( P_WANTS_TO_LEARN ) )
+  if( IS_LEARNER(who) && ({int})who->QueryProp( P_WANTS_TO_LEARN ) )
     descr = "[" + object_name(ME) + "]\n";
   else
     descr = "";
   descr+="Du bist im Wizclub 'Zum lustigen Merlin'. Dieser Wizclub ist etwas besonderes -\ner hat keinen festen Standort, sondern wandert im Mud herum. Ausserdem kann er\nSpieler zu Magiern machen - aber nur, wenn man ihn von aussen aus darauf\nanspricht.\n";
-  if ( who->QueryProp(P_SHOW_EXITS) )
+  if ( ({int})who->QueryProp(P_SHOW_EXITS) )
     descr += "Es gibt 2 sichtbare Ausgaenge: raus und gilde.\n";
   descr += make_invlist(who, all_inventory(ME) - ({ who }));
   if( environment())
     descr += "\nAusserhalb siehst Du:\n"
-      + environment()->int_short(who,ME);
+      + ({string})environment()->int_short(who,ME);
   return descr;
 }
 
@@ -1102,7 +1102,7 @@
   string descr;
 
   descr = "";
-  iswiz = IS_LEARNER( viewer ) && viewer->QueryProp(P_WANTS_TO_LEARN);
+  iswiz = IS_LEARNER( viewer ) && ({int})viewer->QueryProp(P_WANTS_TO_LEARN);
 
   for (i = 0; i < sizeof(inv); i++)
   {
@@ -1184,7 +1184,7 @@
 
 void show_exits()
 {
-  printf("%s",environment()->GetExits());
+  printf("%s",({string})environment()->GetExits());
 }
 
 int gehen(string str)
@@ -1198,10 +1198,10 @@
   switch (query_verb())
   {
     case "gilde":
-      this_player()->move("/gilden/abenteurer",M_GO,"in die Gilde");
+      ({int})this_player()->move("/gilden/abenteurer",M_GO,"in die Gilde");
       return 1;
     case "raus":
-      this_player()->move(environment(),M_GO,"raus");
+      ({int})this_player()->move(environment(),M_GO,"raus");
       return 1;
   }
   if (!IS_WIZARD(this_interactive()))
@@ -1212,7 +1212,7 @@
   mapping exits=({mapping})environment()->QueryProp(P_EXITS);
   if (!str||str=="")
   {
-    printf(environment()->int_short(ME,ME));
+    printf(({string})environment()->int_short(ME,ME));
     show_exits();
     return 1;
   }
@@ -1233,7 +1233,7 @@
   if (str[0]=='*')
   {
     goto(str[1..]);
-    printf(environment()->int_short(ME,ME));
+    printf(({string})environment()->int_short(ME,ME));
     show_exits();
     return 1;
   }
@@ -1241,7 +1241,7 @@
     return 0;
   move(exits[str],0);
   write("Merlin sagt: Jawoll, Chef.\n");
-  printf(environment()->int_short(ME,ME));
+  printf(({string})environment()->int_short(ME,ME));
   show_exits();
   return 1;
 }
diff --git a/secure/news.c b/secure/news.c
index 2f9e6aa..83a73f5 100644
--- a/secure/news.c
+++ b/secure/news.c
@@ -131,7 +131,7 @@
 
   if (member(grouplist, name)) return -2; // Gibt es schon
 
-  if (!master()->find_userinfo(owner)) return -3;
+  if (!({int})master()->find_userinfo(owner)) return -3;
 
   savefilea = old_explode(name,".");
   savefile = implode(savefilea,"/");
diff --git a/secure/questmaster.c b/secure/questmaster.c
index d6f2fb4..eccb425 100644
--- a/secure/questmaster.c
+++ b/secure/questmaster.c
@@ -101,13 +101,13 @@
 
   RebuildMQCache();
   set_next_reset(43200); // Reset alle 12 Stunden.
-  EVENTD->RegisterEvent(EVT_LIB_QUEST_SOLVED,"HandleQuestSolved",
+  ({int})EVENTD->RegisterEvent(EVT_LIB_QUEST_SOLVED,"HandleQuestSolved",
       ME);
 }
 
 public int remove(int silent) {
   save_info();
-  EVENTD->UnregisterEvent(EVT_LIB_QUEST_SOLVED, ME);
+  ({int})EVENTD->UnregisterEvent(EVT_LIB_QUEST_SOLVED, ME);
   destruct(ME);
   return 1;
 }
@@ -370,7 +370,7 @@
 void Channel(string msg) {
   if(!interactive(previous_object()))
     return;
-  catch(CHMASTER->send("Abenteuer", ME, msg);publish);
+  catch(({int})CHMASTER->send("Abenteuer", ME, msg);publish);
 }
 
  /* quoted from /sys/mail.h: */
@@ -423,7 +423,7 @@
   mail[MSG_ID]=MUDNAME":"+time();
   mail[MSG_BODY]=text;
 
-  "/secure/mailer"->DeliverMail(mail,0);
+  ({string*})"/secure/mailer"->DeliverMail(mail,0);
   return;
 }
 
@@ -451,7 +451,7 @@
   if(!objectp(pl))
     return "Ohne Spielernamen/Spielerobjekt gibt es auch keine Liste.\n";
 
-  if ( (pl->QueryProp(P_TTY)) == "ansi")
+  if ( (({string})pl->QueryProp(P_TTY)) == "ansi")
   {
       ja = ANSI_GREEN + "ja" + ANSI_NORMAL;
       nein = ANSI_RED + "nein" + ANSI_NORMAL;
@@ -480,7 +480,7 @@
     for (j=sizeof(qgrouped[i])-1;j>=0; j--)
     {
       qtmp = QueryQuest(qgrouped[i][j]);
-      int geloest_status = pl->QueryQuest(qgrouped[i][j]);
+      int geloest_status = ({int})pl->QueryQuest(qgrouped[i][j]);
       // Quest ausgeben, wenn "kein Filter" gegeben oder Quest geloest und
       // Filter "geloest" oder Quest ungeloest und Filter "ungeloest".
       if ( !(geloest_filter & (FILTER_GELOEST|FILTER_UNGELOEST))
@@ -552,7 +552,7 @@
   string qname = data[E_QUESTNAME];
 
   if (!quests[qname] || !objectp(trigob)
-      || trigob->QueryProp(P_TESTPLAYER) || IS_LEARNER(trigob))
+      || ({int|string})trigob->QueryProp(P_TESTPLAYER) || IS_LEARNER(trigob))
     return;
 
   int lvl = ({int})trigob->QueryProp(P_LEVEL);
@@ -870,7 +870,7 @@
       ((this_player() == winner) && !query_once_interactive(winner)))
     return MQ_ILLEGAL_OBJ;
   // Gaeste koennen keine Miniquests bestehen.
-  if (winner->QueryGuest())
+  if (({int})winner->QueryGuest())
     return MQ_GUEST;
   // Aufrufendes Objekt existiert gar nicht?
   if (!previous_object())
@@ -884,7 +884,7 @@
   if (!miniquests[objname, MQ_DATA_ACTIVE])
     return MQ_IS_INACTIVE;
 
-  string mq = (MASTER->query_mq(getuid(winner)) || "");
+  string mq = (({string})MASTER->query_mq(getuid(winner)) || "");
 
   // Spieler hat die MQ schonmal bestanden? Dann keine weiteren Aktivitaet
   // noetig
@@ -892,14 +892,14 @@
     return MQ_ALREADY_SET;
 
   catch(mq = set_bit(mq, miniquests[objname,MQ_DATA_QUESTNO]);publish);
-  MASTER->update_mq(getuid(winner), mq);
+  ({int})MASTER->update_mq(getuid(winner), mq);
 
   MQSOLVEDLOG(sprintf("%s: %s, (#%d), (Stupse %d)",
     objname, geteuid(winner), miniquests[objname, MQ_DATA_QUESTNO],
     miniquests[objname, MQ_DATA_POINTS]));
 
   // Miniquest-Event ausloesen
-  EVENTD->TriggerEvent( EVT_LIB_MINIQUEST_SOLVED, ([
+  ({int})EVENTD->TriggerEvent( EVT_LIB_MINIQUEST_SOLVED, ([
             E_OBJECT: previous_object(),
             E_OBNAME: objname,
             E_PLNAME: getuid(winner),
@@ -934,7 +934,7 @@
   if (!member(users_mq, spieler)) {
     int mqpoints;
     int p=-1;
-    string s = (MASTER->query_mq(spieler) || "");
+    string s = (({string})MASTER->query_mq(spieler) || "");
     while( (p=next_bit(s, p)) != -1) {
       mqpoints+=by_num[p][0];
     }
@@ -972,7 +972,7 @@
   if (!member(miniquests,name))
     return MQ_KEY_INVALID;
 
-  mq = (MASTER->query_mq(spieler) || "");
+  mq = (({string})MASTER->query_mq(spieler) || "");
 
   return test_bit(mq, miniquests[name, MQ_DATA_QUESTNO]);
 }
@@ -989,13 +989,13 @@
   if (!member(miniquests,name))
     return MQ_KEY_INVALID;
 
-  string mq = (MASTER->query_mq(pl) || "");
+  string mq = (({string})MASTER->query_mq(pl) || "");
 
   if (test_bit(mq, miniquests[name,MQ_DATA_QUESTNO]))
     return MQ_ALREADY_SET;
 
   catch (mq = set_bit(mq, miniquests[name, MQ_DATA_QUESTNO]);publish);
-  MASTER->update_mq(pl, mq);
+  ({int})MASTER->update_mq(pl, mq);
 
   MQMLOG(sprintf("SetPlayerMiniQuest: %s %s (%s)",
                  pl, name, getuid(this_interactive())));
@@ -1015,13 +1015,13 @@
   if (!member(miniquests,name))
     return MQ_KEY_INVALID;
 
-  string mq = (MASTER->query_mq(pl) || "");
+  string mq = (({string})MASTER->query_mq(pl) || "");
 
   if (!test_bit(mq, miniquests[name, MQ_DATA_QUESTNO]))
     return MQ_ALREADY_SET;
 
   catch (mq = clear_bit(mq, miniquests[name, MQ_DATA_QUESTNO]);publish);
-  MASTER->update_mq(pl, mq);
+  ({int})MASTER->update_mq(pl, mq);
 
   MQMLOG(sprintf("ClearPlayerMiniQuest: %s %s (%s)",
                  pl, name, getuid(this_interactive())));
diff --git a/secure/scoremaster.c b/secure/scoremaster.c
index 6a08eff..0cd1e5d 100644
--- a/secure/scoremaster.c
+++ b/secure/scoremaster.c
@@ -226,7 +226,7 @@
   i=sizeof(whop=m_indices(to_change))-1;
   while (i>=0 && get_eval_cost()>100000)
   {
-    ek = ({string})(MASTER->query_ek(who=whop[i]) || "");
+    ek = (({string})MASTER->query_ek(who=whop[i]) || "");
     for (j=sizeof(what=to_change[who])-1;j>=0;j--) {
       if ((value=what[j])>0) {
     // Vergabestatistik hochzaehlen.
@@ -245,7 +245,7 @@
   sprintf("SET_CLEAR_BIT (reset): %s %4d %s\n",
     who, j, strftime("%d%m%Y-%T",time()) ));
     }
-    MASTER->update_ek(who, ek);
+    ({int})MASTER->update_ek(who, ek);
 
     if (member(users_ek, who))
       m_delete(users_ek, who);
@@ -399,7 +399,7 @@
   foreach(string pl: unconfirmed_scores[bit]) {
       string eks = ({string})master()->query_ek(pl);
       eks = set_bit(eks, bit);
-      master()->update_ek(pl, eks);
+      ({int})master()->update_ek(pl, eks);
       write_file(SCOREAUTOLOG, sprintf(
     "SETBIT: %s %5d %s\n",
     strftime("%d%m%Y-%T",time()), bit, pl));
@@ -688,7 +688,7 @@
 // ausgetragen/deaktiviet sind.
 public string QueryAllKills(string pl)
 {
-  return (MASTER->query_ek(pl) || "");
+  return (({string})MASTER->query_ek(pl) || "");
 }
 
 // filtert alle Eintraege aus dem Bitstring heraus, die fuer
@@ -711,7 +711,7 @@
 
   if (member(users_ek,pl)) return users_ek[pl];
 
-  string s = (MASTER->query_ek(pl) || "");
+  string s = (({string})MASTER->query_ek(pl) || "");
   
   int p=-1;
   int summe;
@@ -779,11 +779,11 @@
   }
   else {
     // sonst wird das Bit direkt im Spieler gesetzt.
-    ek = (MASTER->query_ek(pls) || "");
+    ek = (({string})MASTER->query_ek(pls) || "");
     if (test_bit(ek, bit))
       return -3;
     ek = set_bit(ek, bit);
-    MASTER->update_ek(pls, ek);
+    ({int})MASTER->update_ek(pls, ek);
     // Vergabestatistik hochzaehlen.
     npcs[by_num[bit,BYNUM_KEY],NPC_COUNT]++;
   }
@@ -818,7 +818,7 @@
       member(pls,pl) != -1)
     return 1;
 
-  string eks = (MASTER->query_ek(pl) || "");
+  string eks = (({string})MASTER->query_ek(pl) || "");
 
   return test_bit(eks, bit);
 }
@@ -865,9 +865,9 @@
   if (!allowed())
     return SCORE_NO_PERMISSION;
 
-  ek = (MASTER->query_ek(pl) || "");
+  ek = (({string})MASTER->query_ek(pl) || "");
   ek = set_bit(ek, bit);
-  MASTER->update_ek(pl, ek);
+  ({int})MASTER->update_ek(pl, ek);
 
   // Vergabestatistik hochzaehlen.
   npcs[by_num[bit,BYNUM_KEY],NPC_COUNT]++;
@@ -889,9 +889,9 @@
   if (!allowed())
     return SCORE_NO_PERMISSION;
 
-  ek = (MASTER->query_ek(pl) || "");
+  ek = (({string})MASTER->query_ek(pl) || "");
   ek = clear_bit(ek, bit);
-  MASTER->update_ek(pl, ek);
+  ({int})MASTER->update_ek(pl, ek);
 
   // Vergabestatistik runterzaehlen.
   npcs[by_num[bit,BYNUM_KEY],NPC_COUNT]--;
@@ -1297,7 +1297,7 @@
       tip=getTip(tmp[index]);
       if (stringp(tip) && sizeof(tip)) {
     ektip=set_bit(ektip,npcs[tmp[index],NPC_NUMBER]);
-    MASTER->update_ektips(pl,ektip);
+    ({int})MASTER->update_ektips(pl,ektip);
     break; //fertig
       }
   }
@@ -1412,10 +1412,10 @@
   }
 
   if (changed) {
-      master()->update_ek(pl, eks);
+      ({int})master()->update_ek(pl, eks);
   }
   if (changed2) {
-      master()->update_ektips(pl, ektips);
+      ({int})master()->update_ektips(pl, ektips);
   }
   opfer-=({""});
   write_file(WERKILLTWEN,sprintf("%s\n%=-78s\n\n",pl,CountUp(opfer)||""));
diff --git a/secure/telnetneg.c b/secure/telnetneg.c
index 707bc7b..c5da0d2 100644
--- a/secure/telnetneg.c
+++ b/secure/telnetneg.c
@@ -279,7 +279,7 @@
   {
     send_telnet_neg_str(
         to_bytes(({SB, TELOPT_MSSP}))
-        + to_bytes(sprintf("%s", mssp->get_telnegs_str()),
+        + to_bytes(sprintf("%s", ({string})mssp->get_telnegs_str()),
                    "ASCII//TRANSLIT"));
     // die Daten brauchen wir nicht mehr
     opt->lo_wishes->sbdata = 0;
@@ -988,8 +988,8 @@
   _bind_telneg_std_handlers();
   // dann restliche Daten aus dem Loginobjekt holen.
   Terminals = ({string *}) previous_object()->query_terminals();
-  Set( P_TTY_COLS, previous_object()->Query(P_TTY_COLS) );
-  Set( P_TTY_ROWS, previous_object()->Query(P_TTY_ROWS) );
+  Set( P_TTY_COLS, ({int})previous_object()->Query(P_TTY_COLS) );
+  Set( P_TTY_ROWS, ({int})previous_object()->Query(P_TTY_ROWS) );
 
   struct telopt_s opt = TN[TELOPT_NAWS];
   if (optargs = (opt->re_wishes)->sbdata) {
diff --git a/secure/wizlevels.h b/secure/wizlevels.h
index e785158..f2a72fb 100644
--- a/secure/wizlevels.h
+++ b/secure/wizlevels.h
@@ -37,15 +37,15 @@
 #define IS_SPECIAL(user) (query_wiz_level(user) >= SPECIAL_LVL)
 #define IS_WIZARD(user) (query_wiz_level(user) >= WIZARD_LVL)
 #define IS_DOMAINMEMBER(user) (query_wiz_level(user) >= DOMAINMEMBER_LVL)
-#define IS_DEPUTY(user) (master()->IsDeputy(user))
+#define IS_DEPUTY(user) (({int})master()->IsDeputy(user))
 #define IS_LORD(user) (query_wiz_level(user) >= LORD_LVL)
 #define IS_ELDER(user) (query_wiz_level(user) >= ELDER_LVL)
 #define IS_ARCH(user) (query_wiz_level(user) >= ARCH_LVL)
 #define IS_GOD(user) (query_wiz_level(user) >= GOD_LVL)
 
 #define IS_LEARNING(user) (query_wiz_level(user) >= LEARNER_LVL &&\
-                           user->QueryProp(P_WANTS_TO_LEARN))
-#define IS_LORD_DOMAIN(user,domain) (master()->domain_master(user,domain))
+                           ({int})user->QueryProp(P_WANTS_TO_LEARN))
+#define IS_LORD_DOMAIN(user,domain) (({int})master()->domain_master(user,domain))
 
 /*
  * Interface for enhanced security functions
