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)) )
