diff --git a/items/money.c b/items/money.c
index af88680..f6a5173 100644
--- a/items/money.c
+++ b/items/money.c
@@ -6,7 +6,7 @@
 
 inherit "/std/unit";
 
-#pragma strong_types,rtt_checks
+#pragma strict_types,rtt_checks
 
 #include <properties.h>
 #include <language.h>
@@ -116,7 +116,7 @@
 
 int _query_autoloadobj()
 {
-  return (int)Query(P_AMOUNT, F_VALUE);
+  return ({int})Query(P_AMOUNT, F_VALUE);
 }
 
 string current_long() {
diff --git a/obj/tools/lupe.c b/obj/tools/lupe.c
index 105b602..94da478 100644
--- a/obj/tools/lupe.c
+++ b/obj/tools/lupe.c
@@ -697,7 +697,7 @@
   if (intp(ob))
     return ""+ob;
   if (stringp(ob))
-    return string_desc((string)ob);
+    return string_desc(ob);
   if (objectp(ob))
     return "OBJ("+object_name(ob)+")";
   if (!pointerp(ob))
diff --git a/p/daemon/channeld.c b/p/daemon/channeld.c
index d7d9029..cc9ced9 100644
--- a/p/daemon/channeld.c
+++ b/p/daemon/channeld.c
@@ -305,7 +305,7 @@
   // Hab ich die noetigen Rechte im Memory?
   if (call_other(MEMORY,"HaveRights")) {
     // Objektpointer laden
-    channelH = (mixed) call_other(MEMORY,"Load","History");
+    channelH = call_other(MEMORY,"Load","History");
 
     // Wenns nich geklappt hat, hat der Memory noch keinen Zeiger, dann
     if (!mappingp(channelH)){
diff --git a/p/daemon/debug.c b/p/daemon/debug.c
index e1b3f7f..2727d9c 100644
--- a/p/daemon/debug.c
+++ b/p/daemon/debug.c
@@ -30,7 +30,8 @@
             // Wer (noch) nicht auf dem Kanal ist, bekommt auch keine
             // Ausgabe - sonst gibt es selbige doppelt, da der CHMASTER
             // einen automatisch den Kanal betreten laesst ...
-            if ( !objectp(pl) || !pointerp(tmp=(mixed)pl->QueryProp(P_CHANNELS)) ||
+            if ( !objectp(pl) ||
+                 !pointerp(tmp=({string*})pl->QueryProp(P_CHANNELS)) ||
                  member( tmp, lower_case(ch) ) == -1 )
                 return 1;
 
diff --git a/secure/awmaster.c b/secure/awmaster.c
index cccdb1d..f1ce7d4 100644
--- a/secure/awmaster.c
+++ b/secure/awmaster.c
@@ -98,17 +98,17 @@
     if (!ob || !objectp(ob))
         return 0;
     re=0;
-    if (((object)ob->QueryProp(P_WEAR_FUNC))==ob  ||
-        ((object)ob->QueryProp(P_WIELD_FUNC))==ob )
+    if ((({object})ob->QueryProp(P_WEAR_FUNC))==ob  ||
+        (({object})ob->QueryProp(P_WIELD_FUNC))==ob )
         re += AWF_PUTON;
-    if (((object)ob->QueryProp(P_REMOVE_FUNC))==ob  ||
-        ((object)ob->QueryProp(P_UNWIELD_FUNC))==ob )
+    if ((({object})ob->QueryProp(P_REMOVE_FUNC))==ob  ||
+        (({object})ob->QueryProp(P_UNWIELD_FUNC))==ob )
         re += AWF_PUTOFF;
-    if (((object)ob->QueryProp(P_DEFEND_FUNC))==ob ||
-        ((object)ob->QueryProp(P_HIT_FUNC))==ob    )
+    if ((({object})ob->QueryProp(P_DEFEND_FUNC))==ob ||
+        (({object})ob->QueryProp(P_HIT_FUNC))==ob    )
         re += AWF_BOOST;
     // ists nen Mapping und nicht leer?
-    if (mappingp(m=(mapping)ob->QueryProp(P_RESISTANCE_STRENGTHS))
+    if (mappingp(m=({mapping})ob->QueryProp(P_RESISTANCE_STRENGTHS))
         && sizeof(m))
         re += AWF_RESIST;
     return re;
@@ -127,17 +127,17 @@
     {
         armours[id][AWM_TIME]=time();
         flag=0;
-        if ((h=(int)ob->QueryProp(P_AC)) > armours[id][AWM_CLASS])
+        if ((h=({int})ob->QueryProp(P_AC)) > armours[id][AWM_CLASS])
         {
             armours[id][AWM_CLASS]=h;
             flag=1;
         }
-        if ((h=(int)ob->QueryProp(P_EFFECTIVE_AC)) > armours[id][AWM_EFF_CLASS])
+        if ((h=({int})ob->QueryProp(P_EFFECTIVE_AC)) > armours[id][AWM_EFF_CLASS])
         {
             armours[id][AWM_EFF_CLASS]=h;
             flag=1;
         }
-        if ((h=(int)ob->QueryProp(P_NR_HANDS)) < armours[id][AWM_HANDS])
+        if ((h=({int})ob->QueryProp(P_NR_HANDS)) < armours[id][AWM_HANDS])
         {
             armours[id][AWM_HANDS]=h;
             flag=1;
@@ -181,17 +181,17 @@
     {
         weapons[id][AWM_TIME] = time();
         flag=0;
-        if ((h=(int)ob->QueryProp(P_WC)) > weapons[id][AWM_CLASS])
+        if ((h=({int})ob->QueryProp(P_WC)) > weapons[id][AWM_CLASS])
         {
             weapons[id][AWM_CLASS]=h;
             flag=1;
         }
-        if ((h=(int)ob->QueryProp(P_EFFECTIVE_WC)) > weapons[id][AWM_EFF_CLASS])
+        if ((h=({int})ob->QueryProp(P_EFFECTIVE_WC)) > weapons[id][AWM_EFF_CLASS])
         {
             weapons[id][AWM_EFF_CLASS]=h;
             flag=1;
         }
-        if ((h=(int)ob->QueryProp(P_NR_HANDS)) < weapons[id][AWM_HANDS])
+        if ((h=({int})ob->QueryProp(P_NR_HANDS)) < weapons[id][AWM_HANDS])
         {
             weapons[id][AWM_HANDS]=h;
             flag=1;
diff --git a/secure/login.c b/secure/login.c
index 2da60cc..ab6ee16 100644
--- a/secure/login.c
+++ b/secure/login.c
@@ -260,7 +260,7 @@
 {
     string res;
 
-    res = (string)master()->QuerySBanished(query_ip_number(this_object()));
+    res = ({string})master()->QuerySBanished(query_ip_number(this_object()));
     if (!res)
     {
       // check connection from Tor exit node
@@ -411,7 +411,7 @@
 
         for ( i = sizeof(user = users() - ({ 0, this_object() })); i--; )
             if ( object_name(user[i])[0..12] == "/secure/login" &&
-                 ((string)user[i]->loginname()) == loginname ){
+                 (({string})user[i]->loginname()) == loginname ){
                 write( "Eine Anmeldung fuer diesen Namen laeuft bereits.\n" );
                 destruct( this_object() );
                 return;
@@ -434,7 +434,7 @@
         }
 
         
-        if ( (txt = (string)master()->QueryBanished(loginname)) ){
+        if ( (txt = ({string})master()->QueryBanished(loginname)) ){
             if ( txt != "Dieser Name ist gesperrt." )
                 txt = sprintf("Hoppla - dieser Name ist reserviert oder gesperrt "
                     "(\"gebanisht\")!\nGrund: %s\n",txt);
@@ -483,7 +483,7 @@
             return;
         }
 
-        if ( (int)master()->check_late_player(loginname) )
+        if ( ({int})master()->check_late_player(loginname) )
         {
             write( "Dieser Spieler hat uns leider fuer immer verlassen.\n" );
             loginname = "logon";
@@ -492,7 +492,7 @@
             return;
         }
 
-        if ( txt = (string)master()->QueryTBanished(loginname) ){
+        if ( txt = ({string})master()->QueryTBanished(loginname) ){
             write( txt );
             loginname = "logon";
             input_to( "logon2", INPUT_PROMPT,
@@ -826,7 +826,7 @@
     }
 
     if ( guestflag ){
-        if ( catch(guestflag = (int)GUESTMASTER->new_guest();publish) 
+        if ( catch(guestflag = ({int})GUESTMASTER->new_guest();publish) 
              || !guestflag ){
             write( "Derzeit ist kein Gastlogin moeglich!\n" );
             destruct( this_object() );
@@ -891,7 +891,7 @@
             /* Now reconnect to the old body */
             exec( ob, this_object() );
             ob->set_realip(realip);
-            if ( ((int)ob->QueryProp(P_LEVEL)) == -1 )
+            if ( (({int})ob->QueryProp(P_LEVEL)) == -1 )
                 ob->start_player( cap_name );
             else
                 ob->Reconnect( was_interactive );
diff --git a/secure/merlin.c b/secure/merlin.c
index 53b90c4..21a4333 100644
--- a/secure/merlin.c
+++ b/secure/merlin.c
@@ -919,7 +919,7 @@
     ((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));
+  PostSeher(capitalize(playername),({int})player->QueryProp(P_GENDER));
   if(!catch(
         faq=clone_object("/d/seher/haeuser/special/seherfaqmobil") ;publish))
   {
diff --git a/secure/potionmaster.c b/secure/potionmaster.c
index cc80302..e2aa300 100644
--- a/secure/potionmaster.c
+++ b/secure/potionmaster.c
@@ -155,7 +155,7 @@
   // Pfad normalisieren - Expansion von Platzhaltern ist hier ziemlich
   // sinnloss und faellt daher weg (Neue ZTs in /players/ gibts eh nicht
   // mehr.)
-  room=(string)master()->make_path_absolute(room);
+  room=({string})master()->make_path_absolute(room);
 
   // Datei mit dem ZT-Spruch muss existieren.
   if ( file_size( TIPS(to_string(nextroom)+".zt") ) < 0 ) {
@@ -192,8 +192,8 @@
   // Pfad normalisieren - Expansion von Platzhaltern ist hier ziemlich
   // sinnloss und faellt daher weg (Neue ZTs in /players/ gibts eh nicht
   // mehr.)
-  old=(string)master()->make_path_absolute(old);
-  new=(string)master()->make_path_absolute(new);
+  old=({string})master()->make_path_absolute(old);
+  new=({string})master()->make_path_absolute(new);
 
   // Der neue Raum darf nicht bereits eingetragen sein, ...
   if ( member(reverse_table,new) )
diff --git a/secure/questmaster.c b/secure/questmaster.c
index 6a7d952..d6f2fb4 100644
--- a/secure/questmaster.c
+++ b/secure/questmaster.c
@@ -207,7 +207,7 @@
   for (i=sizeof(allowedobj)-1;i>=0;i--)
     {
       if (!stringp(allowedobj[i]) || allowedobj[i]=="") return -4;
-      allowedobj[i]=(string)master()->make_path_absolute(allowedobj[i]);
+      allowedobj[i]=({string})master()->make_path_absolute(allowedobj[i]);
     }
   if (!stringp(hint) || hint=="") return -5;
   if (difficulty<-1 || difficulty>100) return -6;
@@ -555,7 +555,7 @@
       || trigob->QueryProp(P_TESTPLAYER) || IS_LEARNER(trigob))
     return;
 
-  int lvl = (int)trigob->QueryProp(P_LEVEL);
+  int lvl = ({int})trigob->QueryProp(P_LEVEL);
 
   if (lvl <= 0)
     return;
@@ -690,7 +690,7 @@
   if (allowedobj[<2..] == ".c")
     allowedobj = allowedobj[0..<3];
   allowedobj = explode(allowedobj, "#")[0];
-  allowedobj = (string)master()->make_path_absolute(allowedobj);
+  allowedobj = ({string})master()->make_path_absolute(allowedobj);
   if (file_size(allowedobj+".c") <=0)
     return -3;
 
@@ -1043,7 +1043,7 @@
   if (new_mqob[<2..] == ".c")
     new_mqob = new_mqob[0..<3];
   new_mqob = explode(new_mqob, "#")[0];
-  new_mqob = (string)master()->make_path_absolute(new_mqob);
+  new_mqob = ({string})master()->make_path_absolute(new_mqob);
   if (file_size(new_mqob+".c") <= 0)
     return -3;
   // Wenn das neue Objekt schon eine MQ vergibt, kann es keine weitere
diff --git a/secure/scoremaster.c b/secure/scoremaster.c
index af40a93..6a08eff 100644
--- a/secure/scoremaster.c
+++ b/secure/scoremaster.c
@@ -397,7 +397,7 @@
   int score = by_num[bit,BYNUM_SCORE];
   
   foreach(string pl: unconfirmed_scores[bit]) {
-      string eks = (string)master()->query_ek(pl);
+      string eks = ({string})master()->query_ek(pl);
       eks = set_bit(eks, bit);
       master()->update_ek(pl, eks);
       write_file(SCOREAUTOLOG, sprintf(
diff --git a/secure/telnetneg.c b/secure/telnetneg.c
index 6f4b3e0..707bc7b 100644
--- a/secure/telnetneg.c
+++ b/secure/telnetneg.c
@@ -981,13 +981,13 @@
   Set( P_TTY_TYPE, 0 );  //avoid ANY mistakes... Wird unten neu gesetzt.
   // Daten aus dem Loginobjekt uebertragen. Das ist wichtig! (Dabei wird dann
   // auch der Status von der letzten Session ueberschrieben.)
-  TN = (mapping) previous_object()->query_telnet_neg();
+  TN = ({mapping}) previous_object()->query_telnet_neg();
   // bevor irgendwas anderes gemacht wird, werden erstmal die Standardhandler
   // gesetzt. Die sind naemlich in diesem Objekt jetzt erstmal kaputt, weil
   // sie im Loginobjekt gerufen werden.
   _bind_telneg_std_handlers();
   // dann restliche Daten aus dem Loginobjekt holen.
-  Terminals = (string *) previous_object()->query_terminals();
+  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) );
 
@@ -1117,8 +1117,8 @@
           l = 24;
       }
 
-      if ( ((int) Query(P_TTY_ROWS) != l) ||
-           ((int) Query(P_TTY_COLS) != c) ){
+      if ( (({int}) Query(P_TTY_ROWS) != l) ||
+           (({int}) Query(P_TTY_COLS) != c) ){
           Set( P_TTY_ROWS, l );
           Set( P_TTY_COLS, c );
 
diff --git a/secure/udp_mail.c b/secure/udp_mail.c
index 3203fb9..4bd8d74 100644
--- a/secure/udp_mail.c
+++ b/secure/udp_mail.c
@@ -200,7 +200,7 @@
 {
   string *match;
 
-  match=filter(m_indices((mapping)INETD->query("hosts")),
+  match=filter(m_indices(({mapping})INETD->query("hosts")),
 		#'match_mud_name,lower_case(hostname));
 
   return (sizeof(match)==1);
diff --git a/std/container/items.c b/std/container/items.c
index d25aa0b..c27736f 100644
--- a/std/container/items.c
+++ b/std/container/items.c
@@ -100,14 +100,14 @@
   {
     for(i=sizeof(filename);i--;)
     {
-      filename[i] = (string)master()->make_path_absolute( filename[i] );
+      filename[i] = ({string})master()->make_path_absolute( filename[i] );
     }
       
     file=filename[random(sizeof(filename))];
   }
   else 
   {
-    file=filename=(string)master()->make_path_absolute(filename);
+    file=filename=({string})master()->make_path_absolute(filename);
   }
   
   if(props==1)
diff --git a/std/container/light.c b/std/container/light.c
index d0e2e4c..24a2bf4 100644
--- a/std/container/light.c
+++ b/std/container/light.c
@@ -115,7 +115,7 @@
    // etwas an einem container geaendert wird. Daher Auswertung jedes mal
    // neu aktualisieren.
    if (!environment()
-       || !(envlight=(int)environment()->QueryProp(P_INT_LIGHT)))
+       || !(envlight=({int})environment()->QueryProp(P_INT_LIGHT)))
       return Query(P_INT_LIGHT, F_VALUE);
    else {
       intlight = Query(P_INT_LIGHT, F_VALUE);
diff --git a/std/gilden_ob.c b/std/gilden_ob.c
index 51a4b88..7b0a565 100644
--- a/std/gilden_ob.c
+++ b/std/gilden_ob.c
@@ -42,7 +42,7 @@
 
   if (!pl && !(pl=this_player()))
     return 0;
-  if (!(plg=(string)pl->QueryProp(P_GUILD)))
+  if (!(plg=({string})pl->QueryProp(P_GUILD)))
     return 0;
   if (GuildName()!=plg) {
     _notify_fail("Du gehoerst dieser Gilde nicht an!\n");
@@ -72,7 +72,7 @@
   int lv;
   mapping lvs;
 
-  if (!(lv=(int)this_player()->QueryProp(P_GUILD_LEVEL))) return 1;
+  if (!(lv=({int})this_player()->QueryProp(P_GUILD_LEVEL))) return 1;
   if (!(lvs=QueryProp(P_GUILD_LEVELS))) return 0;
   return check_cond(lvs[lv+1]); // Bedingung fuer naechsten Level testen.
 }
@@ -83,9 +83,9 @@
 
 
   if (!pl ||
-      !(lv=(int)pl->QueryProp(P_GUILD_LEVEL)))
+      !(lv=({int})pl->QueryProp(P_GUILD_LEVEL)))
     return;
-  switch((int)pl->QueryProp(P_GENDER)) {
+  switch(({int})pl->QueryProp(P_GENDER)) {
   case MALE:
     ti=QueryProp(P_GUILD_MALE_TITLES);
     break;
@@ -132,7 +132,7 @@
     printf("Du kannst dieser Gilde nicht beitreten.\nGrund: %s",res);
     return -3;
   }
-  if (erg=(int)GUILDMASTER->beitreten()) {
+  if (erg=({int})GUILDMASTER->beitreten()) {
     if (erg<0)
       return erg;
     if (!(this_player()->QueryProp(P_GUILD_LEVEL)))
@@ -143,7 +143,7 @@
 }
 
 varargs int austreten(int loss) {
-    return (int)GUILDMASTER->austreten(loss);
+    return ({int})GUILDMASTER->austreten(loss);
 }
 
 int bei_oder_aus_treten(string str) {
@@ -240,7 +240,7 @@
   if (!(sfunc=ski[SI_SKILLFUNC]))
     sfunc=spell;
   spellbook=SPELLBOOK_DIR+spellbook;
-  if (!(ski2=(mapping)(spellbook->QuerySpell(sfunc))))
+  if (!(ski2=({mapping})(spellbook->QuerySpell(sfunc))))
     return 0;
   return AddSkillMappings(ski2,ski); // Reihenfolge wichtig!
   // Die Gilde kann Spelleigenschaften neu definieren!
@@ -260,14 +260,14 @@
     ski+=sinfo;
   spellbook=SPELLBOOK_DIR+spellbook;
   // printf("%O %O %O %O\n",spellbook,caster,spell,ski);
-  return (int)spellbook->UseSpell(caster,spell,ski);
+  return ({int})spellbook->UseSpell(caster,spell,ski);
 }
 
 static int
 InitialSkillAbility(mapping ski, object pl) {
   if (!ski || !pl) return 0;
   return (300*GetOffset(SI_SKILLLEARN,ski,pl)+
-          (200*(int)pl->QueryAttribute(A_INT)*
+          (200*({int})pl->QueryAttribute(A_INT)*
            GetFactor(SI_SKILLLEARN,ski,pl))/100);
 }
 
@@ -451,7 +451,7 @@
   else if (sum > MAX_ABILITY)
     sum = MAX_ABILITY;
   
-  return (int)pl->SetProp(P_GUILD_RATING, sum);
+  return ({int})pl->SetProp(P_GUILD_RATING, sum);
 }
 
 // Wird von /std/player/quest.c aufgerufen, wenn Quest geloest.
diff --git a/std/living/life.c b/std/living/life.c
index d868cdd..7feb2c2 100644
--- a/std/living/life.c
+++ b/std/living/life.c
@@ -17,7 +17,7 @@
 //  P_POISON        -- level of poison
 //  P_CORPSE        -- corpse-object
 //  P_DEAF          -- if living is deaf
-#pragma strong_types,save_types,rtt_checks
+#pragma strict_types,save_types,rtt_checks
 #pragma range_check
 #pragma no_clone
 
@@ -232,7 +232,7 @@
   if ( QueryProp(P_XP) && objectp(enemy) )
   {
     if ( !QueryProp(P_NO_XP) )
-      enemy->AddExp(dam*(int)QueryProp(P_TOTAL_WC)/10);
+      enemy->AddExp(dam*({int})QueryProp(P_TOTAL_WC)/10);
   }
 
   if (living(enemy)) {
@@ -516,7 +516,7 @@
   // NPC_Killed_By() rufen.
   if ( !query_once_interactive(ME) )
   {
-    object killer = ((object) QueryProp(P_KILLER)) || previous_object() ||
+    object killer = (({object}) QueryProp(P_KILLER)) || previous_object() ||
       this_interactive() || this_player();
 
     if ( killer && query_once_interactive(killer) )
diff --git a/std/living/moving.c b/std/living/moving.c
index b05262c..78a1cf5 100644
--- a/std/living/moving.c
+++ b/std/living/moving.c
@@ -3,7 +3,7 @@
 // living/moving.c -- moving of living objects
 //
 // $Id: moving.c 9448 2016-01-22 17:52:28Z Zesstra $
-#pragma strong_types
+#pragma strict_types
 #pragma save_types
 #pragma range_check
 #pragma no_clone
@@ -224,7 +224,7 @@
                 || ((file_size(fn+".c")>0 ||
                     (file_size(vc=implode(explode(fn,"/")[0..<2],"/")+
                           "/virtual_compiler.c")>0 &&
-                    !catch(tmp=(int)call_other(vc,"QueryValidObject",fn);
+                    !catch(tmp=({int})call_other(vc,"QueryValidObject",fn);
                            publish) && tmp>0)) &&
                     !catch(load_object(fn);publish) )) &&
                   (!interactive(ME) || !fn->QueryProp(P_NO_PLAYERS) || 
@@ -301,13 +301,13 @@
             string *mout;
             if ( !textout ){
                 if ( method & M_TPORT )
-                    textout = (string) QueryProp(P_MMSGOUT) ||
-                        (string) QueryProp(P_MSGOUT);
+                    textout = ({string}) QueryProp(P_MMSGOUT) ||
+                        ({string}) QueryProp(P_MSGOUT);
                 else 
-                    textout = (mout = explode( (string)
+                    textout = (mout = explode( ({string})
                                                 QueryProp(P_MSGOUT) || "",
                                                       "#" ))[0]
-                         || (string)QueryProp(P_MMSGOUT);
+                         || ({string})QueryProp(P_MMSGOUT);
             }
 
             if ( !sizeof(direction) )
@@ -378,9 +378,9 @@
     if ( !(method & M_SILENT) ) {
       if ( !textin ) {        
         if ( method & M_TPORT )
-              textin = (string) QueryProp(P_MMSGIN);
+              textin = ({string}) QueryProp(P_MMSGIN);
         else
-              textin = (string) QueryProp(P_MSGIN);
+              textin = ({string}) QueryProp(P_MSGIN);
       }
             
       inv = all_inventory(environment()) - ({ this_object() });
diff --git a/std/player/restrictions.c b/std/player/restrictions.c
index dc00415..4b79c2b 100644
--- a/std/player/restrictions.c
+++ b/std/player/restrictions.c
@@ -54,23 +54,18 @@
 
 // **** local property methods
 static int _query_max_weight() {
-  int str,val;
-  mixed ski;
-  
   if (QueryProp(P_GHOST) && !IS_WIZARD(ME))
     return 0;
-  str=QueryAttribute(A_STR);
-  ski = UseSkill(SK_CARRY, ([SI_SKILLARG : str ]));
+  int str=QueryAttribute(A_STR);
+  int ski = UseSkill(SK_CARRY, ([SI_SKILLARG : str ]));
 
-  if (!intp(ski))
-    ski = 0;
-  
+  int val;
   if (str<0) {
-    val=9200+str*160+(int)ski;
+    val=9200+str*160+ski;
     if (val<3000) val=3000;
     return val;
   }
-  val = 9200+str*800+(int)ski;
+  val = 9200+str*800+ski;
   if (val<3000)
     val = 3000;
   return val;
diff --git a/std/player/skills.c b/std/player/skills.c
index fa60d1d..cdac73e 100644
--- a/std/player/skills.c
+++ b/std/player/skills.c
@@ -7,7 +7,7 @@
 //
 // 2003-01-20: Nun Zooks Baustelle
 //
-#pragma strong_types
+#pragma strict_types
 #pragma save_types
 #pragma range_check
 #pragma no_clone
@@ -45,7 +45,7 @@
 
   // Wir holen die Gilden aus dem Gildenmaster 
   foreach(string guild:
-      (string *)call_other(GUILDMASTER,"QueryProp",P_VALID_GUILDS))
+      ({string *})call_other(GUILDMASTER,"QueryProp",P_VALID_GUILDS))
   {
     if(catch(act=call_other("/gilden/"+guild,"QueryProp",
         P_GUILD_DEACTIVATE_SKILLS); publish ))
@@ -299,8 +299,8 @@
               //wt_aus=call_other(waf_aus,"QueryProp",P_WEAPON_TYPE);
               //if (wt_azu==wt_aus)
               if (objectp(waf_aus) && objectp(waf_azu) &&
-                  (string)waf_aus->QueryProp(P_WEAPON_TYPE)
-                     == (string)waf_azu->QueryProp(P_WEAPON_TYPE)) 
+                  ({string})waf_aus->QueryProp(P_WEAPON_TYPE)
+                     == ({string})waf_azu->QueryProp(P_WEAPON_TYPE)) 
                 {
                 // Bonus von bis zu 5 Punkten
                 //log_file("humni/log_azubi",
diff --git a/std/room/description.c b/std/room/description.c
index b09fdfa..9431d31 100644
--- a/std/room/description.c
+++ b/std/room/description.c
@@ -4,7 +4,7 @@
 //
 // $Id: description.c 9468 2016-02-19 21:07:04Z Gloinson $
 
-#pragma strong_types
+#pragma strict_types
 #pragma save_types
 #pragma range_check
 #pragma no_clone
@@ -109,7 +109,7 @@
   
   // ggf. Tueren hinzufuegen.
   if (QueryProp(P_DOOR_INFOS)) {
-    string tmp=((string)call_other(DOOR_MASTER,"look_doors"));
+    string tmp=(({string})call_other(DOOR_MASTER,"look_doors"));
     if (stringp(tmp) && sizeof(tmp))
         descr += tmp;
   }
@@ -120,7 +120,7 @@
     descr += GetExits(viewer) || "";
 
   // Viewpoint (Objekt oder Objektarray) sind nicht sichtbar
-  inv_descr = (string) make_invlist(viewer, all_inventory(ME) 
+  inv_descr = ({string}) make_invlist(viewer, all_inventory(ME) 
 		  - (pointerp(viewpoint)?viewpoint:({viewpoint})) ,flags);
 
   if ( inv_descr != "" )
@@ -164,7 +164,7 @@
     descr += GetExits(viewer) || "";
 
   // Viewpoint (Objekt oder Objektarray) sind nicht sichtbar
-  inv_descr = (string) make_invlist( viewer, all_inventory(ME) 
+  inv_descr = ({string}) make_invlist( viewer, all_inventory(ME) 
 		  - (pointerp(viewpoint)?viewpoint:({viewpoint})) );
 
   if ( inv_descr != "" )
diff --git a/std/room/doors.c b/std/room/doors.c
index a9bab7d..10e1cca 100644
--- a/std/room/doors.c
+++ b/std/room/doors.c
@@ -86,12 +86,12 @@
   string *cmds;
   int i,j;
 
-  if (!pointerp(info=(mixed *)QueryProp(P_DOOR_INFOS))) return;
+  if (!pointerp(info=({mixed *})QueryProp(P_DOOR_INFOS))) return;
   add_action("oeffnen","oeffne");
   add_action("schliessen","schliesse");
   add_action("schliessen","schliess");
   for (i=sizeof(info)-1;i>=0;i--) {
-    cmds=(string *)(info[i][D_CMDS]);
+    cmds=({string *})(info[i][D_CMDS]);
     for (j=sizeof(cmds)-1;j>=0;j--)
       add_action("go_door",cmds[j]);
     // Befehle IMMER anfuegen, gechecked wird sowieso erst beim Durchgehen.
@@ -108,14 +108,14 @@
 {
   if (!str || !QueryProp(P_DOOR_INFOS))
     return 0;
-  return (int) call_other(DOOR_MASTER,"oeffnen",str);
+  return ({int}) call_other(DOOR_MASTER,"oeffnen",str);
 }
 
 int schliessen (string str)
 {
   if (!str || !QueryProp(P_DOOR_INFOS))
     return 0;
-  return (int) call_other(DOOR_MASTER,"schliessen",str);
+  return ({int}) call_other(DOOR_MASTER,"schliessen",str);
 }
 
 varargs int
diff --git a/std/room/gilde.c b/std/room/gilde.c
index 3086fe1..737dfc2 100644
--- a/std/room/gilde.c
+++ b/std/room/gilde.c
@@ -3,7 +3,7 @@
 // gilde.c -- Standardgilde
 //
 // $Id: gilde.c 8388 2013-02-16 17:28:31Z Zesstra $
-#pragma strong_types
+#pragma strict_types
 #pragma save_types
 #pragma range_check
 #pragma no_clone
@@ -237,9 +237,9 @@
   if (lev<0) lev=0;
 
   if (pl->QueryProp(P_GENDER) == MALE)
-    titles=(mapping)QueryProp(P_GUILD_MALE_TITLES);
+    titles=QueryProp(P_GUILD_MALE_TITLES);
   else
-    titles=(mapping)QueryProp(P_GUILD_FEMALE_TITLES);
+    titles=QueryProp(P_GUILD_FEMALE_TITLES);
 
   if (!mappingp(titles) || !sizeof(titles)) return 0;
 
@@ -280,7 +280,7 @@
   // Falls die konkrete Gilde des Spielern irgedwas mit dem Titel in
   // ABhaengigkeit des Spielerlevels tun will. Ausnahmsweise per call_other,
   // die Funktion kommt eigentlich aus /std/gilden_ob.c.
-  string gname=(string)pl->QueryProp(P_GUILD);
+  string gname=({string})pl->QueryProp(P_GUILD);
   (GUILD_DIR+"/"+gname)->adjust_title(pl);
 
   return 1;
diff --git a/std/shells/magier/admin.c b/std/shells/magier/admin.c
index 7e86dc9..64f3168 100644
--- a/std/shells/magier/admin.c
+++ b/std/shells/magier/admin.c
@@ -45,7 +45,7 @@
   if (member(({"commands","email","hosts","inetd","list","mud_port","time",
          "version"}),type)==-1)
     write("TYPEs: commands, email, hosts, inetd, list, mud_port, time, version\n");
-  if (ret=(string)INETD->_send_udp(mud,([SENDER:getuid(), REQUEST:QUERY, DATA:type]),1))
+  if (ret=({string})INETD->_send_udp(mud,([SENDER:getuid(), REQUEST:QUERY, DATA:type]),1))
     write(ret);
   else
     write("Anfrage abgeschickt.\n");
@@ -189,7 +189,7 @@
     }
     if ( arg=="*" )
     {
-        More((string)call_other("/secure/sinmaster","Dump",1));
+        More(({string})call_other("/secure/sinmaster","Dump",1));
         return 1;
     }
 
@@ -267,7 +267,7 @@
     _notify_fail( "Syntax: mbanish <name> [<grund>]\n" );
 
     if ( !str || !stringp(str) || !sizeof(str) ){
-        if ( !mappingp(list = (mapping)"/secure/merlin"->MBanishList()) ||
+        if ( !mappingp(list = ({mapping})"/secure/merlin"->MBanishList()) ||
              !(i = sizeof(list)) ){
             write( "Momentan ist kein Spieler auf der mbanish-Liste.\n" );
             return 1;
@@ -357,14 +357,21 @@
 {
     string ip;
     int days;
-    mapping sites;
 
     // Mindestens L26 fuer diesen Befehl
     if ( secure_level() <= DOMAINMEMBER_LVL )
         return 0;
 
-    if ( !str || !stringp(str) || !sizeof(str) ){
-        if ( !sizeof(sites = (mapping)MASTER->SiteBanish( 0, 0 )) ){
+    if ( !str || !stringp(str) || !sizeof(str) )
+    {
+        mapping|int sites = ({mapping|int})MASTER->SiteBanish( 0, 0 );
+        if ( !mappingp(sites) )
+        {
+            write("Du darfst (noch) keine gesperrten Adressen abfragen!\n");
+            return 1;
+        }
+        if ( !sizeof(sites) )
+        {
             write( "Es sind zur Zeit keine Adressen gesperrt!\n" );
             return 1;
         }
@@ -396,8 +403,11 @@
 
 //    _notify_fail( "Ungueltiges Adress-Format!\n" );
 
-    if ( !days ){
-        int res=(int)MASTER->SiteBanish(ip, 0);
+    if ( !days )
+    {
+        // Eigentlich ist SiteBanish() int|mapping. Bei diesem Aufruf kommt
+        // jedoch nur int zurueck. Fall sichs das mal aendert, soll es buggen.
+        int res=({int})MASTER->SiteBanish(ip, 0);
         if ( res == 1 )
              printf( "Die Adresse '%s' ist jetzt nicht mehr gesperrt.\n",
                      ip );
@@ -407,17 +417,23 @@
         else
             printf( "Du darfst nur eigene Sperrungen wieder aufheben!\n" );
     }
-    else {
-        int res;
+    else
+    {
         if ( days != 1 && !IS_DEPUTY(secure_euid()) )
+        {
             write( "Du darfst Adressen nur fuer einen Tag sperren!\n" );
-        else if ( (res = (int)MASTER->SiteBanish(ip, days)) == 1 )
+            return 1;
+        }
+        // Eigentlich ist SiteBanish() int|mapping. Bei diesem Aufruf kommt
+        // jedoch nur int zurueck. Fall sichs das mal aendert, soll es buggen.
+        int res = ({int})MASTER->SiteBanish(ip, days);
+        if ( res  == 1 )
              printf( "Die Adresse '%s' ist jetzt fuer %s gesperrt.\n",
                      ip, (days > 1 ? sprintf( "%d Tage", days ) :
                       (days > 0 ? "einen Tag" : "immer")) );
         else if ( res == -1 )
             write( "Du darfst " + (LORD_SECURITY ? "255 IP-Adressen"
-                                   : "nur einzelne IP-Adressen") + " sperren!\n" );
+                             : "nur einzelne IP-Adressen") + " sperren!\n" );
         else if ( res == -2 )
             write( "Du hast schon genug Adressen gesperrt!\n" );
     }
diff --git a/std/shells/magier/fileedit.c b/std/shells/magier/fileedit.c
index b558585..b0bfeb0 100644
--- a/std/shells/magier/fileedit.c
+++ b/std/shells/magier/fileedit.c
@@ -95,8 +95,8 @@
 static mixed cp_file(mixed filedata,int move,int flags, mixed *do_delete)
 {
   string source,dest;
-  source=(string)filedata[FULLNAME];
-  dest=(string)filedata[DESTNAME];
+  source=filedata[FULLNAME];
+  dest=filedata[DESTNAME];
   if (source==dest) return ERROR(SAME_FILE,source,RET_FAIL);
   if (!MAY_READ(source)) return ERROR(NO_READ,source,RET_JUMP);
   if (!MAY_WRITE(dest)) return ERROR(NO_WRITE,dest,RET_JUMP);
diff --git a/std/shells/magier/fileview.c b/std/shells/magier/fileview.c
index f96d6e3..ca0aa20 100644
--- a/std/shells/magier/fileview.c
+++ b/std/shells/magier/fileview.c
@@ -161,7 +161,7 @@
   string group="";
   if (flags&LS_U)
   {
-    creator=(string)call_other(master(),"creator_file", full);
+    creator=({string})call_other(master(),"creator_file", full);
     switch(creator)
     {
       case ROOTID: creator="root"; break;
@@ -445,10 +445,10 @@
           !regexp(({""}),args[0]))
         return printf("man: Ungueltiger Ausdruck in Maske.\n"),1;
     }
-    tmp=(string *)call_other(MAND,"locate",args[0],flags&(MAN_M|MAN_R));
+    tmp=({string *})call_other(MAND,"locate",args[0],flags&(MAN_M|MAN_R));
   }
 
-  oldman_result=(mapping)0;
+  oldman_result=0;
   if(i && sizeof(tmp)>2 && sizeof(tmp)>=(i<<1))
     tmp=tmp[((i<<1)-2)..((i<<1)-1)];
   switch(sizeof(tmp))
@@ -500,7 +500,7 @@
   if (flags==-1||sizeof(args)!=2)
     return USAGE("rman <hilfeseite> <mudname>");
   write("man: " +
-        (string)call_other(UDP_CMD_DIR+"man","send_request",args[1],args[0]));
+        ({string})call_other(UDP_CMD_DIR+"man","send_request",args[1],args[0]));
   return 1;
 }
 
diff --git a/std/shells/magier/magier_ext.c b/std/shells/magier/magier_ext.c
index 9660015..365ac63 100644
--- a/std/shells/magier/magier_ext.c
+++ b/std/shells/magier/magier_ext.c
@@ -356,7 +356,7 @@
       printf("Du hoerst auf zu snoopen.\n");
     // evtl. irgendetwas loggen ... sollte eigentlich nicht passieren.
     }
-    snoopee=(object)0;
+    snoopee=0;
     return 1;
   }
   SetProp(P_SNOOPFLAGS,flags); // FUNKTIONIERT NUR, WENN magier.h und
diff --git a/std/shells/magier/objects.c b/std/shells/magier/objects.c
index 1968de6..1a51ba5 100644
--- a/std/shells/magier/objects.c
+++ b/std/shells/magier/objects.c
@@ -119,7 +119,7 @@
   else
     ob=args[0];
   cmdline=capitalize(to_string(ob->name(WER)));
-  flags=(int)ob->QueryProp(P_PLURAL); // Missbrauch von flags :o)
+  flags=({int})ob->QueryProp(P_PLURAL); // Missbrauch von flags :o)
   if (query_verb()=="destruct")
   {
     if (!ob->remove())
diff --git a/std/shells/magier/parsing.c b/std/shells/magier/parsing.c
index d719550..a38210a 100644
--- a/std/shells/magier/parsing.c
+++ b/std/shells/magier/parsing.c
@@ -33,7 +33,7 @@
 // Rueckgabe: Dateiname
 //
 
-static mixed to_filename(string str)
+static string to_filename(string str)
 {
   string *tmp,p,newfn;
   int i;
@@ -88,7 +88,7 @@
   }
   if (build_fn)
   {
-    if (str=(string)to_filename(str)) line+=({ str });
+    if (str=to_filename(str)) line+=({ str });
   } 
   else
     line+= ({ str });
diff --git a/std/shells/magier/upd.c b/std/shells/magier/upd.c
index cd86d33..f48d73c 100644
--- a/std/shells/magier/upd.c
+++ b/std/shells/magier/upd.c
@@ -370,7 +370,7 @@
       // mittels Configure()
       if ( ! (flags & UPD_C ) )
       {
-        catch(restore_config=(mixed)call_resolved(&configdata,obj,
+        catch(restore_config=call_resolved(&configdata,obj,
                                                   "Configure",0);
               publish);
         // Wenn UPD_CONF gesetzt wird, _muss_ das Objekt ein oeffentliches
@@ -388,7 +388,7 @@
           mixed items;
           // Herausbekommen, ob hier Items existieren, die per AddItem 
           // erzeugt werden. Die duerfen nicht gesichert werden.
-          items=(mixed)obj->QueryProp(P_ITEMS); // mixed, da array of arrays
+          items=({mixed})obj->QueryProp(P_ITEMS); // mixed, da array of arrays
           if (pointerp(items)&&sizeof(items))
           {
             items=transpose_array(items)[0];
@@ -407,7 +407,7 @@
       env = environment(obj);
       if ( flags & UPD_C )
       {
-        pro = (mapping)(obj->QueryProperties());
+        pro = ({mapping})(obj->QueryProperties());
       }
     }
     else inv = ({});
@@ -461,7 +461,7 @@
         else if (restore_config)
         {
           int conf_res;
-          if (!catch(conf_res=(int)obj->Configure(configdata); publish)
+          if (!catch(conf_res=({int})obj->Configure(configdata); publish)
               && conf_res == 1)
           {
             msg += ", (re-)konfiguriert";
diff --git a/std/thing/commands.c b/std/thing/commands.c
index 5bfa386..c3eddf6 100644
--- a/std/thing/commands.c
+++ b/std/thing/commands.c
@@ -277,7 +277,7 @@
   // ggf. id in das ID-Mapping eintragen
   if(cmdid) {
    mixed *tmp;
-   j=sizeof((string*)added_cmds[str, CMDIDX_FUN]);
+   j=sizeof(added_cmds[str, CMDIDX_FUN]);
    tmp=added_cmds[str, CMDIDX_ID]||allocate(j);
    if(sizeof(tmp)<j) tmp+=allocate(j-sizeof(tmp));
    tmp[<1]=cmdid;
@@ -355,7 +355,8 @@
       cachecl[j..j] = allocate(0);
       if(ids) {
        ids[j..j] = allocate(0);
-       if(!sizeof(ids-allocate(1))) ids=(mixed*)0;
+       if(!sizeof(ids-allocate(1)))
+         ids=0;
       }
       ret++;
      }
@@ -378,7 +379,7 @@
 static int _execute(mixed fun, string str, mixed *parsed) {
   switch(typeof(fun)) {
     case T_CLOSURE:
-      return ((int)funcall(fun,str,&parsed));
+      return (({int})funcall(fun,str,&parsed));
     case T_STRING:
       int ret;
       if(!call_resolved(&ret, this_object(), fun, str, &parsed))
@@ -488,7 +489,7 @@
        else if(check_present&CHECK_ID && id(tmpstr))	// ID ?
         matchstr=this_object();
        else if((check_present&CHECK_PUTGET) &&	// PUT_GET_??? ?
-               (tmpobj=(object*)
+               (tmpobj=({object*})
                   this_player()->find_obs(tmpstr,
                       ([CHECK_PUTGETNONE:PUT_GET_NONE,
                         CHECK_PUTGETDROP:PUT_GET_TAKE,
@@ -669,7 +670,7 @@
 }
 
 static mapping _set_commands(mapping commands) {
-  if(!commands) added_cmds=(mapping)0;
+  if(!commands) added_cmds=0;
   else if(mappingp(commands)) {
     if(widthof(commands) != CMDS_WIDTH)
       raise_error("SetProp(P_COMMANDS): corrupt commands-mapping.\n");
diff --git a/std/thing/description.c b/std/thing/description.c
index 15d6afc..b2326da 100644
--- a/std/thing/description.c
+++ b/std/thing/description.c
@@ -88,7 +88,7 @@
   Set( P_CLONER, NOSETMETHOD|SECURED, F_MODE_AS );
 
   // Gibt es FPs ?
-  explore = (mixed *)EPMASTER->QueryExplore();
+  explore = ({<string*|int>*})EPMASTER->QueryExplore();
 
   return;
 }
@@ -121,7 +121,7 @@
 // Danach sollte der EPMASTER neu nach den Details befragt werden.
 visible void __reload_explore()
 {
-  explore = (mixed *)EPMASTER->QueryExplore();
+  explore = ({<string*|int>*})EPMASTER->QueryExplore();
   return;
 }
 
@@ -359,7 +359,7 @@
       case WEM:
       case WEN:
         if ( art && last=='e'&&QueryProp(P_GENDER) == MALE)
-          sh = (string)sh + "n";
+          sh = sh + "n";
         break;
 
       case WESSEN:
@@ -370,11 +370,11 @@
             case 'x':
             case 's':
             case 'z':
-              sh = (string)sh + "'";
+              sh = sh + "'";
               break;
 
           default:
-            sh = (string)sh + "s";
+            sh = sh + "s";
           }
         } 
         else
@@ -383,11 +383,11 @@
           {
             default:
               if (QueryProp(P_GENDER)!=FEMALE)
-                sh=(string)sh+"s";
+                sh=sh+"s";
               break;
             case 'e':
               if (QueryProp(P_GENDER)==MALE)
-                sh=(string)sh+"n";
+                sh=sh+"n";
             case 'x':
             case 's':
             case 'z':
@@ -398,7 +398,7 @@
   } /* pointerp(sh) */
 
   // RAW? Dann mal zurueck
-  if (demon == RAW) return (string)sh;
+  if (demon == RAW) return sh;
 
   // Selber Artikel suchen ...
   if (demon==2)
@@ -653,11 +653,11 @@
   if (!stringp(detail))
   {
     if (closurep(detail))
-      detail = (string)funcall(detail,key);
+      detail = ({string})funcall(detail,key);
     else if (mappingp(detail))
-      detail = (string)(detail[race]||detail[0]);
+      detail = detail[race] || detail[0];
     else if (pointerp(detail))
-      detail = (string)(detail[random(sizeof(detail))]);
+      detail = detail[random(sizeof(detail))];
   }
 
   // FP vergeben (so vorhanden ;-) )
@@ -722,7 +722,7 @@
   if (stringp(str)) 
       str = ({ str });
   // Aliase aufloesen und implizite Klassen addieren.
-  str = (string*)CLASSDB->AddImplicitClasses(str);
+  str = ({string*})CLASSDB->AddImplicitClasses(str);
   // Summe mit alten Klassen bilden und Doppelte eliminieren
   str = str + Query(P_CLASS, F_VALUE);
   Set( P_CLASS, m_indices(mkmapping(str)), F_VALUE);
@@ -737,7 +737,7 @@
       str = ({ str });
 
   // Aliase aufloesen und implizite Klassen addieren.
-  str = (string*)CLASSDB->AddImplicitClasses(str);
+  str = ({string*})CLASSDB->AddImplicitClasses(str);
 
   // Und alle - inklusive impliziter Klassen - entfernen
   // TODO: Pruefen, ob dies die richtige Entscheidung ist.
@@ -833,14 +833,14 @@
 // Anteil der Gruppe am Objekt
 public int QueryMaterialGroup( string matgroup )
 {
-  return (int)call_other( MATERIALDB, "MaterialGroup",
+  return ({int})call_other( MATERIALDB, "MaterialGroup",
                           QueryProp(P_MATERIAL), matgroup );
 }
 
 
 public string MaterialList( int casus, mixed idinf )
 {
-  return (string)call_other( MATERIALDB, "ConvMaterialList",
+  return ({string})call_other( MATERIALDB, "ConvMaterialList",
                              QueryProp(P_MATERIAL), casus, idinf );
 }
 
diff --git a/std/thing/moving.c b/std/thing/moving.c
index 978fe97..8845c10 100644
--- a/std/thing/moving.c
+++ b/std/thing/moving.c
@@ -41,11 +41,11 @@
       return ME_CANT_BE_TAKEN;
 
   // Gewicht ermitteln
-  if ( !(tmp = (int)QueryProp(P_TOTAL_WEIGHT)) )
-      tmp = (int)QueryProp(P_WEIGHT);
+  if ( !(tmp = ({int})QueryProp(P_TOTAL_WEIGHT)) )
+      tmp = ({int})QueryProp(P_WEIGHT);
         
   // Ist das Objekt nicht zu schwer?
-  if ( (tmp = (int)dest->MayAddWeight(tmp)) < 0) {
+  if ( (tmp = ({int})dest->MayAddWeight(tmp)) < 0) {
       if ( tmp == -2 ) return ME_TOO_HEAVY_FOR_ENV;
       return ME_TOO_HEAVY;
   }
@@ -87,7 +87,7 @@
   // Bewegung in Para-Welt-Raeume?
   // tmp ist die Ziel-Parallelweltnummer
   if (!environment()||!living(environment())||
-      !intp(tmp =(int)environment()->Query(P_PARA)))
+      !intp(tmp =({int})environment()->Query(P_PARA)))
     tmp=0;
     
   // Wenn das Objekt von einem in der Parawelt befindlichen Spieler
@@ -110,7 +110,7 @@
           if ( (find_object(fn) || ((file_size(fn+".c")>0||
                   (file_size(vc=implode(explode(fn,"/")[0..<2],"/")+
                   "/virtual_compiler.c")>0 &&
-                  !catch(tmp=(int)call_other(vc,"QueryValidObject",fn);
+                  !catch(tmp=({int})call_other(vc,"QueryValidObject",fn);
                     publish) && tmp>0)) &&
                   !catch(load_object( fn );publish))) &&
               (!fn->QueryProp(P_NO_PLAYERS) || QueryProp(P_TESTPLAYER)) )
diff --git a/std/unit.c b/std/unit.c
index 415c71e..3024714 100644
--- a/std/unit.c
+++ b/std/unit.c
@@ -109,12 +109,13 @@
 
 static int _query_weight()
 {
-  mixed gpu, req;
-  if ((req=QueryProp(U_REQ))<1) return 0;
-  gpu=Query(U_GPU);
-  if (intp(gpu)) return req * gpu;
-  if (!pointerp(gpu)) return 0;
-  return MAX(1,(req*gpu[0])/gpu[1]);
+  int req = QueryProp(U_REQ);
+  if (req<1)
+    return 0;
+  int|int* gpu=Query(U_GPU, F_VALUE);
+  if (pointerp(gpu))
+    return MAX(1,(req*gpu[0])/gpu[1]);
+  return req * gpu;
 }
 
 static int _set_weight(int num) {
@@ -125,19 +126,18 @@
 
 static int _query_total_weight()
 {
-  mixed gpu, amount;
-  if ((amount=Query(P_AMOUNT))<1) return 0;
-  gpu=Query(U_GPU);
-  if (intp(gpu))
-    return amount*(int)gpu;
-  if (!pointerp(gpu)) return 0;
-  return MAX(1,(amount*gpu[0])/gpu[1]);
+  int amount = Query(P_AMOUNT);
+  if (amount<1)
+    return 0;
+  int|int* gpu=Query(U_GPU, F_VALUE);
+  if (pointerp(gpu))
+    return MAX(1,(amount*gpu[0])/gpu[1]);
+  return amount*gpu;
 }
 
 static int _query_plural()
 {
-  int i;
-  i=QueryProp(U_REQ); // wichtig _nicht_ QueryProp
+  int i = QueryProp(U_REQ);
   return (i<=1 ? 0 : i);
 }
 
@@ -145,8 +145,8 @@
 static string|string* _query_name()
 {
   if (QueryProp(U_REQ)==1)
-    return "%s%s"+((string *)Query(P_NAME))[0];
-  return "%d %s"+((string *)Query(P_NAME))[1];
+    return "%s%s"+Query(P_NAME)[0];
+  return "%d %s"+Query(P_NAME)[1];
 }
 
 // gibt string | string* zurueck.
diff --git a/std/user_filter.c b/std/user_filter.c
index 111dfcb..edc3deb 100644
--- a/std/user_filter.c
+++ b/std/user_filter.c
@@ -3,8 +3,7 @@
 // user_filter.c -- Hilfsmodul fuer die wer-Liste
 //
 // $Id: user_filter.c 8755 2014-04-26 13:13:40Z Zesstra $
-#pragma strict_types
-#pragma save_types
+#pragma save_types,rtt_checks
 #pragma no_clone
 #pragma range_check
 
@@ -37,7 +36,7 @@
 
 static int is_prop_set( object ob, mixed x )
 {
-  return (mixed)ob->QueryProp(x) != 0;
+  return ob->QueryProp(x) != 0;
 }
 
 static int is_second( object ob, mixed x )
@@ -56,13 +55,14 @@
 
   // nur Magier koennen eine andere Gilde per P_VISIBLE_GUILD in werlisten
   // etc. vortaeuschen.
-  if (IS_LEARNER(ob)) {
+  if (IS_LEARNER(ob))
+  {
     // Querymethode von P_VISIBLE_GUILD fragt ggf. auch P_GUILD ab.
-    if ( !stringp(str = (string)ob->QueryProp(P_VISIBLE_GUILD)) )
-      return 0;
+    str = ob->QueryProp(P_VISIBLE_GUILD);
   }
-  else {
-      str = (string)ob->QueryProp(P_GUILD);
+  else
+  {
+      str = ob->QueryProp(P_GUILD);
   }
   if (!stringp(str)) return 0; // login hat z.B. keine Gilde.
   return strstr(lower_case(str),x) == 0;
@@ -70,12 +70,12 @@
 
 static int is_in_team( object ob, mixed x )
 {
-  object team;
-  
-  if ( !objectp(team = (object)ob->QueryProp(P_TEAM)) )
+  object team = ob->QueryProp(P_TEAM);
+
+  if ( !objectp(team) )
     return x == "";
-  
-  return lower_case((string)team->Name()) == x;
+
+  return lower_case(team->Name()) == x;
 }
 
 static int is_name_in( object ob, mixed x )
@@ -91,17 +91,17 @@
 
 static int is_region_member( object ob, mixed x )
 {
-  return (int)master()->domain_member( geteuid(ob), x );
+  return master()->domain_member( geteuid(ob), x );
 }
 
 static int is_region_master( object ob, mixed x )
 {
-  return (int)master()->domain_master( geteuid(ob), x );
+  return master()->domain_master( geteuid(ob), x );
 }
 
 static int is_guild_master(object ob, mixed x)
 {
-  return (int)master()->guild_master(geteuid(ob), x);
+  return master()->guild_master(geteuid(ob), x);
 }
 
 static int is_gender( object ob, mixed x )
@@ -131,7 +131,7 @@
 
 static int is_ghost( object ob)
 {
-  return (int)ob->QueryProp(P_GHOST);
+  return ob->QueryProp(P_GHOST);
 }
 
 static int uses_ssl(object ob)
@@ -146,7 +146,7 @@
 }
 
 protected int is_active_guide(object ob) {
-    int cic=(int)ob->QueryProp(P_NEWBIE_GUIDE);
+    int cic=({int})ob->QueryProp(P_NEWBIE_GUIDE);
     if (!intp(cic) || cic <= 0)
       return 0;
     else if (cic < 60)
@@ -389,16 +389,15 @@
     case "erwartete":
       if ( i < (sz-1) && words[i+1] == "wegen" ) {
         i++;
-
-        if ( !mappingp(x = (mixed)this_player()->QueryProp(P_WAITFOR_REASON)) ||
-             !pointerp(x = m_indices(x)) )
+        x = this_player()->QueryProp(P_WAITFOR_REASON);
+        if ( !mappingp(x) )
           break;
-        
+        x=m_indices(x);
         zwi = filter( orig, "is_name_in", ME, x );
         break;
       }
-      
-      if ( !pointerp(x = (mixed)this_player()->QueryProp(P_WAITFOR)) )
+      x = this_player()->QueryProp(P_WAITFOR);
+      if ( !pointerp(x) )
         break;
       zwi = filter( orig, "is_name_in", ME, x );
       break;
diff --git a/std/util/pager.c b/std/util/pager.c
index 54980c3..f3219fa 100644
--- a/std/util/pager.c
+++ b/std/util/pager.c
@@ -4,7 +4,7 @@
 //
 // $Id: pager.c 8755 2014-04-26 13:13:40Z Zesstra $
 
-#pragma strong_types
+#pragma strict_types
 #pragma save_types
 #pragma range_check
 #pragma no_clone
@@ -124,9 +124,9 @@
       pinfo[MAXL] += sizeof(explode(tmp, "\n"))+1;
   pinfo[PAGE] = PAGELENGTH;
   if(!pinfo[PAGE]) pinfo[FLAG] |= E_CAT;
-  if ((this_interactive() && (j=(int)this_interactive()->QueryProp(P_MORE_FLAGS))) ||
+  if ((this_interactive() && (j=({int})this_interactive()->QueryProp(P_MORE_FLAGS))) ||
       (this_player() && interactive(this_player()) &&
-       (j=(int)this_player()->QueryProp(P_MORE_FLAGS))))
+       (j=({int})this_player()->QueryProp(P_MORE_FLAGS))))
     pinfo[FLAG] |= j;
   
   pinfo[CURL] = 1;
diff --git a/std/util/path.c b/std/util/path.c
index 193a865..00ceaa6 100644
--- a/std/util/path.c
+++ b/std/util/path.c
@@ -40,7 +40,7 @@
       break;
     default:
       if(user && PL && getuid(PL) == user
-          && (cwd=(string)PL->QueryProp(P_CURRENTDIR)))
+          && (cwd=({string})PL->QueryProp(P_CURRENTDIR)))
         path=cwd + "/" + path;
   }
   return path;
diff --git a/sys/magier.h b/sys/magier.h
index f6eb3a8..544bcc7 100644
--- a/sys/magier.h
+++ b/sys/magier.h
@@ -214,7 +214,7 @@
 static string *parseargs(string cmdline,int flags,string opts,int build_fn);
 static varargs void asynchron(mixed* array, closure cmd, mixed data, mixed flags, int c);
 static varargs mixed *file_list(string *files, int mode, int recursive, string dest, string mask);
-static mixed to_filename(string str);
+static string to_filename(string str);
 static int _verfolge(string str);
 static string glob2regexp(string str);
 
