diff --git a/std/container/restrictions.c b/std/container/restrictions.c
index b9dcbf9..294d7a7 100644
--- a/std/container/restrictions.c
+++ b/std/container/restrictions.c
@@ -87,8 +87,8 @@
     i = sizeof(objs);
     
     while ( i-- ){
-        if ( !(w2 = (int)objs[i]->QueryProp(P_TOTAL_WEIGHT)) )
-            w2 = (int)objs[i]->QueryProp(P_WEIGHT);
+        if ( !(w2 = ({int})objs[i]->QueryProp(P_TOTAL_WEIGHT)) )
+            w2 = ({int})objs[i]->QueryProp(P_WEIGHT);
         w += w2;
     }
     
@@ -146,7 +146,7 @@
         // Wenn das Objekt ein env() hochbewegt wird, wird das Gewicht im alten
         // Container abgezogen. Weiterer Check im env() ist unnoetig (aw=0).
         if ( ENV(ENV(PO)) == ME )
-            nw = w - (int)ENV(PO)->QueryProp(P_WEIGHT_PERCENT) * w / 100;
+            nw = w - ({int})ENV(PO)->QueryProp(P_WEIGHT_PERCENT) * w / 100;
         // Eine Ebene tiefer bewegen: Test im neuen Container mit unveraendertem
         // Gewicht; Check im env() mit um Gewichtsreduktion verringertem Gewicht
         else if ( present( ME, ENV(PO) ) )
@@ -156,7 +156,7 @@
         // Differenz aus Gewicht in Container1 und in Container2.
         else if ( ENV(ENV(ENV(PO))) && ENV() == ENV(ENV(PO)) )
             aw = QueryProp(P_WEIGHT_PERCENT) * w / 100
-                - ((int)ENV(PO)->QueryProp(P_WEIGHT_PERCENT) * w / 100 || 1);
+                - (({int})ENV(PO)->QueryProp(P_WEIGHT_PERCENT) * w / 100 || 1);
     }
 
     if ( query_weight_contents() + nw > QueryProp(P_MAX_WEIGHT) )
@@ -193,7 +193,7 @@
 // Hilfsfunktion
 static int _behalten( object ob, string uid )
 {
-    return (string)ob->QueryProp(P_KEEP_ON_SELL) == uid;
+    return ({string})ob->QueryProp(P_KEEP_ON_SELL) == uid;
 }
 
 
@@ -482,7 +482,7 @@
       object *found_obs = ({});
       foreach(object invob: present_objects(wo)) {
         // || ({}) weil invob ein Objekt ohne locate_objects() sein koennte.
-        found_obs += (object *)invob->locate_objects( was, info) || ({});
+        found_obs += ({object*})invob->locate_objects( was, info) || ({});
       }
       return found_obs;
     }
diff --git a/std/thing/language.c b/std/thing/language.c
index 9e0a0a6..9ec70af 100644
--- a/std/thing/language.c
+++ b/std/thing/language.c
@@ -36,7 +36,7 @@
   return ({ ({ "das ", "des ", "dem ", "das " }),
             ({ "der ", "des ", "dem ", "den " }),
             ({ "die ", "der ", "der ", "die " }) })
-    [(int)QueryProp(P_GENDER)][casus];
+    [({int})QueryProp(P_GENDER)][casus];
 }
 
 // Ende fuer Artikel und Adjektive
@@ -61,7 +61,8 @@
 
   // Objekt mit gleichem Namen im env? Dann unbestimmt
   for ( ob=first_inventory(environment()) ; ob ; ob=next_inventory(ob) )
-    if ( ob!=this_object()&& id==(string)ob->QueryProp(P_NAME) )
+    if ( ob!=this_object()
+         && id == ({string})ob->Name(RAW) )
       return 0;
 
   // sonst bestimmt
@@ -83,7 +84,7 @@
   // Unbestimmter Artikel
   if (QueryProp(P_PLURAL)) return "";
   
-  return sprintf("ein%s ",query_g_suffix((int)QueryProp(P_GENDER),casus));
+  return sprintf("ein%s ",query_g_suffix(({int})QueryProp(P_GENDER),casus));
 }
 
 // Besitzanzeiger fuer Objekt bestimmen
@@ -93,17 +94,17 @@
 }
 
 // Possessivpronomen bestimmen
-public varargs string QueryPossPronoun(mixed what, int casus, int number)
+public varargs string QueryPossPronoun(int|object what, int casus, int number)
 {
   int gen2;
 
   // Geschlecht ermitteln
-  gen2 = (objectp(what)?(int)what->QueryProp(P_GENDER):(int)what);
+  gen2 = (objectp(what)?({int})what->QueryProp(P_GENDER):what);
 
   // Plural ist schoen einfach
   if (QueryProp(P_PLURAL)) return "ihr"+query_g_suffix(gen2, casus, number);
 
-  return (((((int)QueryProp( P_GENDER ))==FEMALE )? "ihr":"sein")+
+  return ((((({int})QueryProp( P_GENDER ))==FEMALE )? "ihr":"sein")+
           query_g_suffix(gen2%3, casus, number));
 }
 
@@ -151,7 +152,7 @@
 // Welches Geschlecht hat das Objekt als String?
 public string QueryGenderString()
 {
-  switch( (int)QueryProp( P_GENDER ))
+  switch( ({int})QueryProp( P_GENDER ))
   {
     case MALE:   return "maennlich";
     case FEMALE: return "weiblich";
@@ -183,12 +184,12 @@
     return adj + ({ ({ "e " , "en ", "en ", "e "  }),
 		    ({ "e " , "en ", "en ", "en " }),
 		    ({ "e " , "en ", "en ", "e "  }) })
-      [(int)QueryProp( P_GENDER )][casus];
+      [({int})QueryProp( P_GENDER )][casus];
   else
     return adj + ({ ({ "es ", "en ", "en ", "es " }),
 		    ({ "er ", "en ", "en ", "en " }),
 		    ({ "e " , "en ", "en ", "e "  }) })
-      [(int)QueryProp( P_GENDER )][casus];
+      [({int})QueryProp( P_GENDER )][casus];
 }
 
 // P_GENDER setzen. Es sind nur 0,1 und 2 (MALE,FEMALE,NEUTER) erlaubt
