diff --git a/items/boerse.c b/items/boerse.c
index 2863066..5fa54eb 100644
--- a/items/boerse.c
+++ b/items/boerse.c
@@ -67,7 +67,6 @@
     case 1:  return "Eine Geldboerse mit einer Muenze.\n";
     default: return "Eine Geldboerse mit "+i+" Muenzen.\n";
   }
-  return 0;
 }
 
 // Geld darf nur rein, wenn diese Boerse schon Geld enthaelt
diff --git a/items/kraeuter/virtual_compiler.c b/items/kraeuter/virtual_compiler.c
index c0c3a7f..bf31341 100644
--- a/items/kraeuter/virtual_compiler.c
+++ b/items/kraeuter/virtual_compiler.c
@@ -18,18 +18,22 @@
 // ([ "key": ({ ({eigenschaften}), ([raeume]) }) ])
 private mapping krautdaten;
 
+#if MUDNAME == "MorgenGrauen"
 // AN: enthaelt die Liste der gueltigen Kraeuter-Dateinamen ohne .c
 // am Ende. Ich vermute, dass es deswegen ein Mapping ist, damit in 
 // Validate() einfach member() drauf gemacht werden kann und man nur 0/1
 // als Rueckgabewerte pruefen muss, statt -1 bei nem member() auf ein Array.
 private mapping validfiles;
+#endif
 
 public void update(mapping data)
 {
   if (previous_object() == find_object(PLANTMASTER))
   {
     krautdaten = data;
+#if MUDNAME == "MorgenGrauen"
     validfiles = mkmapping(m_indices(krautdaten));
+#endif
   }
 }
 
diff --git a/items/pfeifchen.c b/items/pfeifchen.c
index 0bdf38e..4718dac 100644
--- a/items/pfeifchen.c
+++ b/items/pfeifchen.c
@@ -92,8 +92,6 @@
 }
 
 static int cm_smoke(string str){
-  object ob;
-
   _notify_fail("Was moechtest Du rauchen?\n");
   if(!str) return 0;
   if(!id(str)) return 0;
diff --git a/obj/mpa.c b/obj/mpa.c
index c27f827..3c2dd4f 100644
--- a/obj/mpa.c
+++ b/obj/mpa.c
@@ -752,7 +752,8 @@
     }
     return time()-t;
   }
-  else return write("Argumentfehler.\n"),0;
+  write("Argumentfehler.\n");
+  return 0;
 }
 
 static Catchup(string str)
