diff --git a/obj/tools/MGtool.c b/obj/tools/MGtool.c
index ed9aca1..800bcca 100644
--- a/obj/tools/MGtool.c
+++ b/obj/tools/MGtool.c
@@ -58,8 +58,6 @@
 nosave int     xtk=FALSE;
 nosave mapping variable=([]);
 nosave string *cmds;
-private nosave mapping line_buffer=([]);
-private nosave string line_buffer_name="";
 private nosave string more_searchexpr="";
 int    morelines=MORE_LINES;
 int    modi=(MODE_FIRST|MODE_PROTECT|MODE_SHORT);
@@ -144,7 +142,7 @@
 {
   object obj, env;
   string *strs;
-  int i, s, cnt;
+  int i, s;
   
   if(!str)
     return NULL;
@@ -176,7 +174,6 @@
 static varargs object FindObj(string str, object env, int silent)
 {
   object obj, *inv;
-  string tmp;
   int num, e;
   
   if (!stringp(str) || !sizeof(str) || !objectp(env))
@@ -242,7 +239,6 @@
     default:
     return variable[str[1..<1]];
   }
-  return(NULL); //never reached
 }
 
 static string VarToFile(string str)
@@ -602,7 +598,7 @@
 
 static void XMoreFile(string file, int flag)
 {
-  int s,size;
+  int size;
   
   SECURE1();
   if(!file)
@@ -622,8 +618,8 @@
 
 static void MoreFile(string str)
 {
-  int i, off;
-  string f, l, r;
+  int i;
+  string l;
   
   SECURE1();
   
@@ -641,7 +637,6 @@
       if(morefile==TMP_FILE||morefile==PIPE_FILE)
 	rm(morefile);
       return NULL;
-      break;
       case 'P':
       case 'U':
       moreflag=FALSE;
@@ -898,7 +893,7 @@
 static string PlayerIdle(object obj)
 {
   string str;
-  int i, tmp;
+  int i;
   
   if(!obj)
     return NULL;
@@ -916,7 +911,7 @@
 static string PlayerAge(object obj)
 {
   string str;
-  int i, tmp;
+  int i;
   
   if(!obj)
     return NULL;
@@ -940,7 +935,7 @@
 static string PlayerWho(object obj)
 {
   object tmp;
-  string str, stmp;
+  string str;
   str=ARIGHT(""+LEVEL(obj)  ,  3, " ");
   str+=ALEFT(" "+crname(obj)+" ", 12, ".");
   str+=PlayerAge(obj);
@@ -1012,7 +1007,7 @@
 
 static string PlayerSnoop(object obj, int flag)
 {
-  string tmp, pre;
+  string pre;
   object victim;
   
   pre=(flag) ? ALEFT(crname(obj)+" ", 12, ".")+" " : "";
@@ -1219,8 +1214,6 @@
 
 void create()
 {
-  object obj;
-  
   if(member(object_name(),'#')<0)
     return;
   if(!cloner&&!((cloner=TP)||(cloner=ENV(ME)))&&!interactive(cloner))
@@ -1258,10 +1251,8 @@
 
 void init()
 {
-  object first, prev;
-  
   if(member(object_name(),'#')<0) return;
-  first=first_inventory(ENV(ME));
+  object first=first_inventory(ENV(ME));
   if(MODE(MODE_PROTECT)&&is_player(first)&&!IS_ARCH(first))
   {
     WDLN("WARNING: "+crname(first)+" tried to move into your inventory");
@@ -1487,12 +1478,10 @@
     case 0:
     ret=CallFunc(verb,strip_string(UnquoteLine(arg)));
     SafeReturn(ret);
-    break;
     
     case 1:
     WDLN("Missing rhs of command pipe");
     SafeReturn(TRUE);
-    break;
     
     default:
     pipe_out=TRUE;
@@ -1648,7 +1637,6 @@
 
 static void VarCheck(int show)
 {
-  int i, s;
   foreach(string k, mixed v : variable)
   {
     if (v) continue;
@@ -1670,7 +1658,7 @@
 
 int CommandScan(string arg)
 {
-  string verb, cmd;
+  string verb;
   object rtp;
   rtp=RTP;
 
diff --git a/obj/tools/MGtool/toolcmd.c b/obj/tools/MGtool/toolcmd.c
index aca4d87..4598ba6 100644
--- a/obj/tools/MGtool/toolcmd.c
+++ b/obj/tools/MGtool/toolcmd.c
@@ -85,10 +85,9 @@
 
 int Xcallouts(string str)
 {
-  object obj;
-  mixed callouts, args;
-  string fun, tmp, file;
-  int delay, i, s;
+  mixed callouts;
+  string tmp, file;
+  int i, s;
   
   SECURE2(TRUE);
   TK("Xcallouts: str: "+(str?str:"(NULL)"));
@@ -139,7 +138,6 @@
 int Xcat(string str)
 {
   string *tmp,file;
-  int s;
 
   SECURE2(TRUE);
   TK("Xcat: str: "+str);
@@ -734,9 +732,8 @@
 
 int Xhbeats(string str)
 {
-  object obj;
   object *hbeatinfo;
-  string tmp, file;
+  string tmp;
   int i, s;
   
   SECURE2(TRUE);
@@ -944,7 +941,6 @@
 
 int Xlag(string str)
 {
-  int i;
   float *lag;
   object daemon;
   string lags;
@@ -964,7 +960,7 @@
 
 int Xlight(string str)
 {
-  int s, addlight;
+  int addlight;
 
   SECURE2(TRUE);
   USAGE1(str, "xli(ght) [light]");
@@ -982,9 +978,9 @@
 
 int Xload(string str)
 {
-  int i, f;
+  int i;
   object obj, *inv, vroom;
-  string file, errlog, error, *strs;
+  string file, errlog, error;
   
   SECURE2(TRUE);
   USAGE2(str, "xloa(d) <filename>");
@@ -1029,7 +1025,6 @@
 int Xlook(string str)
 {
   object obj;
-  string st;
   string file;
   
   SECURE2(TRUE);
@@ -1263,7 +1258,6 @@
 
 int Xproc(string str)
 {
-  int s;
   string *strs;
 
   SECURE2(TRUE);
@@ -1275,14 +1269,14 @@
     return TRUE;
   }
   
-  if(!str||str==""||!(s=sizeof(strs=old_explode(str, " "))))
+  if(!str||str==""||!(sizeof(strs=old_explode(str, " "))))
   {
     WLN("Load averages:");
     cat(TOOL_PATH+"/proc/loadavg");
     return TRUE;
   }
   
-  while(s=sizeof(strs))
+  while(sizeof(strs))
   {
     switch(strs[0])
     {
@@ -1401,7 +1395,7 @@
 
 int Xprops(string str)
 {
-  int i, s, flag;
+  int flag;
   object obj;
   string *tmp;
   
@@ -1458,7 +1452,6 @@
 
 int Xset(string str)
 {
-  int i;
   mixed obj;
   string name, tmp;
   
@@ -1671,7 +1664,6 @@
 	else
 	  obj->update_tool(AUTOLOAD_ARGS, cloner);
 	return TRUE;
-	break;
 	case "first=on":
 	MODE_ON(MODE_FIRST);
 	move(cloner);
@@ -1949,15 +1941,14 @@
 int cmdavg_compare(string a, string b)
 {
   int x,y;
-  string dum;
-  sscanf(a,"%s cmdavg: %d",dum,x);
-  sscanf(b,"%s cmdavg: %d",dum,y);
+  sscanf(a,"%~s cmdavg: %d",x);
+  sscanf(b,"%~s cmdavg: %d",y);
   return x==y?0:(x>y?1:-1);
 }
 
 int Xwho(string opt)
 {
-  string *strs,str,func;
+  string *strs,func;
   
   SECURE2(TRUE);
   TK("Xwho: opt: \""+opt+"\"");
diff --git a/obj/tools/MGtool/toollib.c b/obj/tools/MGtool/toollib.c
index 8891232..709795d 100644
--- a/obj/tools/MGtool/toollib.c
+++ b/obj/tools/MGtool/toollib.c
@@ -36,7 +36,6 @@
 string short_path(string file)
 {
   int s;
-  string tmp;
   
   if(!file)
     return 0;
