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;