diff --git a/obj/tools/tester/test.c b/obj/tools/tester/test.c
index 6a7965e..0410781 100644
--- a/obj/tools/tester/test.c
+++ b/obj/tools/tester/test.c
@@ -365,7 +365,6 @@
 
 int search_d(object r)
 {   int     i,j,room;
-    mapping m;
     string  *s,s1,*s2,PRE,END,*special,*zufinden,*details,re,*uebergehen;
     mixed   mi;
 
diff --git a/secure/awmaster.c b/secure/awmaster.c
index d9f0bbc..0cb902f 100644
--- a/secure/awmaster.c
+++ b/secure/awmaster.c
@@ -117,7 +117,7 @@
 void RegisterArmour()
 {   object  ob;
     string  id;
-    int     flag,h;
+    int     h;
 
     if (!objectp(ob=previous_object()) || 
       member(inherit_list(ob),"/std/armour.c")==-1)
@@ -126,26 +126,21 @@
     if (member(armours,id))
     {
         armours[id][AWM_TIME]=time();
-        flag=0;
         if ((h=({int})ob->QueryProp(P_AC)) > armours[id][AWM_CLASS])
         {
             armours[id][AWM_CLASS]=h;
-            flag=1;
         }
         if ((h=({int})ob->QueryProp(P_EFFECTIVE_AC)) > armours[id][AWM_EFF_CLASS])
         {
             armours[id][AWM_EFF_CLASS]=h;
-            flag=1;
         }
         if ((h=({int})ob->QueryProp(P_NR_HANDS)) < armours[id][AWM_HANDS])
         {
             armours[id][AWM_HANDS]=h;
-            flag=1;
         }
         if ((h=xflags(ob)) != armours[id][AWM_FLAGS])
         {
             armours[id][AWM_FLAGS]=h;
-            flag=1;
         }
     }
     else
@@ -171,7 +166,7 @@
 void RegisterWeapon()
 {   object  ob;
     string  id;
-    int     flag,h;
+    int     h;
 
     if (!objectp(ob=previous_object()) ||
       member(inherit_list(ob),"/std/weapon.c")==-1)
@@ -180,26 +175,21 @@
     if (member(weapons,id))
     {
         weapons[id][AWM_TIME] = time();
-        flag=0;
         if ((h=({int})ob->QueryProp(P_WC)) > weapons[id][AWM_CLASS])
         {
             weapons[id][AWM_CLASS]=h;
-            flag=1;
         }
         if ((h=({int})ob->QueryProp(P_EFFECTIVE_WC)) > weapons[id][AWM_EFF_CLASS])
         {
             weapons[id][AWM_EFF_CLASS]=h;
-            flag=1;
         }
         if ((h=({int})ob->QueryProp(P_NR_HANDS)) < weapons[id][AWM_HANDS])
         {
             weapons[id][AWM_HANDS]=h;
-            flag=1;
         }
         if ((h=xflags(ob)) != weapons[id][AWM_FLAGS])
         {
             weapons[id][AWM_FLAGS]=h;
-            flag=1;
         }
     }
     else
diff --git a/secure/errord.c b/secure/errord.c
index e257338..32977b1 100644
--- a/secure/errord.c
+++ b/secure/errord.c
@@ -1163,7 +1163,6 @@
       // Zeit alle ab Vollmagier
       case M_WRITE:
         return LEARNER_SECURITY;
-        break;
       // Loeschen und Fixen duerfen zur Zeit nur Zustaendige.
       case M_DELETE:
       case M_REASSIGN:
diff --git a/secure/explorationmaster.c b/secure/explorationmaster.c
index ecc6ee9..3b21587 100644
--- a/secure/explorationmaster.c
+++ b/secure/explorationmaster.c
@@ -294,14 +294,14 @@
 
 private string validOb(mixed ob)
 {
-  string fn, fpart;
+  string fn;
 
   if (!objectp(ob))
     return 0;
 
   fn = old_explode(object_name(ob),"#")[0];
-  fpart = old_explode(fn,"/")[<1];
  /*
+  string fpart = old_explode(fn,"/")[<1];
   if (query_once_interactive(ob))
     return 0;
 
@@ -346,7 +346,7 @@
        else bonus = clear_bit(bonus, obs[fn, MPOS_NUM]);
   }
   else {
-    int nr, i;
+    int nr;
 
     nr = 0;
     while (test_bit(alloc,nr))
@@ -642,10 +642,10 @@
     lastfound[name, 0] = time();
 
     if ( lastfound[name, 1] >= LF_WARN ){
-        object *u;
         int i;
         string *tmp;
 
+//        object *u;
 //        u = filter( users(), "check_arch" );
 //        map( u, #'tell_object/*'*/, "**** FP-Liste/Script " +
 //                   capitalize(name) + " (" + dtime(time()) + ") ****\n" );
@@ -900,12 +900,11 @@
 
   output="";
   if (!pattern || pattern=="")
-    teststring="%s";
-  else teststring="%s"+pattern+"%s";
+    teststring="%~s";
+  else teststring="%~s"+pattern+"%~s";
   walk_mapping( obs, function void (string fn, string* v1, int v2, int v3)
       {
-        string unused;
-        if ( test_bit(ep, v2) && sscanf(fn, teststring, unused, unused) )
+        if ( test_bit(ep, v2) && sscanf(fn, teststring) )
           printep(v2, fn, v3, v1);
       });
   ({void})this_interactive()->More(output);
@@ -918,7 +917,6 @@
 nomask int QueryLEP(int lep) {
     raise_error("Bitte QueryLEP() im LEPMASTER abfragen, nicht im "
        "EPMASTER!");
-    return(-1); //never reached
 }
 
 string QueryForschung()
diff --git a/secure/gildenmaster.c b/secure/gildenmaster.c
index 6018d9f..2954ce8 100644
--- a/secure/gildenmaster.c
+++ b/secure/gildenmaster.c
@@ -128,8 +128,6 @@
 }
 
 nomask int AddGuild(string gildob) {
-  object tp;
-
   if (!stringp(gildob) || !sizeof(gildob) || !security_check() 
       || file_size(GUILD_DIR+gildob+".c")<0)
       return 0;
@@ -141,8 +139,6 @@
 }
 
 nomask int RemoveGuild(string gildob) {
-  object tp;
-
   if (!stringp(gildob) || !sizeof(gildob) 
       || !security_check())
       return 0;
diff --git a/secure/inetd.c b/secure/inetd.c
index 23ab51c..ecf4943 100644
--- a/secure/inetd.c
+++ b/secure/inetd.c
@@ -91,7 +91,6 @@
 #define RETRY                "_RETRY"
 
 private nosave mapping hosts, pending_data, incoming_packets;
-private nosave mapping static_host_list;
 private nosave string *received_ids;
 private nosave int packet_id;
 
@@ -202,9 +201,6 @@
   if (!static_hosts)
       return; // retain the old list(s)
 
-  // remember the static hosts
-  static_host_list = m_reallocate(static_hosts,0);
-  
   // read the last host file dump and add the static hosts. Then the static
   // hosts have precedence over the ones from the dump.
   hosts = (read_host_list(HOST_FILE".dump") || ([])) + static_hosts;
@@ -601,7 +597,7 @@
 string encode_packet(mapping data) {
     int i;
     mixed indices;
-    string header, body, t1, t2;
+    string header, body;
     string *ret;
     status data_flag;
 
@@ -616,8 +612,8 @@
         // dabei nach ASCII wandeln und ggf. transliterieren. Aber sscanf
         // braucht wieder strings, daher muss es spaeter passieren (direkt vor
         // Senden).
-        if (sscanf(header, "%s:%s", t1, t2) ||
-            sscanf(header + body, "%s" + DELIMITER + "%s", t1, t2)
+        if (sscanf(header, "%~s:%~s") ||
+            sscanf(header + body, "%~s" + DELIMITER + "%~s")
         )
             return 0;
 
@@ -766,8 +762,6 @@
     mapping data;
 
     if (data = pending_data[id]) {
-        object ob;
-
 #ifdef INETD_DIAGNOSTICS
         data[PACKET_LOSS]++;
 #endif
diff --git a/secure/krautmaster.c b/secure/krautmaster.c
index 2c0dcba..0818d0c 100644
--- a/secure/krautmaster.c
+++ b/secure/krautmaster.c
@@ -43,16 +43,6 @@
 // krautprops[0] = 0; ID 0 darf nicht existieren
 private mixed *krautprops;
 
-// hier wird gespeichert welche Version einer Zutat fuer einen Spieler ist.
-// AN/TODO: Wenn das fuer Nichtseher nutzbar sein soll, sollte hier besser
-// mit getuuid() gearbeitet werden, statt getuid() zu verwenden.
-// player enthaelt fuer jede Spieler-UID einen Bitstring. Gesetztes Bit
-// bedeutet, dass der Spieler ueber das Kraut mit dieser ID etwas ueber
-// die Verwendung und Wirkung weiss. Es gibt jedoch noch keine Lernmoeglich-
-// keit und INSBESONDERE keine Funktionalitaet im Master, ueber die man 
-// die Bits setzen koennte.
-private mapping player;
-
 // verstuemmeltes mapping fuer den VC in service (Save-Dummy)
 private mapping map_ldfied;
 
@@ -129,7 +119,7 @@
       id2key=({});
       key2id=([]);
       krautprops=({});
-      player=([]);
+      //player=([]);
       map_ldfied=([]);
       rooms=([]);
    }
@@ -199,40 +189,11 @@
 // verwenden kann. Laut Kommentar unten muss man dafuer wohl was ueber das
 // Kraut gelernt haben, von wem ist mir gerade noch nicht klar.
 // AN/TODO: Es ist bisher keine Funktionalitaet vorhanden, um die IDs fuer
-// den Spieler freizuschalten. Die Funktionsweise muss aus dem Beispielcode
-// unten fuer das Learn-On-Demand abgelesen werden.
+// den Spieler freizuschalten.
 nomask int CanUseIngredient(object pl, int id)
 {
   // Ich mach mal den harten Weg. -- Humni
   return 1;
-  // Bitstring des Spielers aus der Liste auslesen.
-   string str=player[getuid(pl)];
-   if (!stringp(str)) str="";
-   if (test_bit(str, id))
-      return 1; // make the common case fast
-   else {
-     // letztenendes habe ich mich entschlossen einzubauen, das man nur die
-     // Kraeuter verwenden kann, ueber die man schonmal etwas gelesen/gelernt
-     // hat, aus diesem Grund, ist folgender Block auskommentiert.
-     // Dieser Block bedeutet quasi ein "auto learning on demand" d.h.
-     // wird ein Kraut verwendet wird geprueft ob fuer diese Gruppe bereits
-     // eine ID freigeschaltet wurde - ansonsten wird eine freigeschaltet.
-     /*
-         // pruefen ob fuer den Key bereits ein Bit gesetzt ist, ggf. setzen
-         if (id>=sizeof(id2key)) return 0; // illegale Id
-         int idlist=key2id[id2key[id]];
-         int i;
-         for (i=sizeof(idlist)-1; i>=0; i--) {
-           if (test_bit(str, idlist[i])) return 0; // Key bereits vorhanden
-         }
-         // Zufaellig ein Bit fuer den Key setzen
-         i=random(sizeof(idlist));
-         player[getuid(pl)]=set_bit(str, idlist[i]);
-         save_object(object_name());
-         return (i==id);
-     */
-     return 0;
-   }
 }
 
 // Diese Funktion wird vom Metzelorakel aufgerufen, um die Belohnungen zu
@@ -340,7 +301,6 @@
    // Allerdings muesste das vor dem explode() zur Zeilentrennung passieren.
    for ( ;si>=0; si--) 
    {
-     string lili=lines[si];
      if (strstr(lines[si],"##ende##")>=0) break;
    }
    si--;
@@ -708,9 +668,10 @@
 // angesteuert ueber das Planttool.
 int _showrooms(string str)
 {
-   int i, j, id;
-   string *list, dummy;
+   int i, id;
+   string *list;
    mixed *arr;
+
    if (!allowed()) return 0;
    notify_fail("Syntax: showrooms <id> oder showrooms all\n");
    if (str!="all") {
@@ -1152,7 +1113,7 @@
 // Fehler "index out of bounds", aber man muesste hier (TODO) sowieso mal
 // von explode() auf strstr() umbauen, denke ich.
 string _findplant(string str) {
-  int i, k;
+  int i;
   string *ind, *tmp;
 
   if(!str) return "";
@@ -1179,9 +1140,8 @@
   if (extern_call() && !allowed())
     return 0;
 
-  string *ind, *args, name;
+  string *ind, name;
   object *objs;
-  int k, l;
 
   objs = ({});
   if(!str) return "Keine Kraeuter uebergeben!";
diff --git a/secure/lepmaster.c b/secure/lepmaster.c
index 592b624..6cc4f60 100644
--- a/secure/lepmaster.c
+++ b/secure/lepmaster.c
@@ -163,7 +163,6 @@
 #else
   return lep/100;
 #endif // __PFOERKL__
-  return 0;
 }
 
 // Wieviele LEP fehlen zum naechsten Level?
diff --git a/secure/mailer.c b/secure/mailer.c
index bc22db9..0201079 100644
--- a/secure/mailer.c
+++ b/secure/mailer.c
@@ -264,7 +264,7 @@
 
 public string *DeliverMail( mixed msg, int expa )
 {
-    string sender, *recipients, *recok, t, *tmp;
+    string sender, *recipients, *recok, *tmp;
     <string|string*>* newmsg;
     int i;
 #ifdef INTERNET_MAIL_ENABLED
@@ -275,7 +275,6 @@
         return 0;
 
     DEBUG( sprintf( "DeliverMail: %O %O\n", msg[0..4] +({0})+ msg[6..7], expa ) );
-    t = ctime(time());
 
     // Ohne Empfaenger wird abgebrochen
     if (!stringp(msg[MSG_RECIPIENT]))
@@ -365,6 +364,7 @@
 #ifdef INTERNET_MAIL_ENABLED
             // Zustellung in den Rest des Internets.
             else {
+                string t = ctime(time());
                 ext = 1;
                 sender = explode( sender, "%" )[0];
                 rec = explode( regreplace( rec, "@", "%", 1 ), "%" )[0];
@@ -419,7 +419,7 @@
 
 public int FingerMail( string user )
 {
-    int newfolder, i;
+    int newfolder;
 
     //Zugriff beschraenken, Zahl der gelesenen Mails ist Privatsphaere
     if (!objectp(this_interactive()) || !stringp(user) || !sizeof(user)) 
diff --git a/secure/master/cidr.c b/secure/master/cidr.c
index c35ba21..d6c36cd 100644
--- a/secure/master/cidr.c
+++ b/secure/master/cidr.c
@@ -90,9 +90,7 @@
       default: // ungueltige Adresse
         return __INT_MAX__;
     }
-
     // hier sollte man gar nicht ankommen.
-    return __INT_MAX__;
 }
 
 string IPv4_int2addr(int ip) {
diff --git a/secure/materialdb.c b/secure/materialdb.c
index 94c57b6..a1240a8 100644
--- a/secure/materialdb.c
+++ b/secure/materialdb.c
@@ -216,6 +216,7 @@
       casus=0;
     return names[casus];
   }
+  return 0;
 }
 
 varargs string ConvMaterialList(mixed mats, int casus, mixed idinf) {
@@ -240,6 +241,7 @@
     }
     return ml;
   }
+  return 0;
 }
 
 int MaterialGroup(mapping mats, string grp) {
@@ -265,6 +267,7 @@
        res=100;
      return res;
    }
+   return 0;
 }
 
 string *AllMaterials() {
@@ -318,6 +321,7 @@
     else
       return "Unbekanntes";
   }
+  return 0;
 }
 
 string GroupDescription(string grp) {
@@ -327,6 +331,7 @@
     else
       return "Gruppe unbekannt";
   }
+  return 0;
 }
 
 //==================== Generieren von Headerfile und Manpages
@@ -369,7 +374,7 @@
 }
 private string gen_material_h_materials()
 {
-  string txt, last_grp;
+  string txt;
   string *grps, *mats;
   txt = "// ****************************** Materialien ******************************\n";
   // Gruppenweise ordnen
@@ -470,7 +475,6 @@
 varargs void GenMatList(string fn)
 {
   if (initialized) {
-    string txt;
     if (!stringp(fn) || !sizeof(fn))
       fn = DOC_DIR("materialliste");
     if (file_size(fn) >= 0) {
@@ -501,7 +505,6 @@
 varargs void GenMatGroupList(string fn)
 {
   if (initialized) {
-    string txt;
     if (!stringp(fn) || !sizeof(fn))
       fn = DOC_DIR("materialgruppen");
     if (file_size(fn) >= 0) {
@@ -533,7 +536,6 @@
 varargs void GenHeaderFile(string fn)
 {
   if (initialized) {
-    string txt;
     if (!stringp(fn) || !sizeof(fn))
       fn = HEADERFILE;
     if (file_size(fn) >= 0)
@@ -680,7 +682,6 @@
   fn = MAT_DIR+"/groups/"+id;
   if (file_size(fn) > 0) {
     mapping parts;
-    string desc;
     parts = getDescParts(read_file(fn));
     m = ([P_NAME:parts["Name"],
           P_MEMBERS:({})]);
@@ -808,7 +809,7 @@
      ...)
   */
   mapping m;
-  mixed val, val2;
+  mixed val;
   m = ([]);
   // Der string fuer das #define zuerst:
   val = convMatId(desc["Materialid"]);
@@ -856,7 +857,6 @@
   fn = MAT_DIR+"/materials/"+id;
   if (file_size(fn) > 0) {
     mapping parts;
-    string desc;
     parts = getDescParts(read_file(fn));
     m = convMaterialDesc(id, parts);
   } else {
@@ -891,7 +891,7 @@
 }
 
 private varargs void doScanMaterials(string* mats, int i, int step) {
-  int ticks, start;
+  int start;
   string matid;
   start = get_eval_cost();
   if (step < 2) {
diff --git a/secure/news.c b/secure/news.c
index f435089..c587dcb 100644
--- a/secure/news.c
+++ b/secure/news.c
@@ -151,8 +151,6 @@
 
 int RemoveGroup(string name)
 {
-  int num;
-
   if (!name) return 0;
 
   if (!security(name) || process_call()) return -1; // Darf nicht
@@ -170,8 +168,6 @@
 
 int SetGroup(string name,int dlevel,int        wlevel,int rlevel,int maxmessages,int expire)
 {
-  mixed *group;
-  
   if (!member(grouplist,name)) return -2;
   if (grouplist[name,G_OWNER]!=user_euid() &&
       (!security(name) || process_call())) return -1;
@@ -188,8 +184,6 @@
 
 int AddAllowed(string name,mixed deleters,mixed writers,mixed readers)
 {
-  mixed *group;
-
   if (!member(grouplist,name)) return -2;
 
   if ( grouplist[name,G_OWNER]!=user_euid() &&
@@ -214,8 +208,6 @@
 
 int RemoveAllowed(string name,mixed deleters,mixed writers,mixed readers)
 {
-  mixed *group;
-
   if (!member(grouplist,name)) return -2;
 
   if (grouplist[name,G_OWNER]!=user_euid() &&
@@ -298,7 +290,6 @@
 int WriteNote(mixed message,mixed keepname)
 {
   mixed group;
-  int uidok,tmp;
   string name;
 
   if (!pointerp(message) || sizeof(message)!=6) return 0;
@@ -325,7 +316,6 @@
 
 int RemoveNote(string name, int note)
 {
-  int num;
   mixed group;
 
   if ((note<0) && (name=="dwnews"))
@@ -429,7 +419,7 @@
 
 void dump_group(string grp)
 {
-  int to_expire,size,last;
+  int size,last;
   mixed group;
 
   if (!ARCH_SECURITY || process_call()) return;
@@ -476,7 +466,6 @@
 
 static mixed load_group(string name)
 {
-  int num;
   mixed *ret;
 
   if(!member(grouplist,name)) return -1;
@@ -498,7 +487,7 @@
 mixed GetGroups()
 {
   mixed *returnlist;
-  int i,group,slevel;
+  int i,slevel;
   string seuid;
 
   returnlist=sort_array(m_indices(grouplist),#'>); //');
diff --git a/secure/potionmaster.c b/secure/potionmaster.c
index e2aa300..2be898f 100644
--- a/secure/potionmaster.c
+++ b/secure/potionmaster.c
@@ -161,7 +161,6 @@
   if ( file_size( TIPS(to_string(nextroom)+".zt") ) < 0 ) {
     raise_error("Potionmaster: Tipfile missing, please create "+
       to_string(nextroom)+".zt");
-    return POT_NO_SUCH_FILE;
   }
   // Neuer Raum darf noch nicht in der Liste enthalten sein.
   if ( member(m_values(potions,POT_ROOMNAME), room)!=-1)
diff --git a/secure/questmaster.c b/secure/questmaster.c
index e142acf..e89c5a4 100644
--- a/secure/questmaster.c
+++ b/secure/questmaster.c
@@ -164,7 +164,7 @@
 
 private int RecalculateQP() {
   int i;
-  mixed q,n;
+  mixed q;
 
   if (!allowed_write_access())
     return -1;
@@ -172,7 +172,6 @@
   max_QP=0;
   opt_QP=0;
 
-  n=m_indices(quests);
   q=m_values(quests);
     for (i=sizeof(q)-1;i>=0;i--)
       if (q[i][Q_ACTIVE]) {
@@ -189,7 +188,6 @@
       string *allowedobj, string hint, int difficulty, int questclass,
       int active, string wiz, string scndwiz, int questattribute)
 {
-  mixed *quest;
   int i;
 
   if (!allowed_write_access()) return 0;
@@ -229,8 +227,6 @@
 }
 
 int RemoveQuest(string name) {
-  mixed *quest;
-
   if (!allowed_write_access()) return 0;
   if (!quests[name]) return -1;
   QMLOG(sprintf("remove: %s %O (%s)",name,quests[name],
@@ -431,7 +427,7 @@
 #define FILTER_UNGELOEST 2
 varargs string liste(mixed pl, int geloest_filter)
 {
-  int qgroups, i, j, qrfw;
+  int qgroups, i, j;
   mixed *qlists, *qgrouped, *qtmp;
   string str;
   string ja, nein, format, ueberschrift;
@@ -809,7 +805,6 @@
   }
 
   mixed *altemq = m_entry(miniquests, mq_obj);
-  int nummer = miniquests[mq_obj,MQ_DATA_QUESTNO];
   miniquests[mq_obj, param] = newvalue;
 
   save_info();
diff --git a/secure/scoremaster.c b/secure/scoremaster.c
index 83dc466..004e341 100644
--- a/secure/scoremaster.c
+++ b/secure/scoremaster.c
@@ -762,7 +762,6 @@
 {
   mixed info;
   object po;
-  int drin;
   string pls, ek;
 
 
@@ -1161,10 +1160,6 @@
 // return valid tips from database or existing 
 public string getTip(mixed key)
 {
-  string fn;
-  string tip;
-  string* path;
-  
   if (!ektipAllowed())
     return "";
   
diff --git a/secure/telnetneg.c b/secure/telnetneg.c
index c5da0d2..8cbc7a9 100644
--- a/secure/telnetneg.c
+++ b/secure/telnetneg.c
@@ -232,28 +232,24 @@
       if (opt->state->localside)
         return -2;
       return send_telnet_neg( ({ WILL, option }) );
-      break;
     case WONT:
       if (opt->lo_wishes->localside != 0)
         return -1;
       if (!opt->state->localside)
         return -2;
       return send_telnet_neg( ({ WONT, option }) );
-      break;
     case DO:
       if (opt->lo_wishes->remoteside != 0)
         return -1;
       if (opt->state->remoteside)
         return -2;
       return send_telnet_neg( ({ DO, option }) );
-      break;
     case DONT:
       if (opt->lo_wishes->remoteside != 0)
         return -1;
       if (!opt->state->remoteside)
         return -2;
       return send_telnet_neg( ({ DONT, option }) );
-      break;
   }
   raise_error(sprintf("Unsupported telnet negotation action in "
       "do_telnet_neg(): %d\n",action));
diff --git a/secure/udp/reply.c b/secure/udp/reply.c
index 43b70ce..e60f618 100644
--- a/secure/udp/reply.c
+++ b/secure/udp/reply.c
@@ -12,7 +12,7 @@
 
 void udp_reply(mapping data)
 {
-  string err,recpt,serv;
+  string serv;
   object ob;
   
   if (pointerp(data[SYSTEM])&&member(data[SYSTEM],TIME_OUT)>-1)
diff --git a/secure/udp_mail.c b/secure/udp_mail.c
index 4bd8d74..2f13f1d 100644
--- a/secure/udp_mail.c
+++ b/secure/udp_mail.c
@@ -59,9 +59,7 @@
 
 static void remove_from_spool(string spool_file)
 {
-  int idx;
-
-  if(spool && (idx=member(spool,spool_file))!=-1)
+  if(spool && (member(spool,spool_file))!=-1)
     {
       spool -= ({ spool_file });
       if(!sizeof(spool))
diff --git a/secure/zweities.c b/secure/zweities.c
index dfc4c2e..afcef41 100644
--- a/secure/zweities.c
+++ b/secure/zweities.c
@@ -273,7 +273,6 @@
   }
   else
     return QueryFamilie(previous_object());
-  return 0;
 }
 
 // Die Familienaliase abfragen. Entweder ein bestimmtes oder alle. Eine
diff --git a/std/armour/wear.c b/std/armour/wear.c
index 3615d43..c89f0a2 100644
--- a/std/armour/wear.c
+++ b/std/armour/wear.c
@@ -159,9 +159,8 @@
 }
 
 protected void _informunwear(object worn_by, int silent, int all) {
-  mixed res;
   // Gesetzte Resistenzen loeschen
-  ({void})worn_by->RemoveResistanceModifier(res=QueryProp(P_ARMOUR_TYPE));
+  ({void})worn_by->RemoveResistanceModifier(QueryProp(P_ARMOUR_TYPE));
   
   // Ruestungen koennen Attribute aendern/blockieren. Also muessen diese
   // nach dem Ausziehen aktualisiert werden
diff --git a/std/clothing/container_description.c b/std/clothing/container_description.c
index 3f19e80..3d06d80 100644
--- a/std/clothing/container_description.c
+++ b/std/clothing/container_description.c
@@ -123,10 +123,9 @@
 {
   int iswiz;
   mixed objs, info;
-  string descr;
 
   iswiz = IS_LEARNER( viewer ) && ({int})viewer->QueryProp(P_WANTS_TO_LEARN);
-  descr = ""; objs = ({}); info = ({});
+  objs = ({}); info = ({});
   map(inv, #'stringenize/*'*/, iswiz | (flags & 2) | (flags & 4), &objs, &info);
   if(flags & 1) return info;
   inv = map(info, #'collect/*'*/) - ({ 0 });
diff --git a/std/clothing/wear.c b/std/clothing/wear.c
index d85ea25..5fe900a 100644
--- a/std/clothing/wear.c
+++ b/std/clothing/wear.c
@@ -196,8 +196,7 @@
 // Hierbei steht -1 dafuer, dass der Aufrufer return 0 machen sollte,
 // <= -2 sollte zur einem return !all fuehren.
 protected int _check_wear_restrictions(int silent, int all) {
-  mixed   type,res;
-  object  *armours;
+  mixed   res;
 
   // Man kann nur Kram anziehen, die man bei sich traegt
   if (environment()!=PL) {            
diff --git a/std/container/inventory.c b/std/container/inventory.c
index 5b6e257..a339d27 100644
--- a/std/container/inventory.c
+++ b/std/container/inventory.c
@@ -62,7 +62,6 @@
 void InsertSensitiveObject(object ob, mixed arg) {
   int i;
   mixed x;
-  mapping map_ldfied;
   
   if (!pointerp(arg))
     return;
diff --git a/std/corpse.c b/std/corpse.c
index 71e0602..8aed0f2 100644
--- a/std/corpse.c
+++ b/std/corpse.c
@@ -119,7 +119,6 @@
 {
     closure cl;
     int i;
-    string info;
 
     spielerleiche = query_once_interactive(ob);
     cl=symbol_function("QueryProp", ob);
@@ -691,7 +690,7 @@
 
 object _channel( object ob )
 {
-  int m_FMM, m_HP, m_WC, m_AC, s_HP, s_WC, s_AC;
+  int m_FMM, m_HP, m_WC, m_AC;
   object rueck;
 
   if (member(inherit_list(previous_object()),CORPSE_OBJ)>-1)
@@ -723,9 +722,9 @@
                     (m_AC = ({int}) funcall( m_q, P_TOTAL_AC ))))
                   > 200000) ? 2 : 0) ||
            (nr = (((y = m_HP * (m_WC + m_AC)) >
-                   (z = 5 * (s_HP = ({int}) funcall( s_q, P_MAX_HP )) *
-                    ((s_WC = ({int}) funcall( s_q, P_TOTAL_WC )) +
-                     (s_AC = ({int}) funcall( s_q, P_TOTAL_AC )))))
+                   (z = 5 * (({int}) funcall( s_q, P_MAX_HP )) *
+                    ((({int}) funcall( s_q, P_TOTAL_WC )) +
+                     (({int}) funcall( s_q, P_TOTAL_AC )))))
                   ? 3 : 0)))
       {
         SetProp( P_NAME, "Geist "+({string}) ob->name(WESSEN, 0) );
diff --git a/std/food.c b/std/food.c
index c2220b3..ae0a5d8 100644
--- a/std/food.c
+++ b/std/food.c
@@ -490,7 +490,6 @@
     write("Mit diesem Futter stimmt was nicht!"
       " Sprich mal mit einem Magier.\n");
     raise_error("Food ohne Werte.\n");
-    return 0;
   }
 
   if (!is_eatable()) {
@@ -515,7 +514,6 @@
     write("Mit diesem Futter stimmt was nicht!"
       " Sprich mal mit einem Magier.\n");
     raise_error("Food ohne Werte.\n");
-    return 0;
   }
 
   if (!is_drinkable()) {
diff --git a/std/gilden_ob.c b/std/gilden_ob.c
index 3435ba4..6656eb2 100644
--- a/std/gilden_ob.c
+++ b/std/gilden_ob.c
@@ -195,8 +195,6 @@
 
 varargs int
 AddSpell(string verb, mapping ski) {
-  mapping skills;
-
   if (!verb)
       return 0;
   if (!mappingp(ski))
@@ -352,7 +350,6 @@
 LearnSpell(string spell,object pl) {
   mapping ski,restr;
   string res;
-  mixed learn_initfunc;
   int abil,diff;
 
   // Wenn kein pl gesetzt ist, nehmen wir this_player(), das ist der
@@ -393,7 +390,6 @@
   mapping ski,restr;
   object pl;
   string res;
-  mixed learn_initfunc;
   int abil,diff;
 
   if (!IsGuildMember(pl=this_player())) {
diff --git a/std/inpc/eval.c b/std/inpc/eval.c
index 24e1337..a8fbe80 100644
--- a/std/inpc/eval.c
+++ b/std/inpc/eval.c
@@ -100,7 +100,7 @@
 
 varargs object *minimize_prop_filt(object *here, mixed prop) {
   object *obs,ob;
-  int i,mhp,hp,sz;
+  int i,mhp,hp;
   
   obs=0;
   if (!pointerp(here))
@@ -125,7 +125,7 @@
 
 varargs object *maximize_prop_filt(object *here, mixed prop) {
   object *obs,ob;
-  int i,mwc,wc,sz;
+  int i,mwc,wc;
   
   obs=0;
   if (!pointerp(here))
diff --git a/std/inpc/select.c b/std/inpc/select.c
index 1fc0163..ada4ccb 100644
--- a/std/inpc/select.c
+++ b/std/inpc/select.c
@@ -45,7 +45,6 @@
         ctime()+"select::scan_objects(). Rest "+to_string(cost)+
         ", i="+member(src, ob)+", Size "+to_string(sizeof(src))+".\n");
       return res;
-      break;
     }
     if (!objectp(ob))
       continue;
@@ -111,7 +110,6 @@
         "Break in select::find_best_weapon(). Rest-Ticks "+to_string(cost)+
         ", i = "+to_string(i)+", Size "+to_string(sizeof(res))+".\n");
       return bob; // zurueckgeben, was bisher drinsteht.
-      break;
     } 
   }
   return bob;
@@ -217,7 +215,6 @@
 	to_string(cost)+", i="+member(diff, di)+", Size "+
 	to_string(sizeof(diff))+".\n");
       return 1; // zurueckgeben, was bisher drinsteht.
-      break;
     }
   }
   diff=na-oa;
@@ -235,7 +232,6 @@
 	 to_string(cost)+", i="+member(diff, di)+", Size "+
 	 to_string(sizeof(diff))+".\n");
       return 1; // zurueckgeben, was bisher drinsteht.
-      break;
     }
   }
   return 1;
diff --git a/std/inpc/walking.c b/std/inpc/walking.c
index 1fe19a4..eef8977 100644
--- a/std/inpc/walking.c
+++ b/std/inpc/walking.c
@@ -117,13 +117,17 @@
 }
 
 int walk_route() {
+  return 0;
 }
 
 int walk_to() {
+  return 0;
 }
 
 int walk_follow() {
+  return 0;
 }
 
 int walk_flee() {
+  return 0;
 }
diff --git a/std/items/fishing/angel.c b/std/items/fishing/angel.c
index 7f403f3..108944a 100644
--- a/std/items/fishing/angel.c
+++ b/std/items/fishing/angel.c
@@ -63,7 +63,7 @@
 // Verlustwahrsch. fuer Koeder falls Fisch zu schwer
 
 private object room, current_user;
-private int active, actime;
+private int active;
 private mapping aquarium = STDFISHLIST;
 
 nomask varargs void StopFishing(string msg_me, string msg_room);
@@ -307,7 +307,6 @@
         // - Haken mit Koeder ist dran.
         // - alte Beute wurde abgenommen.
         // - Move-Hook gesetzt, um Abbruch ausloesen zu koennen.
-        actime = time();
         current_user = TP;
         tell_object(TP, "Du wirfst die Angel aus.\n");
         tell_room(environment(TP), TP->Name()+" wirft eine Angel aus.\n", 
diff --git a/std/items/flasche.c b/std/items/flasche.c
index ed0da17..dd4365b 100644
--- a/std/items/flasche.c
+++ b/std/items/flasche.c
@@ -207,7 +207,6 @@
       " fuellen koenntest!\n");
     return 0;
   }
-  return 0;
 }
 
 static int cmd_leere(string str)
diff --git a/std/items/kraeuter/trank.c b/std/items/kraeuter/trank.c
index e038d1a..afc8bd3 100644
--- a/std/items/kraeuter/trank.c
+++ b/std/items/kraeuter/trank.c
@@ -1102,12 +1102,12 @@
   // erst die positiven, dann die negativen Wirkungen aktivieren
   // fuer jede Wirkung wird eine lfun act_<trankattribut>() gerufen, z.B.
   // act_attr_tragen() (-> act_T_CARRY() )
-  mapping notactivated =
-          filter(peff, function int (string k, int val)
-              {return !funcall(symbol_function("act_"+k,this_object()), val);})
-         +
-          filter(neff, function int (string k, int val)
-              {return !funcall(symbol_function("act_"+k,this_object()), val);});
+  // mapping notactivated = 
+  filter(peff, function int (string k, int val)
+      {return !funcall(symbol_function("act_"+k,this_object()), val);})
+  +
+  filter(neff, function int (string k, int val)
+      {return !funcall(symbol_function("act_"+k,this_object()), val);});
   // Meldungen ausgeben ueber nicht aktivierte Wirkungen?
   // TODO
 }
diff --git a/std/lightsource.c b/std/lightsource.c
index f45d510..834c8b7 100644
--- a/std/lightsource.c
+++ b/std/lightsource.c
@@ -304,7 +304,6 @@
 string short()
 {
   string s;
-  string desc;
 
   if(!(s=QueryProp(P_SHORT)))
     return 0;
diff --git a/std/living/attributes.c b/std/living/attributes.c
index e1d88fc..eef675c 100644
--- a/std/living/attributes.c
+++ b/std/living/attributes.c
@@ -148,7 +148,7 @@
 
 nomask protected void attribute_hb()
 {
-  int now,i,k,update,outdated;
+  int now,i,k,outdated;
   string* keys;
   mapping tonotify;
 	
@@ -433,9 +433,6 @@
 }
 
 protected void add_offsets(mapping arr) {
-  mixed *ind;
-  int i;
-  
   if ( !mappingp(arr) )
     return;
 
@@ -504,7 +501,6 @@
 }
 
 static mixed _query_timed_attr_mod() {
-  mixed ret;
   return Set(P_TIMED_ATTR_MOD,	    
       ({attributes_timed_mods[0],
 	deep_copy(attributes_timed_mods[1]),
diff --git a/std/living/description.c b/std/living/description.c
index 113f3c4..034b7cb 100644
--- a/std/living/description.c
+++ b/std/living/description.c
@@ -100,7 +100,7 @@
 public varargs int AddExtraLook(string look, int duration, string key, 
                                 string lookende, object ob) {
   mapping xl;
-  string oname;
+
   if (!stringp(key) || !sizeof(key)) {
     // Automatisch erzeugen, wenn moeglich
     if (!objectp(previous_object()) || 
@@ -243,10 +243,8 @@
 }
 
 varargs string long() {
-  string str, cap_pronoun;
-  string descr, invl,tmp,exl;
-  int hpnt, max_hpnt;
-  mixed filter_ldfied;
+  string str;
+  string invl,tmp,exl;
   object ob;
 
   str = process_string( QueryProp(P_LONG) );
@@ -286,7 +284,7 @@
     }
   }
   
-  if(filter_ldfied = QueryProp(P_TRANSPARENT))
+  if(QueryProp(P_TRANSPARENT))
   {
     invl = make_invlist(PL, all_inventory(ME));
     if(invl != "")
diff --git a/std/living/light.c b/std/living/light.c
index 90c3aef..ecbc926 100644
--- a/std/living/light.c
+++ b/std/living/light.c
@@ -30,6 +30,7 @@
 {
   if (environment())
     return environment()->QueryProp(P_INT_LIGHT) + QueryProp(P_LIGHT_MODIFIER);
+  return 0;
 }
 
 varargs int CannotSee(int silent)
diff --git a/std/living/put_and_get.c b/std/living/put_and_get.c
index 936fad0..e44e4da 100644
--- a/std/living/put_and_get.c
+++ b/std/living/put_and_get.c
@@ -280,7 +280,6 @@
 
             return capitalize(wen0 + " kannst Du dort nicht hineinstecken.");
     }
-    return 0; // NOT REACHED
 }
 
 
@@ -1186,7 +1185,6 @@
      else obs=(inv->present_objects(str) || ({}));
      return obs-({ ME });
    }
-   return(0);
 }
 
 int pick_obj(object ob)
@@ -1243,8 +1241,6 @@
 
 int give_obj(object ob, object where)
 {
-  object env;
-
   if (environment(ob)!=this_object()) {
     TME("Das solltest Du erstmal nehmen.");
     return 1;
diff --git a/std/living/skill_attributes.c b/std/living/skill_attributes.c
index c88b4f4..43206e0 100644
--- a/std/living/skill_attributes.c
+++ b/std/living/skill_attributes.c
@@ -110,9 +110,6 @@
 
 private int InternalModifySkillAttribute(object caster, string atrname,
                                 mixed value, int duration) {
-  int zeit = utime()[1];
-  int ticks = get_eval_cost();
-
   // nur existierende SAs...
   if (!stringp(atrname)
       || member(VALID_SKILL_ATTRIBUTES, atrname) == -1)
diff --git a/std/more.c b/std/more.c
index 3635e88..91ab479 100644
--- a/std/more.c
+++ b/std/more.c
@@ -70,7 +70,7 @@
 
 int search(mixed pinfo)
 {
-  int l, lines;
+  int l;
   mixed tmp;
   l = pinfo[CURL];
   while((tmp = fread(pinfo, l, pinfo[PAGE])) &&
diff --git a/std/newsclient.c b/std/newsclient.c
index eac517e..7d3648e 100644
--- a/std/newsclient.c
+++ b/std/newsclient.c
@@ -223,7 +223,6 @@
 	    default: write("Interner Fehler. Bitte Erzmagier verstaendigen !\n");
 	    return 1;
 	  }
-  return 0;
 }
 
 void Crumble()
diff --git a/std/npc/chat.c b/std/npc/chat.c
index ff6990e..2491d93 100644
--- a/std/npc/chat.c
+++ b/std/npc/chat.c
@@ -68,7 +68,6 @@
 }
 
 void DoAttackChat() {
-  string* c;
   if (!ME || !environment(ME))
     return;
   if (QueryProp(P_DISABLE_ATTACK)>0)return ;
@@ -77,7 +76,6 @@
 }
 
 void DoChat() {
-  string *c;
   if (!ME || !environment(ME))
     return;
   if (random(100) < QueryProp(P_CHAT_CHANCE))
diff --git a/std/pile.c b/std/pile.c
index 049d84f..bb57f48 100644
--- a/std/pile.c
+++ b/std/pile.c
@@ -52,7 +52,6 @@
 	} else {
 		return "Ein grosser Haufen Krempel";
 	}
-  return 0;
 }
 
 // Prueft, ob wir in einen Spieler gemovt werden sollen.
diff --git a/std/player/channel.c b/std/player/channel.c
index cf8d85a..0ecefc2 100644
--- a/std/player/channel.c
+++ b/std/player/channel.c
@@ -349,7 +349,7 @@
 int ChannelParser(string args)
 {
   string|string* ch;
-  int pos, type, err;
+  int type, err;
   string tmp;
   notify_fail("Benutzung: -<Ebene>[ ]['|:|;]<Text>\n"
               "           -<Ebene>[+|-|?|!|*]\n"
diff --git a/std/player/comm.c b/std/player/comm.c
index 87dd6a0..36aaff4 100644
--- a/std/player/comm.c
+++ b/std/player/comm.c
@@ -81,8 +81,6 @@
 // erzeugt sortierte Liste an Kommunikationspartnern
 private string *sorted_commpartners(int reversed);
 
-private nosave string *buffer = ({});
-
 void create()
 {
   ::create();
@@ -989,7 +987,6 @@
 }
 
 static int _msg_prepend(string str) {
-  int beep_interval;
   notify_fail("Syntax: senderwiederholung ein/aus\n");
   if (stringp(str)) {
     if (str=="aus")  
@@ -1109,7 +1106,7 @@
 {
   object    ob;
   string    away,myname,ret;
-  mixed     ignore,it;
+  mixed     it;
   string    *xname;
   int       i,visflag;
 
@@ -1389,9 +1386,7 @@
 
 static int _shout_to_wizards(mixed str)
 {
-  int     i, j;
   string    myname;
-  object   *u;
 
   str = _unparsed_args();
   if (!str||!sizeof(str)) {
@@ -1744,7 +1739,6 @@
         default: // mehr als 3 Teile...
           raise_error(sprintf("TestIgnoreExt(): too many qualifiers, only 1 "
                 "is supported. Got: %s\n",srcname));
-          break;
       }
     }
   }
diff --git a/std/player/command.c b/std/player/command.c
index beea800..d342e90 100644
--- a/std/player/command.c
+++ b/std/player/command.c
@@ -208,6 +208,8 @@
   }
   else if (!s||s=="")
     return (default_notify_fail=0);
+
+  return 0;
 }
 
 static mixed _query_default_notify_fail()
diff --git a/std/player/description.c b/std/player/description.c
index acd4200..91980f5 100644
--- a/std/player/description.c
+++ b/std/player/description.c
@@ -115,8 +115,7 @@
 
 varargs string long()
 {
-  string exl, descr, tmp, size_descr;
-  object ob;
+  string descr, size_descr;
   mixed trans, w, a, r;
   int per;
   string fill, fill2;
diff --git a/std/player/exploration.c b/std/player/exploration.c
index 3990e54..e45637e 100644
--- a/std/player/exploration.c
+++ b/std/player/exploration.c
@@ -21,8 +21,6 @@
 
 private string given_scores;
 
-private nosave mixed epnum;
-
 void create() {
   Set(P_LEP, SECURED|SAVE, F_MODE_AS);
 
diff --git a/std/player/invmaster/invmaster.c b/std/player/invmaster/invmaster.c
index 49c3c38..2ac7bd2 100644
--- a/std/player/invmaster/invmaster.c
+++ b/std/player/invmaster/invmaster.c
@@ -132,10 +132,7 @@
 // where possible
 static string ComposeDesc(object item)
 {
-  int i;
-  string text, *buff;
-  
-  text=regreplace(item->QueryProp(P_SHORT)
+  string text=regreplace(item->QueryProp(P_SHORT)
                 ||item->name(RAW)
                 ||"<?>",
                 "^(Ein Paar|Ein|Eine|Der|Die|Das) ","",0);
diff --git a/std/player/life.c b/std/player/life.c
index 3a52dee..ca295fd 100644
--- a/std/player/life.c
+++ b/std/player/life.c
@@ -505,7 +505,7 @@
 static int _set_hp( int hp )
 {
     object *hooks;
-    int ret, i, old;
+    int ret, old;
 
     if ( (old = Query(P_HP, F_VALUE)) == hp )
         return old;
@@ -532,7 +532,7 @@
 static int _set_sp( int sp )
 {
     object *hooks;
-    int ret, i, old;
+    int ret, old;
 
     if ( (old = Query(P_SP,F_VALUE)) == sp )
         return old;
diff --git a/std/player/protocols/gmcp.c b/std/player/protocols/gmcp.c
index e3e6d6c..905fdc9 100644
--- a/std/player/protocols/gmcp.c
+++ b/std/player/protocols/gmcp.c
@@ -156,9 +156,8 @@
 
 private void GMCP_unregister_module(string mod)
 {
-  int version;
   // Wenn nicht "mod version" Schema, ignorieren
-  if (sscanf(mod, "%s %d", mod, version) != 2)
+  if (sscanf(mod, "%s %~d", mod) != 2)
       return;
 
   if (mod=="Core") // darf nicht abgeschaltet werden.
diff --git a/std/player/reputation.c b/std/player/reputation.c
index 792c386..f32b75d 100644
--- a/std/player/reputation.c
+++ b/std/player/reputation.c
@@ -27,7 +27,9 @@
  */
 public varargs int ChangeReputation(string repid, int value, 
                                           int silent) {
-  string uid, changemsg; int newval; mapping rep;
+  string changemsg;
+  int newval;
+  mapping rep;
   
   if(!intp(value) || !value || !stringp(repid) || !sizeof(repid)) 
     return REP_RET_WRONGARGS;
diff --git a/std/player/shadows/ark_hunger_shadow.c b/std/player/shadows/ark_hunger_shadow.c
index 42d6dff..2559f01 100644
--- a/std/player/shadows/ark_hunger_shadow.c
+++ b/std/player/shadows/ark_hunger_shadow.c
@@ -46,6 +46,7 @@
   }
   return 0;
  }
+ return 0;
 }
 
 void Loeschen() {
diff --git a/std/player/soul.c b/std/player/soul.c
index 9ea7bba..5368d1d 100644
--- a/std/player/soul.c
+++ b/std/player/soul.c
@@ -633,7 +633,7 @@
 varargs static int
 SoulComm(string str, string _verb)  {
   int t_g,t_n,flag;
-  string str1,str2,str3,*taenze,vb;
+  string str1,str2,*taenze,vb;
   out_sel=out_vic=out_oth=who=0;
 //  if (this_interactive()!=ME) return 0;
   if (interactive(ME)) str=_unparsed_args(); // NPCs haben das nicht :(
diff --git a/std/player/travel.c b/std/player/travel.c
index 1b41d59..cca6a54 100644
--- a/std/player/travel.c
+++ b/std/player/travel.c
@@ -43,7 +43,7 @@
 static int reise(string str)
 {
   mixed  t, ship, dstr;
-  string mit, nach, s1, s2;
+  string mit, nach;
   int    i;
 
   _notify_fail("Syntax: reise mit <transportmittel> nach <zielort>\n\n"
diff --git a/std/player/util.c b/std/player/util.c
index 0d7ca18..40d3729 100644
--- a/std/player/util.c
+++ b/std/player/util.c
@@ -96,7 +96,7 @@
 // Lacht nicht ueber den Namen!!! -Boing
 // Nein, ueber den Namen lache ich nicht ... -Paracelsus
 static void DumpKeyValPair(mapping x, mixed key, int size)
-{ int j, vc;
+{ int j;
 
   PrettyDump(key);
   write(" : ");
diff --git a/std/player/viewcmd.c b/std/player/viewcmd.c
index 718db88..ab528c5 100644
--- a/std/player/viewcmd.c
+++ b/std/player/viewcmd.c
@@ -109,7 +109,7 @@
 int _inventory(string str)
 {
   mixed *args, output;
-  int ansi, i, flags, minv;
+  int ansi, flags, minv;
   mixed inventory, weapons, armours, misc;
   string format;
 
@@ -681,8 +681,6 @@
       return 0;
     }
   }
-  // Nie erreicht.
-  return 0;
 }
 
 varargs int _examine(string str, int mode)
@@ -768,7 +766,6 @@
 varargs string env_descr(int allow_short,int flags, int force_short )
 {
   object env;
-  int brief;
 
   env = environment(ME);
 
@@ -778,7 +775,7 @@
   if (!force_short && (!allow_short || !QueryProp(P_BRIEF)))
       return env->int_long(ME,ME,flags);
 
-  if (!flags && ((brief=QueryProp(P_BRIEF))>=2))
+  if (!flags && QueryProp(P_BRIEF)>=2)
       return "";
 
   return env->int_short(ME,ME);
diff --git a/std/room/pub.c b/std/room/pub.c
index bdd2c90..00121b1 100644
--- a/std/room/pub.c
+++ b/std/room/pub.c
@@ -93,7 +93,6 @@
     case "&6#": return "@WESSENQP1";
     case "&7#": return "@WEMQP1";
     case "&8#": return "@WENQP1";
-    default: return str;
   }
   return str;
 }
diff --git a/std/room/shop.c b/std/room/shop.c
index 1196129..880aadb 100644
--- a/std/room/shop.c
+++ b/std/room/shop.c
@@ -35,8 +35,6 @@
 
 varargs void AddFixedObject(string str, int val, string|string* ids)
 {
-  int i;
-
   // Achtung, bei solchen Objekten muss die Blueprint initialisiert werden!
   if (!str) return;
   if (!val) val=str->QueryProp(P_VALUE);
@@ -205,7 +203,6 @@
 {
   object store = load_object(storage);
   store->_register_shop(ME);
-  object* output = ({});
   object* all_items = all_inventory(store);
 
   // Wir brauchen eine Liste, die von jeder Blueprint nur einen Clone
diff --git a/std/secure_thing.c b/std/secure_thing.c
index 805c7df..e47f66a 100644
--- a/std/secure_thing.c
+++ b/std/secure_thing.c
@@ -29,5 +29,6 @@
   string sh;
   if( sh=QueryProp(P_SHORT) )
     return funcall(sh)+".\n";
+  return 0;
 }
 
diff --git a/std/shells/darkelf.c b/std/shells/darkelf.c
index bf197ef..e993a03 100644
--- a/std/shells/darkelf.c
+++ b/std/shells/darkelf.c
@@ -203,7 +203,6 @@
     }
     return sinfo[SI_SKILLABILITY]+1;
   }
-  return 0;
 }
 
 varargs int CannotSee(int silent)
diff --git a/std/shells/magier/fileedit.c b/std/shells/magier/fileedit.c
index b0bfeb0..a242c68 100644
--- a/std/shells/magier/fileedit.c
+++ b/std/shells/magier/fileedit.c
@@ -60,7 +60,7 @@
 static int _ed(string cmdline)
 {
   mixed *args,*args2;
-  int flags,i,arg_size;
+  int flags,arg_size;
   cmdline=_unparsed_args();
   args=parseargs(cmdline,&flags,"",1);
   if (flags==-1||!(arg_size=sizeof(args)))
@@ -149,7 +149,6 @@
       if (flags&CP_V) printf(FILE_COPIED,source);
       return RET_OK;
   }
-  return 0; // not-reached
 }
 
 static void _cp_ask_overwrite2(string input, mixed *filedata,
@@ -290,9 +289,8 @@
 
 static void _cp_ask_copy(mixed *filedata,int move, int flags)
 {
-  mixed data;
   string dest,source;
-  int delete_subs,jump;
+  int jump;
 
   if(!sizeof(filedata))
   {
@@ -441,7 +439,7 @@
 
 static int _rmdir(string cmdline)
 {
-  string dest,tmp;
+  string dest;
   int flags;
   mixed *args;
   
@@ -492,7 +490,7 @@
 
 static int _mkdir(string cmdline)
 {
-  string dest,tmp;
+  string dest;
   int flags,i;
   string *args;
   
@@ -581,13 +579,10 @@
       _rm_ask_delete(filedata,flags);
       return;
   }
-  return;
 }
 
 private void _rm_ask_delete(mixed *filedata, int flags)
 {
-  int i;
-  mixed temp;
   if (!sizeof(filedata))
   {
     printf("rm: abgeschlossen.\n");
@@ -600,7 +595,7 @@
       _rm_ask_delete(filedata[1..],flags);
       return;
     case FSIZE_DIR:
-      if (i=filedata[0][SUBDIRSIZE])
+      if (filedata[0][SUBDIRSIZE])
         printf("Ins Verzeichnis '%s' hinabsteigen?\n",
           filedata[0][FULLNAME]);
       else
@@ -652,7 +647,7 @@
 
 static int _rm(string cmdline)
 {
-  mixed *args,*args2;
+  mixed *args;
   int flags,i;
   string mask;
   
diff --git a/std/shells/magier/fileview.c b/std/shells/magier/fileview.c
index 6929357..2fc4b2f 100644
--- a/std/shells/magier/fileview.c
+++ b/std/shells/magier/fileview.c
@@ -65,7 +65,6 @@
 // und bereitet beides fuer die Nutzung durch terminal_colours() vor.
 private void SetColorstrings()
 {
-  string term = QueryProp(P_TTY);
   mapping vars = QueryProp(P_VARIABLES);
   // 2nd value in templates is the additional amount of space the templates
   // itself needs in addition to the value inserted later in place of %s.
@@ -76,7 +75,7 @@
   lstemplates.colormap[0]=ANSI_NORMAL;
   // Template fuer die Ausgabe und die Defaults fuer die Farbplatzhalter je
   // nach Terminal einstellen.
-  switch(term=QueryProp(P_TTY))
+  switch(QueryProp(P_TTY))
   {
     case "vt100":
       lstemplates.templates[DIR] = "%^LS_DIR_START%^%s/%^LS_DIR_END%^";
@@ -153,7 +152,6 @@
 private int _ls_maxlen(mixed filedata,int flags,int maxlen)
 {
   string base;
-  int size;
   base=filedata[BASENAME];
   if (!(flags&LS_A)&&(base[0]=='.')) return 0;
   maxlen=max(maxlen,sizeof(base));
@@ -250,7 +248,7 @@
   mixed* args;
   string output;
   mixed *tmp;
-  closure output_fun,v_read,v_write,creator,sort_fun;
+  closure v_read,v_write,creator,sort_fun;
   
   cmdline=_unparsed_args()||"";
   args=parseargs(cmdline,&flags,LS_OPTS,1);
diff --git a/std/shells/magier/todo.c b/std/shells/magier/todo.c
index c87d17d..f28bd12 100644
--- a/std/shells/magier/todo.c
+++ b/std/shells/magier/todo.c
@@ -12,7 +12,6 @@
 
 #define SAVEFILENAME sprintf("/players/%s/.todoliste",getuid())
 
-private nosave status todo_initialized;
 private nosave mixed *todo_data;
 mixed *todo_data_public;
 static mixed _query_localcmds()
@@ -23,9 +22,8 @@
 
 private void todo_save()
 {
-
-  int i,j;
-  string a,b;
+  int j;
+  string a;
   a=SAVEFILENAME+".o";
   rm(a);
   if (j=sizeof(todo_data))
diff --git a/std/shells/magier/upd.c b/std/shells/magier/upd.c
index 87a3030..ebee975 100644
--- a/std/shells/magier/upd.c
+++ b/std/shells/magier/upd.c
@@ -65,7 +65,6 @@
   if (!obj=find_object(file[0..<3]+(clone?("#"+clone):"")))
   {
     int pos,pos2;
-    string bt;
 
     if(file_size(file)<0)
     {
@@ -356,7 +355,7 @@
   if ( (!(flags&UPD_LOAD))&&
        ((obj = find_object(file)) || (flags & (UPD_M|UPD_I))))
   {
-    object *inv, env, *pl_inv;
+    object *inv, env;
     mapping pro;
     int i;
     mixed configdata;
diff --git a/std/spellbook.c b/std/spellbook.c
index ac9031a..8ef27d1 100644
--- a/std/spellbook.c
+++ b/std/spellbook.c
@@ -162,13 +162,12 @@
 varargs int
 TryDefaultAttackSpell(object victim, object caster, mapping sinfo, 
                       mixed si_spell) {
-  object team;
   int row;
   
   if (!si_spell) si_spell=sinfo[SI_SPELL];
   // Wenn der Spieler in einem Team ist, die Teamreihen-Boni
   // beruecksichtigen. Wenn nicht, eben nicht.
-  if (!team=(({object})caster->QueryProp(P_TEAM)))
+  if (!({object})caster->QueryProp(P_TEAM))
   return TryAttackSpell(victim,
                         GetRandFValueO(SI_SKILLDAMAGE,sinfo,caster),
                         GetData(SI_SKILLDAMAGE_TYPE,sinfo,caster),
@@ -299,7 +298,7 @@
 varargs int
 UseSpell(object caster, string spell, mapping sinfo) {
   mapping ski,tmp;
-  string spellbook,sname,fname,txt;
+  string sname,fname,txt;
   int res,fat,cost;
   mixed ps;
 
diff --git a/std/thing/commands.c b/std/thing/commands.c
index 157fe74..98934eb 100644
--- a/std/thing/commands.c
+++ b/std/thing/commands.c
@@ -608,8 +608,7 @@
   while(nindex--)
    if(!strstr(query_verb(),keys[nindex]) &&
       member((flag=added_cmds[keys[nindex], CMDIDX_FLAG]),1)>=0) {
-    int i,ret;
-    i=sizeof(flag);
+    int i = sizeof(flag);
     // Reihenfolge nicht aendern !
     while(i--)
       if(flag[i]==1) {
diff --git a/std/thing/description.c b/std/thing/description.c
index b2326da..db238d2 100644
--- a/std/thing/description.c
+++ b/std/thing/description.c
@@ -275,7 +275,6 @@
 // zusamengebaut werden, dazu muss ich das leerzeichen aber erstmal
 // abschneiden und so weiter ...
 private string depointer_adj( <string|string*>* adj, int casus, int demon ) {
-  string msg;
   int start;
   string res,a;
 	adj = map( adj, #'DeclAdj, casus, demon );
@@ -498,7 +497,6 @@
 // Detail(s) hinzufuegen
 public void AddDetail(string|string* keys, string|string*|mapping|closure descr)
 {
-    int i;
     mapping details;
 
     details = Query(P_DETAILS, F_VALUE);
diff --git a/std/thing/language.c b/std/thing/language.c
index 4b23c8a..e0e3b3d 100644
--- a/std/thing/language.c
+++ b/std/thing/language.c
@@ -50,7 +50,7 @@
 // Artikel vorschlagen: gibt es noch mehr Objekte im inv?
 protected varargs int SuggestArticle(string id)
 {
-  object ob,*obs;
+  object ob;
 
   // Raum oder Master: Bestimmt.
   if (!environment()) return 1;
@@ -110,8 +110,6 @@
 // Pronomen bestimmen nach KNG
 public varargs string QueryPronoun(int casus)
 {
-  int gender;
-
   // Plural ist immer einfach ...
   if (QueryProp(P_PLURAL)) 
   {
diff --git a/std/thing/light.c b/std/thing/light.c
index 465eea7..99d2e17 100644
--- a/std/thing/light.c
+++ b/std/thing/light.c
@@ -85,5 +85,4 @@
     default:
       return (lighttype & my_light_type);
   }
-  return 0;
 }
diff --git a/std/thing/util.c b/std/thing/util.c
index 0a0d1ff..4e58576 100644
--- a/std/thing/util.c
+++ b/std/thing/util.c
@@ -96,7 +96,7 @@
 // Lacht nicht ueber den Namen!!! -Boing
 // Nein, ueber den Namen lache ich nicht ... -Paracelsus
 static void DumpKeyValPair(mapping x, mixed key, int size)
-{ int j, vc;
+{ int j;
 
   PrettyDump(key);
   write(" : ");
diff --git a/std/transport.c b/std/transport.c
index 2f46927..1499cbc 100644
--- a/std/transport.c
+++ b/std/transport.c
@@ -177,8 +177,7 @@
 
 mixed HasRoute(mixed dest)
 {
-  int i,s,z;
-  string str;
+  int i,s;
   object ob;
   mixed harb;
   
@@ -484,8 +483,7 @@
 static varargs void connect(string room, string code)
 {
   mixed *arrivemsg, *t;
-  object *trav, ob;
-  string *trs, *msgs;
+  object *trav;
   int i;
 
   if (roomCode) disconnect();
diff --git a/std/unit.c b/std/unit.c
index 3024714..83c73a9 100644
--- a/std/unit.c
+++ b/std/unit.c
@@ -627,7 +627,6 @@
 // uebergeben. Wichtig: zu diesem Zeitpunkt hat sich an der Unit noch nix (!)
 // geaendert!
 protected void DoDecayMessage(int oldamount, int zerfall) {
-  string msg;
   if (oldamount == zerfall) {
     if (living(environment())) {
       tell_object(environment(), break_string(sprintf(
diff --git a/std/user_filter.c b/std/user_filter.c
index edc3deb..4b156c2 100644
--- a/std/user_filter.c
+++ b/std/user_filter.c
@@ -165,7 +165,7 @@
 {
   object *res, *orig, *zwi;
   string *words;
-  int i, sz, f, l,t;
+  int i, sz, f, t;
   mixed x;
   
   orig = users();
diff --git a/std/util/ex.c b/std/util/ex.c
index aa8509d..ded4707 100644
--- a/std/util/ex.c
+++ b/std/util/ex.c
@@ -279,10 +279,9 @@
 
 varargs int ex(mixed text, closure func, mixed fargs, string buffer)
 {
-  int c, l;
+  int l;
   mixed ct;
   if(!text) text = "";
-  c = sizeof(text);
   l = sizeof(text = explode(text, "\n")) - 1;
   ct = ({ CMD, text, 0, func, fargs, 0, 0});
   if(!ctrl[buffer]) StartEX(0, ct);
diff --git a/std/util/pager.c b/std/util/pager.c
index abd5e63..d628ea6 100644
--- a/std/util/pager.c
+++ b/std/util/pager.c
@@ -26,7 +26,7 @@
   if(pinfo[FILE]) return read_file(pinfo[TEXT], begin, c);
   else
   {
-    int start, end, l, x;
+    int start, end;
 
     if(member(pinfo[JUNK], begin)) 
     {
diff --git a/std/util/ringbuffer.c b/std/util/ringbuffer.c
index b7143af..a549836 100644
--- a/std/util/ringbuffer.c
+++ b/std/util/ringbuffer.c
@@ -135,7 +135,6 @@
       else
 	return copy(rbuffer);
   }
-  return 0;
 }
 
 /** Erzeugt einen neuen Ringbuffer der Groesse \a size und dem gleichen Modus
diff --git a/std/virtual/v_compiler.c b/std/virtual/v_compiler.c
index a6bb773..c09eaab 100644
--- a/std/virtual/v_compiler.c
+++ b/std/virtual/v_compiler.c
@@ -130,7 +130,6 @@
 private mixed AddObject(string file)
 {
   object ob;
-  string err;
 
   // clean up the object list
   objects = filter_indices(objects, function int (string f) {
diff --git a/std/weapon/combat.c b/std/weapon/combat.c
index f26b1d8..333ea3c 100644
--- a/std/weapon/combat.c
+++ b/std/weapon/combat.c
@@ -219,7 +219,6 @@
 varargs int wield_me(int silent) 
 {
   raise_error("wield_me() ist veraltet. Bitte nutze DoWield()\n");
-  return 1;
 }
 
 // Die Funktion, die das eigentliche Zuecken durchfuehrt.
