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;
