diff --git a/secure/simul_efun/livings.c b/secure/simul_efun/livings.c
index 160fcee..4ed04b4 100644
--- a/secure/simul_efun/livings.c
+++ b/secure/simul_efun/livings.c
@@ -31,7 +31,7 @@
     if ( !query_once_interactive(ob) )
        return getuid(ob);
 
-    ret = (mixed)master()->get_userinfo( getuid(ob) );
+    ret = master()->get_userinfo( getuid(ob) );
 
     if ( !pointerp(ret) || sizeof(ret) < 5 )
        return getuid(ob);
diff --git a/secure/simul_efun/query_ip_name.c b/secure/simul_efun/query_ip_name.c
index 01f8822..0c16636 100644
--- a/secure/simul_efun/query_ip_name.c
+++ b/secure/simul_efun/query_ip_name.c
@@ -28,9 +28,9 @@
 {
   ob= ob || this_player();
   if (!objectp(ob) || !interactive(ob)) return 0;
-  if(ob->query_realip() && (string)ob->query_realip()!="")
+  if(ob->query_realip() && ob->query_realip()!="")
   {
-    return (string)ob->query_realip();
+    return ob->query_realip();
   }
   return _query_ip_number(ob);
 }
@@ -39,7 +39,7 @@
 {
   if ( !ob || objectp(ob) )
       ob=query_ip_number(ob);
-  return (string)"/p/daemon/iplookup"->host(ob);
+  return "/p/daemon/iplookup"->host(ob);
 }
 
 #endif
diff --git a/secure/simul_efun/simul_efun.c b/secure/simul_efun/simul_efun.c
index 676c094..8339937 100644
--- a/secure/simul_efun/simul_efun.c
+++ b/secure/simul_efun/simul_efun.c
@@ -3,9 +3,9 @@
 // simul_efun.c -- simul efun's
 //
 // $Id: simul_efun.c 7408 2010-02-06 00:27:25Z Zesstra $
-#pragma strict_types,save_types,rtt_checks
+#pragma strong_types,save_types,rtt_checks
 #pragma no_clone,no_shadow,no_inherit
-#pragma pedantic,range_check,warn_deprecated
+#pragma range_check,warn_deprecated
 #pragma warn_empty_casts,warn_missing_return,warn_function_inconsistent
 
 // Absolute Pfade erforderlich - zum Zeitpunkt, wo der Master geladen
