diff --git a/d/seher/haeuser/hausverwalter.c b/d/seher/haeuser/hausverwalter.c
index 26643d1..058a77b 100644
--- a/d/seher/haeuser/hausverwalter.c
+++ b/d/seher/haeuser/hausverwalter.c
@@ -117,7 +117,8 @@
     return 1;
   }
   
-  catch(ar = (int)(PATH+"access_rights")->access_rights(geteuid(this_interactive()), "haus.h"));
+  catch(ar = ({int})(PATH+"access_rights")->access_rights(
+                      geteuid(this_interactive()), "haus.h"));
 
   // Erzmagier und alle mit Schreibrechten auf haus.h duerfen
   if ( (this_interactive() == this_player()) &&
@@ -188,7 +189,8 @@
       printf("error loading %O!\n", hname);
       continue;
     }
-    foreach (string dir, string path : (mapping)(here->QueryProp(P_EXITS))) {
+    foreach (string dir, string path : ({mapping})(here->QueryProp(P_EXITS)))
+    {
       // betrachte alle Ausgaenge
       if (dir == "raus") {
         // Haustuer aus dem Hauptraum darf natuerlich rausfuehren
diff --git a/d/seher/haeuser/traghaus.c b/d/seher/haeuser/traghaus.c
index 7a55bb8..a0c5e41 100644
--- a/d/seher/haeuser/traghaus.c
+++ b/d/seher/haeuser/traghaus.c
@@ -177,7 +177,7 @@
 Du wirfst noch einmal einen verstohlenen Blick auf die Giesskanne, musst aber\n\
 feststellen, dass sie verschwunden ist und auch verschwunden bleibt.\n" );
 
-  say(capitalize((string)(this_player()->name()))+" verwandelt mit einem Tropfen Wasser "+
+  say(capitalize(this_player()->name())+" verwandelt mit einem Tropfen Wasser "+
       this_player()->QueryPossPronoun(this_object(), WEN) + " Haus.\n");
 
   VERWALTER->NeuesHaus(owner, environment(this_object()));
diff --git a/d/seher/haeuser/virtual_compiler.c b/d/seher/haeuser/virtual_compiler.c
index a4f844c..7e05245 100644
--- a/d/seher/haeuser/virtual_compiler.c
+++ b/d/seher/haeuser/virtual_compiler.c
@@ -38,7 +38,7 @@
   // Zeiger auf Cloneliste holen
   if (call_other(MEMORY,"HaveRights")) {
     // Objektpointer laden
-    objects = (mixed) call_other(MEMORY,"Load","objects");
+    objects = call_other(MEMORY,"Load","objects");
 
     // Hats geklappt?
     if (!mappingp(objects)) 
@@ -68,11 +68,11 @@
 
   if (name[<6..<3] == "haus" )
   {
-    ob = (object) (VERWALTER)->_LadeHaus(name[0..<7]);
+    ob = ({object})(VERWALTER)->_LadeHaus(name[0..<7]);
   }
   else if (name[<7..<4] == "raum" )
   {
-    ob = (object) (VERWALTER)->_LadeRaum(name[0..<8], to_int(name[<3..<3]));
+    ob = ({object})(VERWALTER)->_LadeRaum(name[0..<8], to_int(name[<3..<3]));
   } 
   else 
   {
@@ -94,7 +94,7 @@
   Soll die Liste der Objekte zum VC per QueryObjects ausgegeben werden oder nicht?
 */
   
-int ToggleCloneList()
+void ToggleCloneList()
 {
   show_clone_list ^= 1;
   tell_object(this_player(), "Die Clone List wird nun "+
diff --git a/mail/nedit.c b/mail/nedit.c
index b6225a2..03fa088 100644
--- a/mail/nedit.c
+++ b/mail/nedit.c
@@ -86,7 +86,7 @@
   bend = cur = len = sizeof(nedittext)-1;
   nexitfunc=exitfunc;
   flags = 0;
-  editor_used=(string)TP->query_real_name();
+  editor_used=({string})TP->query_real_name();
   if (pretext)
     get_edit_line("~z");
   else {
@@ -300,7 +300,7 @@
   {
     str=str[2..<2];
     if (str[0..0]==" ") str=str[1..<1];
-    if (!str || catch(err=file_size(str=(string)"/secure/master"->_get_path(str,getuid(TP)))) || err<0) {
+    if (!str || catch(err=file_size(str=({string})"/secure/master"->_get_path(str,getuid(TP)))) || err<0) {
       write("File nicht gefunden.\n");
       //nedit_prompt();
       input_to("get_edit_line", INPUT_PROMPT, nedit_prompt());
diff --git a/obj/tools/questtool.c b/obj/tools/questtool.c
index 6fa1e32..a4c3ff2 100644
--- a/obj/tools/questtool.c
+++ b/obj/tools/questtool.c
@@ -157,7 +157,7 @@
   string *keys;
   int i;
 
-  if ( !(keys = (string*) QM->QueryAllKeys()) ) return;
+  if ( !(keys = ({string*}) QM->QueryAllKeys()) ) return;
   keys=sort_array(keys,#'>);//')
   for ( i = 0, num_key = ([]); i < sizeof(keys); i++ )
     num_key += ([(i+1)+"":keys[i]]);
@@ -200,39 +200,39 @@
 	name = str;
       counter++;
       write ( sprintf("Punkte (>0) [%d]:\n",
-		      (do_change?(int)savequest[0]:10)) ); 
+		      (do_change ? savequest[0] : 10)) ); 
       input_to ( "ReadNewQuest" );
       break;
     case QP:
       if((!str||!sizeof(str)))
 	if(do_change)
-	  qp = (int) savequest[Q_QP];
+	  qp = ({int})savequest[Q_QP];
 	else
 	  qp = 10;
       else
 	sscanf ( str, "%d", qp );
       counter++;
       write ( sprintf("Erfahrung (>=0) [%d]:\n",
-		      (do_change?(int)savequest[1]:qp*1000)));
+		      (do_change ? savequest[1] : qp*1000)));
       input_to ( "ReadNewQuest" );
       break;
     case XP: 
       if((!str||!sizeof(str)))
 	if(do_change)
-	  xp = (int) savequest[Q_XP];
+	  xp = ({int})savequest[Q_XP];
 	else
 	  xp = qp * 1000;
       else
 	sscanf ( str, "%d", xp );
       counter++;
       write ( sprintf("Filenamen file1[,file2,...]) %s:\n",
-		      (do_change?"["+implode((string *)savequest[2],",")+"]":
+		      (do_change?"["+implode(savequest[2],",")+"]":
 		       "")) );
       input_to ( "ReadNewQuest" );
       break;
     case ALLOW:
       if((!str||!sizeof(str)) && do_change)
-	allowed = (string *) savequest[Q_ALLOWED];
+	allowed = ({string *}) savequest[Q_ALLOWED];
       else
 	allowed = old_explode(implode(old_explode(str,".c"),""),",");
       counter++;
@@ -249,7 +249,7 @@
 	info = str;
       counter++;
       write ( sprintf("Stufe (-1 <=lev<=10) (-1 ist eine Seherquest) [%d]:\n",
-		      (do_change?(int)savequest[4]:0)) );
+		      (do_change ? savequest[4] : 0)) );
       input_to ( "ReadNewQuest" );
       break;
     case LEVEL:
@@ -261,40 +261,40 @@
 	sscanf ( str, "%d", level );
       counter++;
       write ( sprintf("Klasse ([012345]) [%d]:\n",
-		      (do_change?(int)savequest[5]:0)) ); 
+		      (do_change ? savequest[5] : 0)) ); 
       input_to ( "ReadNewQuest" );
       break;
     case CLASS:
       if((!str||!sizeof(str)))
 	if(do_change)
-	  need = (int) savequest[Q_CLASS];
+	  need = ({int})savequest[Q_CLASS];
 	else
 	  need = 0;
       else
 	sscanf ( str, "%d", need );
       counter++;
       write ( sprintf("Attribut [01234]\n(1=fleissig,2=heroisch,3=episch,4=legendaer) %s:\n",
-		      (do_change?"["+(string)savequest[9]+"]":"")) );
+		      (do_change?"["+savequest[9]+"]":"")) );
       input_to ( "ReadNewQuest" );
       break;
     case ATTR:
       if ((!str||!sizeof(str)))
 	if (do_change)
-	  group = (int) savequest[Q_ATTR];
+	  group = ({int})savequest[Q_ATTR];
 	else
 	  group = 0;
       else
 	sscanf (str, "%d", group);
       counter++;
       write ( sprintf("Magier %s:\n",
-		      (do_change?"["+(string)savequest[7]+"]":"")) );
+		      (do_change?"["+savequest[7]+"]":"")) );
       input_to ( "ReadNewQuest" );
     break;	
     case WIZ:
       if((!str||!sizeof(str)) && do_change)
-	wizard = (string) savequest[Q_WIZ];
+        wizard = ({string})savequest[Q_WIZ];
       else
-	wizard = str;
+        wizard = str;
       wizard = lower_case(wizard);
       counter++;
       write ( sprintf("Wartender Magier %s:\n",
@@ -303,9 +303,9 @@
       break;
     case SCNDWIZ:
       if ((!str||!sizeof(str)) && do_change)
-	scndwizard = (string) savequest[Q_SCNDWIZ];
+        scndwizard = ({string}) savequest[Q_SCNDWIZ];
       else
-	scndwizard = str;
+        scndwizard = str;
       scndwizard = lower_case(scndwizard);
       counter++;
       write ( "Eintragen (j/n)?\n" );
@@ -320,7 +320,7 @@
       active = 0;
       if ( do_change && changekey && sizeof(changekey) )
       {
-	oldquest = (mixed *) QM->QueryQuest ( changekey );
+        oldquest = ({mixed *}) QM->QueryQuest ( changekey );
 
 	if ( !pointerp ( oldquest ) || !sizeof ( oldquest ) )
 	{
@@ -328,7 +328,7 @@
 	  return;
 	}
 
-	errstat = (int) QM->RemoveQuest( changekey );
+	errstat = ({int}) QM->RemoveQuest( changekey );
 
 	do_change = 0;
 	changekey = "";
@@ -347,7 +347,7 @@
 
       // add new Quest deactivated by default and keep old active flag
       // if changing an existing entry
-      errstat= (int)QM->AddQuest(name,qp,xp,allowed,info,level,need,active,
+      errstat= ({int})QM->AddQuest(name,qp,xp,allowed,info,level,need,active,
 				 wizard, scndwizard, group);
 
       switch ( errstat )
@@ -387,7 +387,7 @@
   if ( !(newstr = num_key[str+""]) )
     newstr = str;
 
-  oldquest = (mixed *) QM->QueryQuest ( newstr );
+  oldquest = ({mixed *}) QM->QueryQuest ( newstr );
 
   if ( !pointerp ( oldquest ) || !sizeof ( oldquest ) )
   {
@@ -395,7 +395,7 @@
     return 1;
   }
 
-  errstat = (int) QM->RemoveQuest( newstr );
+  errstat = ({int}) QM->RemoveQuest( newstr );
 
   switch ( errstat )
   {
@@ -427,7 +427,7 @@
   if ( !(newstr = num_key[str+""]) )
     newstr = str;
 
-  oldquest = (mixed *) QM->QueryQuest ( newstr );
+  oldquest = ({mixed *}) QM->QueryQuest ( newstr );
 
   if ( !pointerp( oldquest ) || !sizeof ( oldquest ) )
   {
@@ -472,11 +472,9 @@
   }
 
   errstat = 
-	(int)QM->AddQuest( savekey, (int) savequest[0], (int) savequest[1],
-			  (string *) savequest[2], (string) savequest[3],
-			  (int) savequest[4], (int) savequest[5],
-			  (string) savequest[6], (int) savequest[7],
-			  (string) savequest[8] );
+	  ({int})QM->AddQuest(savekey, savequest[0], savequest[1],
+			           savequest[2], savequest[3], savequest[4], savequest[5],
+			           savequest[6], savequest[7], savequest[8]);
 
   switch ( errstat )
   {
@@ -531,7 +529,7 @@
     return 1;
   }
   
-  write(ERRNO_2_STRING("GQ",(int)ob->GiveQuest(newquest,"__silent__"))+"\n");
+  write(ERRNO_2_STRING("GQ",({int})ob->GiveQuest(newquest,"__silent__"))+"\n");
   if(created)
   {
     ob->save_me(0);
@@ -577,7 +575,7 @@
     return 1;
   }
   
-  write(ERRNO_2_STRING("DQ",(int) ob->DeleteQuest ( newquest ))+"\n");
+  write(ERRNO_2_STRING("DQ",({int}) ob->DeleteQuest ( newquest ))+"\n");
   if(created)
   {
     ob->save_me(0);
@@ -606,7 +604,7 @@
   if ( !(newstr = num_key[str+""]) )
 	newstr = str;
 
-  quest = (mixed *) QM->QueryQuest( newstr );
+  quest = ({mixed *}) QM->QueryQuest( newstr );
 
   if ( !pointerp( quest ) || !sizeof ( quest ) )
   {
@@ -640,14 +638,14 @@
   mixed *quest;
   int i;
 
-  if ( !(keys = (string *) QM->QueryAllKeys()) )
+  if ( !(keys = ({string *}) QM->QueryAllKeys()) )
     return 1;
 
   write ( "\n" );
   keys=sort_array(keys,#'>);//')
   for ( i = 0; i < sizeof(keys); i++ )
   {
-    quest = (mixed *) QM->QueryQuest(keys[i]);
+    quest = ({mixed *}) QM->QueryQuest(keys[i]);
     if(quest[6])
       active="*";
     else
@@ -667,13 +665,13 @@
   string *keys, rstr;
   int i;
 
-  if ( !(keys = (mixed *) QM->QueryAllKeys()) )
+  if ( !(keys = ({mixed *})QM->QueryAllKeys()) )
     return 1;
 
   keys=sort_array(keys,#'>);//')
   for ( i = 0, rstr = ""; i < sizeof(keys); i++ )
   {
-    quest = (mixed *) QM->QueryQuest(keys[i]);
+    quest = ({mixed *}) QM->QueryQuest(keys[i]);
       write ( "\nKey              : "+keys[i] );
   if(quest[Q_ACTIVE])
     write (" (aktiviert)\n");
diff --git a/secure/lepmaster.c b/secure/lepmaster.c
index 3d7cb79..6e53834 100644
--- a/secure/lepmaster.c
+++ b/secure/lepmaster.c
@@ -80,24 +80,24 @@
   ret = 100;
 
   // Beitrag A: Stupse von NPC-Erstkills
-  ret += (int)SCOREMASTER->QueryKillPoints(pl);
+  ret += ({int})SCOREMASTER->QueryKillPoints(pl);
 
   DEBUG("Nach KP: ret = %d\n", ret);
 
   // Beitrag B: Stupse von geloesten Miniquests
-  ret += (int)QM->QueryMiniQuestPoints(pl);
+  ret += ({int})QM->QueryMiniQuestPoints(pl);
 
   DEBUG("Nach MQP: ret = %d\n", ret);
 
   // Beitrag C: Questpunkte
   //  werden 1:1 uebernommen;
-  ret += (int)pl->QueryProp(P_QP);
+  ret += ({int})pl->QueryProp(P_QP);
 
   DEBUG("Nach QP: ret = %d\n", ret);
 
   // Beitrag D: Erfahrungspunkte
   //  Stupse = XPs ^ 0.32
-  val = (int)pl->QueryProp(P_XP);
+  val = ({int})pl->QueryProp(P_XP);
 
   if (val<1) l=0;
   else l=to_int(exp(log(to_float(val))*0.32));
@@ -109,19 +109,19 @@
   // Beitrag E: Zaubertraenke
   //  Gefundene Traenke geben 5 LEP
   //  Die Heiltraenke geben zusaetzlich 10+20+30+40 LEP
-  i = 80 - (val = sizeof((int *)pl->QueryProp(P_POTIONROOMS)));
+  i = 80 - (val = sizeof(({int *})pl->QueryProp(P_POTIONROOMS)));
 
   ret += 5*i + ([ 0: 100, 1: 60, 2: 30, 3: 10])[val];
 
   // Beitrag F: Forscherpunkte
   //  Pro FP gibt es 6 Stufenpunkte
-  ret += 6 * (int)EPMASTER->QueryExplorationPoints(pl);
+  ret += 6 * ({int})EPMASTER->QueryExplorationPoints(pl);
 
   DEBUG("Nach FP: ret = %d\n", ret);
 
   // Beitrag G: Gildeneinstufung
   //  Maximale Gildeneinstufung (10000) entspricht vier Leveln
-  ret += ((int)pl->QueryProp(P_GUILD_RATING))/25;
+  ret += (({int})pl->QueryProp(P_GUILD_RATING))/25;
 
   DEBUG("Nach GR: ret = %d\n", ret);
 
@@ -193,12 +193,12 @@
   int max, my, avg;
   string ret;
 
-  if ((my=(int)EPMASTER->QueryExplorationPoints(getuid(previous_object()))) < MIN_EP)
+  if ((my=({int})EPMASTER->QueryExplorationPoints(getuid(previous_object()))) < MIN_EP)
     return "Du kennst Dich im "MUDNAME" so gut wie gar nicht aus.\n";
 
   my *= 100;
-  max = my/(int)EPMASTER->QueryMaxEP();
-  avg = my/(int)EPMASTER->QueryAverage();
+  max = my/({int})EPMASTER->QueryMaxEP();
+  avg = my/({int})EPMASTER->QueryAverage();
 
   ret = "Verglichen mit Deinen Mitspielern, kennst Du Dich im "MUDNAME" ";
   switch(avg) {
@@ -308,12 +308,12 @@
   DEBUG("Abenteuerpunkte: %d ("+REQ_QP+")\n", player->QueryProp(P_QP));
   if (player->QueryProp(P_QP) < REQ_QP) {
     s += sprintf(" * Dir fehlen noch mindestens %d Abenteuerpunkte.\n", 
-		 REQ_QP - (int)player->QueryProp(P_QP));
+		 REQ_QP - ({int})player->QueryProp(P_QP));
     i--;
   }
 
   // Forscherpunkte
-  z = 6 * (int)EPMASTER->QueryExplorationPoints(player);
+  z = 6 * ({int})EPMASTER->QueryExplorationPoints(player);
   DEBUG("Forscherpunkte: %d ("+REQ_EP+")\n", z);
   if (z < REQ_EP) {
     s += sprintf(" * Du kennst Dich im "MUDNAME" noch nicht genug aus, "
@@ -323,7 +323,7 @@
   }
 
   // Zaubertraenke
-  z = 80 - (val = sizeof((int*)player->QueryProp(P_POTIONROOMS)));
+  z = 80 - (val = sizeof(({int*})player->QueryProp(P_POTIONROOMS)));
   z = z*5 + ([0:100, 1:60, 2:30, 3:10])[val];
   DEBUG("Zaubertraenke: %d ("+REQ_P+")\n", z);
   if (z < REQ_P) {
@@ -333,7 +333,7 @@
   }
 
   // Erstkills
-  z = (int)SCOREMASTER->QueryKillPoints(player);
+  z = ({int})SCOREMASTER->QueryKillPoints(player);
   DEBUG("Erstkills: %d ("+REQ_K+")\n", z);
   if (z < REQ_K) {
         s += sprintf(" * Du hast noch nicht genuegend wuerdige Gegner erlegt, genau "
@@ -346,7 +346,7 @@
 
   // Restliche Stufenpunkte 
   DEBUG("Stufenpunkte: %d ("+REQ_LEP+")\n", player->QueryProp(P_LEP));
-  if ((int)(player->QueryProp(P_LEP)) < REQ_LEP) {
+  if (({int})(player->QueryProp(P_LEP)) < REQ_LEP) {
     s += sprintf(" * Du musst mindestens %d Stufenpunkte, entspricht Stufe %d, "
         "erreichen.\n", REQ_LEP, minlevel);
     i--;
@@ -354,7 +354,7 @@
   
   // Demnach mindestens REQ/100-Level 
   DEBUG("Level: %d ("+REQ_LEP/100+")\n", player->QueryProp(P_LEVEL));
-  if ((int)player->QueryProp(P_LEVEL) < minlevel) {
+  if (({int})player->QueryProp(P_LEVEL) < minlevel) {
     s += sprintf(" * Du musst mindestens Stufe %d erreichen.\n", minlevel);
     i--;
   }
diff --git a/secure/merlin.c b/secure/merlin.c
index cfa8984..53b90c4 100644
--- a/secure/merlin.c
+++ b/secure/merlin.c
@@ -14,7 +14,7 @@
 #pragma warn_deprecated
 
 // 2014-Mai-10, Arathorn: Er soll ja weiterhin auf tm reagieren.
-inherit "std/npc/comm.c";
+inherit "/std/npc/comm.c";
 
 #include <config.h>
 #include <properties.h>
@@ -343,8 +343,8 @@
     return;
   }
 
-  if (!(int)pl->QueryGuest()) {
-  string plname = (string)pl->Name(WER);
+  if (!pl->QueryGuest()) {
+  string plname = ({string})pl->Name(WER);
     CHMASTER->send("Anfaenger", this_object(),
       sprintf("%s macht nun ebenfalls das Morgengrauen unsicher. "
               "Herzlich Willkommen %s!", plname, plname)
@@ -429,7 +429,7 @@
   tell_room(environment(), "Merlin schimpft: Lass das!!!\n",({PL}));
   tell_room(environment(),sprintf(
         "Merlin gibt %s eine schallende Ohrfeige.\n",      
-        capitalize((string)this_player()->name(WEM))), ({this_player()}));
+        capitalize(({string})this_player()->name(WEM))), ({this_player()}));
   return("Merlin schimpft: Lass das!!!\n"
       "Merlin gibt Dir eine schallende Ohrfeige.\n");
 }
@@ -455,11 +455,11 @@
 
   if (!(env=environment()))
     return;
-  if (!(ti=this_interactive())||(int)ti->QueryProp(P_LEVEL)<19||ti->QueryProp(P_GHOST))
+  if (!(ti=this_interactive())||ti->QueryProp(P_LEVEL)<19||ti->QueryProp(P_GHOST))
     return;
   tell_object(ti,"Du spuerst einen sengenden Schmerz.\n");
-  ti->do_damage( ((int)ti->QueryProp(P_HP)) / 2 + 5);
-  if((int)ti->QueryProp(P_GHOST)) return;
+  ti->do_damage( ti->QueryProp(P_HP) / 2 + 5);
+  if(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")
@@ -646,10 +646,10 @@
   if (IS_SEER(pl))
     return 1;
   
-  if ((int)LEPMASTER->QueryReadyForWiz(pl)==1)
+  if (LEPMASTER->QueryReadyForWiz(pl)==1)
     return 1;
 
-  s=(string)LEPMASTER->QueryReadyForWizText(pl); 
+  s=({string})LEPMASTER->QueryReadyForWizText(pl); 
 
   tell_object(pl, break_string("Merlin gruebelt ein wenig und teilt Dir "
                                "nach einigem Ueberlegen mit:\n\n", 78,0,1));
@@ -660,8 +660,9 @@
                                78, "Merlin teilt Dir mit: "));
 
   if (environment() == environment(pl))
-    say((string)pl->name(WER)
-        +" erfuellt noch nicht alle Anforderungen fuer den "+was+"status.\n",pl);
+    say(pl->name(WER)
+        +" erfuellt noch nicht alle Anforderungen fuer den "+was+
+        "status.\n",pl);
   
   return 0;
 }
@@ -743,15 +744,15 @@
       Say("Nur ein Erzmagier kann "+who->name(WEN)+" zum \"richtigen\" Magier machen!\n");
       return 0;
     }
-    ret=(int)"secure/master"->advance_wizlevel(geteuid(who),21);
+    ret=({int})"secure/master"->advance_wizlevel(geteuid(who),21);
     if (ret<=0)
     {
       say("Merlin: error "+ret+"\n");
       write("Merlin: error "+ret+"\n");
     }
-    write("Merlin ruft: "+(string)who->name(WER)+" ist in den Kreis der Magier "+
+    write("Merlin ruft: "+who->name(WER)+" ist in den Kreis der Magier "+
               "aufgenommen worden!\n");
-    shout("Merlin ruft: "+(string)who->name(WER)+" ist in den Kreis der Magier "+
+    shout("Merlin ruft: "+who->name(WER)+" ist in den Kreis der Magier "+
               "aufgenommen worden!\n");
     "secure/master"->renew_player_object(who);
     return 1;
@@ -762,7 +763,7 @@
   //
   if (IS_WIZARD(who))
   {
-    domains=(string*)"secure/master"->get_domain_homes(getuid(who));
+    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 "+
@@ -771,7 +772,7 @@
                 "an und komm\ndann wieder!\n");
       return 0;
     }
-    ret=(int)"secure/master"->advance_wizlevel(geteuid(who),25);
+    ret=({int})"secure/master"->advance_wizlevel(geteuid(who),25);
     if(ret>0)
     {
       shout(who->name(WER)+" arbeitet jetzt an einer Region mit!\n");
@@ -793,13 +794,13 @@
       Say("Nur ein Erzmagier kann "+who->name(WEN)+" zum \"richtigen\" Magier machen!\n");
       return 0;
     }
-    ret=(int)"secure/master"->advance_wizlevel(geteuid(who),20);
+    ret=({int})"secure/master"->advance_wizlevel(geteuid(who),20);
     if (ret<=0)
     {
       say("Merlin: error "+ret+"\n");
       write("Merlin: error "+ret+"\n");
     }
-    string wizname = (string)who->query_real_name();
+    string wizname = ({string})who->query_real_name();
     "secure/master"->renew_player_object(who);
     // Fehlerteufel geben
     call_out(#'GibFehlerteufel,4,find_player(wizname));
@@ -823,7 +824,7 @@
   // 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" ||
-      !((int)vertrag->is_unterschrieben()) )
+      !(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");
@@ -841,11 +842,12 @@
   }
   if (!QueryBedingungen(who,"Magier"))
     return 0;
-  ret=(int)"secure/master"->advance_wizlevel(geteuid(who),15);
+  ret=({int})"secure/master"->advance_wizlevel(geteuid(who),15);
   if (ret>0)
   {
     PostMagier(capitalize(getuid(who)),
-        capitalize(secure_euid()),(int)who->QueryProp(P_GENDER));
+               capitalize(secure_euid()),
+               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");
@@ -913,8 +915,8 @@
   "secure/master"->renew_player_object(player);
   player = find_player(playername);
   text = sprintf(" ist jetzt ein%s Seher%s!\n",
-    (((int)player->QueryProp(P_GENDER))==2?"e":""),
-    (((int)player->QueryProp(P_GENDER))==2?"in":""));
+    ((player->QueryProp(P_GENDER))==2?"e":""),
+    ((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));
@@ -969,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, ((int)player->QueryProp(P_GENDER))==1?"Seher":"Seherin"),
+     plname, (player->QueryProp(P_GENDER))==1?"Seher":"Seherin"),
               78, "Merlin sagt: "));
 
   call_out("seer_sequenz2", 4, player, plname);
@@ -1046,7 +1048,7 @@
       return;
   }
   // Ausgaenge durchsuchen
-  mapping ex=(mapping)environment()->QueryProp(P_EXITS);
+  mapping ex=({mapping})environment()->QueryProp(P_EXITS);
   if (!mappingp(ex))
     return;
   mapping rooms = m_allocate(sizeof(ex));
@@ -1105,7 +1107,7 @@
   for (i = 0; i < sizeof(inv); i++)
   {
     string sh;
-    sh = (string)inv[i]->short();
+    sh = ({string})inv[i]->short();
     if (iswiz)
     {
       if (sh) sh = sh[0..<2] + " ["+object_name(inv[i])+"]\n";
@@ -1151,7 +1153,7 @@
     printf("%s ist schon Stufe %d.\n",capitalize(wen),l);
         return 1;
   }
-  ret=(int)"secure/master"->advance_wizlevel(wen,stufe);
+  ret=({int})"secure/master"->advance_wizlevel(wen,stufe);
   if (ret<=0)
     printf("Errorcode %d\n",ret);
   else
@@ -1192,7 +1194,7 @@
     return 0;
   }
 
-  str=(string)this_interactive()->_unparsed_args();
+  str=({string})this_interactive()->_unparsed_args();
   switch (query_verb())
   {
     case "gilde":
@@ -1207,7 +1209,7 @@
   if (query_verb()!="merlin")
     return 0;
   delay=1;
-  mapping exits=(mapping)environment()->QueryProp(P_EXITS);
+  mapping exits=({mapping})environment()->QueryProp(P_EXITS);
   if (!str||str=="")
   {
     printf(environment()->int_short(ME,ME));
@@ -1265,7 +1267,7 @@
     move(object_name(ob),0);
     return 1;
   }
-  path=(mixed)master()->make_path_absolute(dest);
+  path = ({string})master()->make_path_absolute(dest);
   ret=catch(load_object(path);publish);
   if (ret && file_size(path)<0)
   {
diff --git a/secure/scoremaster.c b/secure/scoremaster.c
index 576a4b9..af40a93 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.
@@ -694,7 +694,7 @@
 // filtert alle Eintraege aus dem Bitstring heraus, die fuer
 // ausgetragene/inaktive EKs stehen.
 public string QueryKills(string pl) {
-  string res = (string)MASTER->query_ek(pl) || "";
+  string res = ({string})MASTER->query_ek(pl) || "";
   // vergleichen mit den aktiven EKs aus active_eks und nur jene Bits
   // zurueckliefern, die in beiden Strings gesetzt sind.
   return and_bits(res,active_eks);
@@ -931,7 +931,7 @@
       return ([]);
   }
   // alle EKs, die der Spieler hat
-  string eks = (string)master()->query_ek(getuid(player));
+  string eks = ({string})master()->query_ek(getuid(player));
   // als Tips kommen alle in Frage, die er nicht hat, vor dem Invertieren muss
   // aber sichergestellt werden, dass eks min. so lang ist wie active_eks, da
   // die Invertierung ja z.B. nur EKs 0-1700 beruecksichtigt, wenn 1700 der
@@ -947,7 +947,7 @@
   // jetzt invertieren
   string non_eks = invert_bits(eks);
   // jetzt vorhande EK-Tips ausfiltern. Im Prinzip gleiches Spiel wie oben.
-  string ektips = (string)master()->query_ektips(getuid(player));
+  string ektips = ({string})master()->query_ektips(getuid(player));
   // jetzt alle nicht als Tip vergebenen NPC ermitteln, vor dem Invertieren
   // wieder Laenge angleichen...
   ektips = invert_bits(clear_bit(set_bit(ektips, lb), lb));
@@ -1196,9 +1196,9 @@
   if (!stringp(player))
     return 0;
 
-  string tipstr=(string)master()->query_ektips(player);
+  string tipstr = ({string})master()->query_ektips(player);
   // jetzt EK-Tips ausfiltern, die erledigt sind. Dazu EK-Liste holen...
-  string eks=(string)master()->query_ek(player);
+  string eks = ({string})master()->query_ek(player);
   // als Tips kommen alle in Frage, die er nicht hat, vor dem Invertieren muss
   // aber sichergestellt werden, dass eks min. so lang ist wie tipstr, da
   // die Invertierung ja z.B. nur EKs 0-1700 beruecksichtigt, wenn 1700 der
@@ -1250,7 +1250,7 @@
   if(!player || !query_once_interactive(player))    
       return 0;
   
-  lvl=(int)player->QueryProp(P_LEVEL);
+  lvl = ({int})player->QueryProp(P_LEVEL);
   numElegible=0;
   i=sizeof(EKTIPS_LEVEL_LIMITS)-1;
 
@@ -1261,7 +1261,7 @@
       if(lvl>=EKTIPS_LEVEL_LIMITS[i]) numElegible++;
   }
 
-  tips=(string)MASTER->query_ektips(getuid(player)) || "";
+  tips = ({string})MASTER->query_ektips(getuid(player)) || "";
   // inaktive EKs ausfiltern.
   tips = and_bits(tips, active_eks);
   // und Gesamtzahl an Tips zaehlen. Hier werden erledigte Tips explizit nicht
@@ -1290,7 +1290,7 @@
 
   tmp=m_indices(free);
 
-  ektip=(string)MASTER->query_ektips(pl) || "";
+  ektip = ({string})MASTER->query_ektips(pl) || "";
  
   foreach(int i: EKTIPS_MAX_RETRY) {
       index=random(sizeof(tmp));
@@ -1362,7 +1362,7 @@
   int changed, changed2; 
   
   // EKs pruefen
-  string eks=(string)master()->query_ek(pl) || "";
+  string eks = ({string})master()->query_ek(pl) || "";
   string *opfer=allocate( (sizeof(eks)*6)+1, "");
   int p=-1;
   while ((p=next_bit(eks,p)) != -1) {
@@ -1389,7 +1389,7 @@
     }
   }
   // und noch die Ek-Tips...
-  string ektips = (string)master()->query_ektips(pl) || "";
+  string ektips = ({string})master()->query_ektips(pl) || "";
   p = -1;
   while ((p=next_bit(ektips,p)) != -1) {
     if (!member(by_num, p)) {
@@ -1428,9 +1428,9 @@
 
   if (!mappingp(allplayer)) {
       foreach(string key: npcs) {
-  npcs[key,NPC_COUNT]=0;
+        npcs[key,NPC_COUNT]=0;
       }
-      allplayer=(mapping)master()->get_all_players();
+      allplayer = ({mapping})master()->get_all_players();
       rm(WERKILLTWEN);
       call_out(#'check_all_player,2,allplayer);
       return;
diff --git a/std/util/pl_iterator.c b/std/util/pl_iterator.c
index 555a75e..8c87baf 100644
--- a/std/util/pl_iterator.c
+++ b/std/util/pl_iterator.c
@@ -45,8 +45,9 @@
 protected int start_player_check(closure check_cl, closure finish_cl, int res,
                              varargs mixed extra)
 {
+  // Reservierte Ticks, pausieren, wenn weniger.
   res ||= 1250000;
-  mapping allplayer=(mapping)master()->get_all_players();
+  mapping allplayer=master()->get_all_players();
   call_out(#'check_all_player,2, allplayer, check_cl, finish_cl, res, extra...);
   return 1;
 }
diff --git a/sys/player/fao.h b/sys/player/fao.h
index 8341a84..8864749 100644
--- a/sys/player/fao.h
+++ b/sys/player/fao.h
@@ -37,11 +37,11 @@
 #define FAO_MAY_USE_PORTAL(x,p)   (intp(p) && ((FAO_HAS_PORTALS1_GIFT(x) && \
         member(FAO_PORTALS1_LIST,p)!=-1 )||(FAO_HAS_PORTALS2_GIFT(x) && \
         member(FAO_PORTALS2_LIST,p)!=-1) ) && \
-    (pointerp((int*)x->QueryProp(P_FAO_PORTALS)) \
-     && member((int*)x->QueryProp(P_FAO_PORTALS),p)!=-1) )
+    (pointerp(({int*})x->QueryProp(P_FAO_PORTALS)) \
+     && member(({int*})x->QueryProp(P_FAO_PORTALS),p)!=-1) )
 #define FAO_HAS_SEER_PORTAL_GIFT(x)     (x!=0 && query_once_interactive(x) \
-    && ((int)x->QueryProp(P_FAO)&FAO_SEER_PORTAL)!=0)
+    && (({int})x->QueryProp(P_FAO)&FAO_SEER_PORTAL)!=0)
 #define FAO_IS_MEMBER(x) (x!=0 && query_once_interactive(x) \
-    && ((int)x->QueryProp(P_FAO)&FAO_MEMBER)!=0)
+    && (({int})x->QueryProp(P_FAO)&FAO_MEMBER)!=0)
 #endif // __PLAYER_FAO_H__
 
