diff --git a/d/seher/haeuser/moebel/autoloadertruhe.c b/d/seher/haeuser/moebel/autoloadertruhe.c
index e22ce17..2773043 100644
--- a/d/seher/haeuser/moebel/autoloadertruhe.c
+++ b/d/seher/haeuser/moebel/autoloadertruhe.c
@@ -646,7 +646,7 @@
   
   // Daten fuer den Benutzer aus der Blueprint holen (BP liefert KEINE Kopie
   // und es darf KEINE gemacht werden!):
-  autoloader=(mapping)load_name()->GetData(uuid);
+  autoloader=({mapping})load_name()->GetData(uuid);
   
   // keine Daten gekriegt? -> Fehler loggen
   if (!mappingp(autoloader))
@@ -685,9 +685,9 @@
   else
   {
     if (objectp(blueprint(ME)))
-      res=(int)blueprint(ME)->StoreData(uuid,autoloader);
+      res=({int})blueprint(ME)->StoreData(uuid,autoloader);
     else
-      res=(int)load_object(load_name(ME))->StoreData(uuid,autoloader);
+      res=({int})load_object(load_name(ME))->StoreData(uuid,autoloader);
 
     if (res!=1)
       EmergencyStore(res); // Daten in einem Notfall-Logfile ablegen.
diff --git a/items/seercard.c b/items/seercard.c
index 1d8efa3..9b360b8 100644
--- a/items/seercard.c
+++ b/items/seercard.c
@@ -36,7 +36,7 @@
 
     // Wenn die Karte im Inv des Besitzers ist, Kontostand liefern
     if ( BESITZER_GUELTIG && IS_SEER(environment()) ){
-        res = (int) environment()->Query(KONTO);
+        res = ({int})environment()->Query(KONTO);
 
         // ... allerdings nur, wenn er gueltig ist ;-)
         if ( !intp(res) || res < 0 || res > 100000 )
@@ -290,7 +290,7 @@
         return 0;
     }
 
-    if ( (int) this_player()->AddMoney(summe) != 1 ){
+    if ( ({int})this_player()->AddMoney(summe) != 1 ){
         write( "Soviel Geld koenntest Du gar nicht mehr tragen.\n" );
         return 1;
     }
diff --git a/obj/tools/questtool.c b/obj/tools/questtool.c
index a4c3ff2..daaf394 100644
--- a/obj/tools/questtool.c
+++ b/obj/tools/questtool.c
@@ -237,14 +237,14 @@
 	allowed = old_explode(implode(old_explode(str,".c"),""),",");
       counter++;
       write ( sprintf("Info %s:\n", (do_change?
-				     "["+break_string("\b\b\b\b\b\b"+(string)
+				     "["+break_string("\b\b\b\b\b\b"+({string})
 						      savequest[3]+"]",78,6)
 				     :"")) ); 
       input_to ( "ReadNewQuest" );
       break;
     case INFO:
       if((!str||!sizeof(str)) && do_change)
-	info = (string) savequest[Q_HINT];
+	info = ({string}) savequest[Q_HINT];
       else
 	info = str;
       counter++;
@@ -255,7 +255,7 @@
     case LEVEL:
       if((!str||!sizeof(str)))
 	if(do_change)
-	  level = (int) savequest[Q_DIFF];
+	  level = ({int}) savequest[Q_DIFF];
 	else
 	  level = 0;
 	sscanf ( str, "%d", level );
@@ -298,7 +298,7 @@
       wizard = lower_case(wizard);
       counter++;
       write ( sprintf("Wartender Magier %s:\n",
-		      (do_change?"["+(string)savequest[8]+"]":"")) );
+		      (do_change?"["+({string})savequest[8]+"]":"")) );
       input_to ( "ReadNewQuest" );
       break;
     case SCNDWIZ:
diff --git a/secure/sinmaster.c b/secure/sinmaster.c
index 1559c75..82498b5 100644
--- a/secure/sinmaster.c
+++ b/secure/sinmaster.c
@@ -70,8 +70,8 @@
     if ( !member(sins,who) || !pointerp(sins[who]) || ((j=sizeof(sins[who]))<1) )
       return sprintf("Es liegen keine Eintraege fuer '%s' vor.\n",CAP(who));
 
-    for ( i=1, re = ((string)sins[who][0]+"\n") ; i<j ; i++ )
-      re += sprintf("%3d: %s\n",i,(string)sins[who][i]);
+    for ( i=1, re = ({string})sins[who][0]+"\n" ; i<j ; i++ )
+      re += sprintf("%3d: %s\n",i,({string})sins[who][i]);
 
     return re;
 }
@@ -80,7 +80,7 @@
 {   string *add;
 
     if ( member(sins,who) && pointerp(sins[who]) && (sizeof(sins[who])>0) )
-        add = (string*)sins[who];
+        add = ({string*})sins[who];
     else
         add = ({ sprintf("Eintraege fuer '%s':",CAP(who)) });
 
@@ -108,7 +108,7 @@
 
     if ( text[0..2]=="-f " )
       text=text[3..];
-    else if ( !master()->find_userinfo(who))
+    else if ( !({int})master()->find_userinfo(who))
       return sprintf("Es gibt keinen Spieler namens '%s'\n",who);
 
     text = dtime(time()) + " ("+CAP(getuid(RPL))+")\n" 
@@ -118,7 +118,7 @@
 
     if ( objectp(pl=(find_player(who)||find_netdead(who)))
         && !IS_WIZARD(pl) // Magier haben manchmal komische Ersties ...
-        && stringp(ersti=(string)pl->QueryProp(P_SECOND)) )
+        && stringp(ersti=({string})pl->QueryProp(P_SECOND)) )
     {
         return ( sprintf("Ok.\nFuege Eintrag bei Ersti '%s' hinzu.\n",ersti)
                 + AddSin( lower_case(ersti), ("-f siehe "+who) ) );
@@ -140,7 +140,7 @@
       return sprintf("FEHLER: Keine Eintraege fuer '%s' vorhanden.\n",
                      CAP(who));
 
-    rem = (string*)sins[who];
+    rem = ({string*})sins[who];
 
     if ( sizeof(rem)<=nr )
       return "FEHLER: Diesen Eintrag gibt es nicht.\n";