@@ -184,7 +184,7 @@
 varargs string country(mixed ip, string num) {
   mixed ret;
 
-  if(ret = (string)"/p/daemon/iplookup"->country(num || ip)) {
+  if(ret = "/p/daemon/iplookup"->country(num || ip)) {
     return ret;
   } else return "???";
 }
@@ -227,7 +227,7 @@
 
         if ( (snooper = efun::interactive_info(you, II_SNOOP_NEXT)) &&
              query_wiz_grp(snooper) >= query_wiz_grp(me) ){
-            if ( (int)snooper->QueryProp(P_SNOOPFLAGS) & SF_LOCKED )
+            if ( snooper->QueryProp(P_SNOOPFLAGS) & SF_LOCKED )
                return 0;
 
             tell_object( snooper, sprintf( "%s snooped jetzt %s.\n",
@@ -397,7 +397,7 @@
 
 // * Magier-Level abfragen
 int query_wiz_level(mixed player) {
-  return (int)"/secure/master"->query_wiz_level(player);
+  return "/secure/master"->query_wiz_level(player);
 }
 
 #ifdef __ALISTS__
@@ -753,7 +753,7 @@
       return funcall(str);
   }
   else if (str==0)
-      return((string)str);
+      return(str);
   else if ( !stringp(str) ) {
       return to_string(str);
   }
@@ -848,7 +848,7 @@
   }
 
   save = m_allocate(0, 2);
-  properties = (mapping)previous_object()->QueryProperties();
+  properties = previous_object()->QueryProperties();
 
   if(mappingp(properties))
   {
@@ -944,7 +944,7 @@
   }
 
   // get actual property settings (by create())
-  properties = (mapping)previous_object()->QueryProperties();
+  properties = previous_object()->QueryProperties();
 
 //  DEBUG(sprintf("RESTORE %O\n",name));
   // restore object
@@ -952,8 +952,8 @@
   //'))
   //_get_save_data liefert tatsaechlich mixed zurueck, wenn das auch immer ein 
   //mapping sein sollte.
-  save = (mixed)previous_object()->_get_save_data();
-  if(mappingp(save))
+  save = previous_object()->_get_save_data();
+  if((save))
   {
     index = m_indices(save);
     for(i = sizeof(index)-1; i>=0; i--)
@@ -1143,7 +1143,7 @@
     // laeuft.
     catch( efun::raise_error(           
          sprintf( text,                   
-           uid ? (string)master()->creator_file(key) : key,                   
+           uid ? master()->creator_file(key) : key,                   
            sizeof(obs), object_name(obs[<1]) ) );publish);
     // Und weg mit dem Kram...
     filter( obs, #'efun::destruct/*'*/ );
@@ -1276,7 +1276,7 @@
   // ungefilterten Output nur fuer bestimmte Objekte, Objekte in /std oder
   // /obj haben die BackboneID.
   if (query_wiz_level(getuid(po)) >= ARCH_LVL
-       || (string)master()->creator_file(load_name(po)) == BACKBONEID ) {
+       || master()->creator_file(load_name(po)) == BACKBONEID ) {
       return coi;
   }
   else {
@@ -1378,7 +1378,7 @@
     efun::set_environment(ob,target);
     return;
   }
-  path=(string)master()->make_path_absolute(target);
+  path=master()->make_path_absolute(target);
   if (stringp(path) && file_size(path+".c")>=0 &&
       !catch(load_object(path);publish) )
   {
@@ -1497,7 +1497,7 @@
         prio=NF_NL_OWN;
       else if (living(po))
         prio=NF_NL_LIVING;
-      else if ((int)po->IsRoom())
+      else if (po->IsRoom())
         prio=NF_NL_ROOM;
       else
         prio=NF_NL_THING;
@@ -1507,7 +1507,7 @@
       oldprio=NF_NL_OWN;
     else if (living(oldo))
       oldprio=NF_NL_LIVING;
-    else if ((int)oldo->IsRoom())
+    else if (oldo->IsRoom())
       oldprio=NF_NL_ROOM;
     else
       oldprio=NF_NL_THING;
@@ -1660,7 +1660,7 @@
     write("Fehler beim Laden von /secure/login.c\n"+err+"\n");
     return 0;
   }
-  if (objectp(m=(mixed)ob->new_logon(name))) netdead[name]=m;
+  if (objectp(m=ob->new_logon(name))) netdead[name]=m;
   return m;
 }
 
@@ -1746,7 +1746,7 @@
     if (i!=0) ob->SetProp(P_LIGHT, ob->QueryProp(P_LIGHT)+i);
 
     // Lichtberechnung findet eigentlich in der Mudlib statt.
-    return (int)ob->QueryProp(P_INT_LIGHT);
+    return ob->QueryProp(P_INT_LIGHT);
 }
 
 public varargs string CountUp( string *s, string sep, string lastsep )
@@ -1839,37 +1839,37 @@
           parts[i] = funcall(name_cls[ob_nr], casus);     break;
         case "RQP": case "SSENQP": case "MQP": case "NQP":       // Pronoun
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPronoun(casus);
+            parts[i] = tmp->QueryPronoun(casus);
           break;
         case "RQA": case "SSENQA": case "MQA": case "NQA":       // Article
           if (objectp(tmp = obs[ob_nr]))
-            tmp = (string)tmp->QueryArticle(casus, 1, 1);
+            tmp = tmp->QueryArticle(casus, 1, 1);
           if (stringp(tmp) && !(tmp[<1]^' ')) 
             tmp = tmp[0..<2];                // Extra-Space wieder loeschen
           break;
         case "RQPPMS": case "SSENQPPMS": case "MQPPMS": case "NQPPMS":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(MALE, casus, SINGULAR);
+            parts[i] = tmp->QueryPossPronoun(MALE, casus, SINGULAR);
           break;
         case "RQPPFS": case "SSENQPPFS": case "MQPPFS": case "NQPPFS":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(FEMALE, casus, SINGULAR);
+            parts[i] = tmp->QueryPossPronoun(FEMALE, casus, SINGULAR);
           break;
         case "RQPPNS": case "SSENQPPNS": case "MQPPNS": case "NQPPNS":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(NEUTER, casus, SINGULAR);
+            parts[i] = tmp->QueryPossPronoun(NEUTER, casus, SINGULAR);
           break;
         case "RQPPMP": case "SSENQPPMP": case "MQPPMP": case "NQPPMP":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(MALE, casus, PLURAL);
+            parts[i] = tmp->QueryPossPronoun(MALE, casus, PLURAL);
           break;
         case "RQPPFP": case "SSENQPPFP": case "MQPPFP": case "NQPPFP":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(FEMALE, casus, PLURAL);
+            parts[i] = tmp->QueryPossPronoun(FEMALE, casus, PLURAL);
           break;
         case "RQPPNP": case "SSENQPPNP": case "MQPPNP": case "NQPPNP":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(NEUTER, casus, PLURAL);
+            parts[i] = tmp->QueryPossPronoun(NEUTER, casus, PLURAL);
           break;
         default:
           continue;
diff --git a/secure/simul_efun/spare/livings.c b/secure/simul_efun/spare/livings.c
index 160fcee..4ed04b4 100644
--- a/secure/simul_efun/spare/livings.c
+++ b/secure/simul_efun/spare/livings.c
@@ -31,7 +31,7 @@
     if ( !query_once_interactive(ob) )
        return getuid(ob);
 
-    ret = (mixed)master()->get_userinfo( getuid(ob) );
+    ret = master()->get_userinfo( getuid(ob) );
 
     if ( !pointerp(ret) || sizeof(ret) < 5 )
        return getuid(ob);
diff --git a/secure/simul_efun/spare/query_ip_name.c b/secure/simul_efun/spare/query_ip_name.c
index 01f8822..0c16636 100644
--- a/secure/simul_efun/spare/query_ip_name.c
+++ b/secure/simul_efun/spare/query_ip_name.c
@@ -28,9 +28,9 @@
 {
   ob= ob || this_player();
   if (!objectp(ob) || !interactive(ob)) return 0;
-  if(ob->query_realip() && (string)ob->query_realip()!="")
+  if(ob->query_realip() && ob->query_realip()!="")
   {
-    return (string)ob->query_realip();
+    return ob->query_realip();
   }
   return _query_ip_number(ob);
 }
@@ -39,7 +39,7 @@
 {
   if ( !ob || objectp(ob) )
       ob=query_ip_number(ob);
-  return (string)"/p/daemon/iplookup"->host(ob);
+  return "/p/daemon/iplookup"->host(ob);
 }
 
 #endif
diff --git a/secure/simul_efun/spare/simul_efun.c b/secure/simul_efun/spare/simul_efun.c
index 676c094..8339937 100644
--- a/secure/simul_efun/spare/simul_efun.c
+++ b/secure/simul_efun/spare/simul_efun.c
@@ -3,9 +3,9 @@
 // simul_efun.c -- simul efun's
 //
 // $Id: simul_efun.c 7408 2010-02-06 00:27:25Z Zesstra $
-#pragma strict_types,save_types,rtt_checks
+#pragma strong_types,save_types,rtt_checks
 #pragma no_clone,no_shadow,no_inherit
-#pragma pedantic,range_check,warn_deprecated
+#pragma range_check,warn_deprecated
 #pragma warn_empty_casts,warn_missing_return,warn_function_inconsistent
 
 // Absolute Pfade erforderlich - zum Zeitpunkt, wo der Master geladen
@@ -184,7 +184,7 @@
 varargs string country(mixed ip, string num) {
   mixed ret;
 
-  if(ret = (string)"/p/daemon/iplookup"->country(num || ip)) {
+  if(ret = "/p/daemon/iplookup"->country(num || ip)) {
     return ret;
   } else return "???";
 }
@@ -227,7 +227,7 @@
 
         if ( (snooper = efun::interactive_info(you, II_SNOOP_NEXT)) &&
              query_wiz_grp(snooper) >= query_wiz_grp(me) ){
-            if ( (int)snooper->QueryProp(P_SNOOPFLAGS) & SF_LOCKED )
+            if ( snooper->QueryProp(P_SNOOPFLAGS) & SF_LOCKED )
                return 0;
 
             tell_object( snooper, sprintf( "%s snooped jetzt %s.\n",
@@ -397,7 +397,7 @@
 
 // * Magier-Level abfragen
 int query_wiz_level(mixed player) {
-  return (int)"/secure/master"->query_wiz_level(player);
+  return "/secure/master"->query_wiz_level(player);
 }
 
 #ifdef __ALISTS__
@@ -753,7 +753,7 @@
       return funcall(str);
   }
   else if (str==0)
-      return((string)str);
+      return(str);
   else if ( !stringp(str) ) {
       return to_string(str);
   }
@@ -848,7 +848,7 @@
   }
 
   save = m_allocate(0, 2);
-  properties = (mapping)previous_object()->QueryProperties();
+  properties = previous_object()->QueryProperties();
 
   if(mappingp(properties))
   {
@@ -944,7 +944,7 @@
   }
 
   // get actual property settings (by create())
-  properties = (mapping)previous_object()->QueryProperties();
+  properties = previous_object()->QueryProperties();
 
 //  DEBUG(sprintf("RESTORE %O\n",name));
   // restore object
@@ -952,8 +952,8 @@
   //'))
   //_get_save_data liefert tatsaechlich mixed zurueck, wenn das auch immer ein 
   //mapping sein sollte.
-  save = (mixed)previous_object()->_get_save_data();
-  if(mappingp(save))
+  save = previous_object()->_get_save_data();
+  if((save))
   {
     index = m_indices(save);
     for(i = sizeof(index)-1; i>=0; i--)
@@ -1143,7 +1143,7 @@
     // laeuft.
     catch( efun::raise_error(           
          sprintf( text,                   
-           uid ? (string)master()->creator_file(key) : key,                   
+           uid ? master()->creator_file(key) : key,                   
            sizeof(obs), object_name(obs[<1]) ) );publish);
     // Und weg mit dem Kram...
     filter( obs, #'efun::destruct/*'*/ );
@@ -1276,7 +1276,7 @@
   // ungefilterten Output nur fuer bestimmte Objekte, Objekte in /std oder
   // /obj haben die BackboneID.
   if (query_wiz_level(getuid(po)) >= ARCH_LVL
-       || (string)master()->creator_file(load_name(po)) == BACKBONEID ) {
+       || master()->creator_file(load_name(po)) == BACKBONEID ) {
       return coi;
   }
   else {
@@ -1378,7 +1378,7 @@
     efun::set_environment(ob,target);
     return;
   }
-  path=(string)master()->make_path_absolute(target);
+  path=master()->make_path_absolute(target);
   if (stringp(path) && file_size(path+".c")>=0 &&
       !catch(load_object(path);publish) )
   {
@@ -1497,7 +1497,7 @@
         prio=NF_NL_OWN;
       else if (living(po))
         prio=NF_NL_LIVING;
-      else if ((int)po->IsRoom())
+      else if (po->IsRoom())
         prio=NF_NL_ROOM;
       else
         prio=NF_NL_THING;
@@ -1507,7 +1507,7 @@
       oldprio=NF_NL_OWN;
     else if (living(oldo))
       oldprio=NF_NL_LIVING;
-    else if ((int)oldo->IsRoom())
+    else if (oldo->IsRoom())
       oldprio=NF_NL_ROOM;
     else
       oldprio=NF_NL_THING;
@@ -1660,7 +1660,7 @@
     write("Fehler beim Laden von /secure/login.c\n"+err+"\n");
     return 0;
   }
-  if (objectp(m=(mixed)ob->new_logon(name))) netdead[name]=m;
+  if (objectp(m=ob->new_logon(name))) netdead[name]=m;
   return m;
 }
 
@@ -1746,7 +1746,7 @@
     if (i!=0) ob->SetProp(P_LIGHT, ob->QueryProp(P_LIGHT)+i);
 
     // Lichtberechnung findet eigentlich in der Mudlib statt.
-    return (int)ob->QueryProp(P_INT_LIGHT);
+    return ob->QueryProp(P_INT_LIGHT);
 }
 
 public varargs string CountUp( string *s, string sep, string lastsep )
@@ -1839,37 +1839,37 @@
           parts[i] = funcall(name_cls[ob_nr], casus);     break;
         case "RQP": case "SSENQP": case "MQP": case "NQP":       // Pronoun
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPronoun(casus);
+            parts[i] = tmp->QueryPronoun(casus);
           break;
         case "RQA": case "SSENQA": case "MQA": case "NQA":       // Article
           if (objectp(tmp = obs[ob_nr]))
-            tmp = (string)tmp->QueryArticle(casus, 1, 1);
+            tmp = tmp->QueryArticle(casus, 1, 1);
           if (stringp(tmp) && !(tmp[<1]^' ')) 
             tmp = tmp[0..<2];                // Extra-Space wieder loeschen
           break;
         case "RQPPMS": case "SSENQPPMS": case "MQPPMS": case "NQPPMS":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(MALE, casus, SINGULAR);
+            parts[i] = tmp->QueryPossPronoun(MALE, casus, SINGULAR);
           break;
         case "RQPPFS": case "SSENQPPFS": case "MQPPFS": case "NQPPFS":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(FEMALE, casus, SINGULAR);
+            parts[i] = tmp->QueryPossPronoun(FEMALE, casus, SINGULAR);
           break;
         case "RQPPNS": case "SSENQPPNS": case "MQPPNS": case "NQPPNS":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(NEUTER, casus, SINGULAR);
+            parts[i] = tmp->QueryPossPronoun(NEUTER, casus, SINGULAR);
           break;
         case "RQPPMP": case "SSENQPPMP": case "MQPPMP": case "NQPPMP":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(MALE, casus, PLURAL);
+            parts[i] = tmp->QueryPossPronoun(MALE, casus, PLURAL);
           break;
         case "RQPPFP": case "SSENQPPFP": case "MQPPFP": case "NQPPFP":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(FEMALE, casus, PLURAL);
+            parts[i] = tmp->QueryPossPronoun(FEMALE, casus, PLURAL);
           break;
         case "RQPPNP": case "SSENQPPNP": case "MQPPNP": case "NQPPNP":
           if (objectp(tmp = obs[ob_nr]))
-            parts[i] = (string)tmp->QueryPossPronoun(NEUTER, casus, PLURAL);
+            parts[i] = tmp->QueryPossPronoun(NEUTER, casus, PLURAL);
           break;
         default:
           continue;
