diff --git a/8253pit.c b/8253pit.c
index 12867fb..1d98dc1 100644
--- a/8253pit.c
+++ b/8253pit.c
@@ -1,7 +1,7 @@
 #include "types.h"
-#include "x86.h"
 #include "defs.h"
 #include "traps.h"
+#include "x86.h"
 
 // Register definitions for the Intel
 // 8253/8254/82C54 Programmable Interval Timer (PIT).
diff --git a/bio.c b/bio.c
index 5d09acf..eba8e02 100644
--- a/bio.c
+++ b/bio.c
@@ -22,11 +22,8 @@
 //     and needs to be written to disk.
 
 #include "types.h"
-#include "param.h"
-#include "x86.h"
-#include "mmu.h"
-#include "proc.h"
 #include "defs.h"
+#include "param.h"
 #include "spinlock.h"
 #include "buf.h"
 
diff --git a/console.c b/console.c
index b1518c0..3e45e3e 100644
--- a/console.c
+++ b/console.c
@@ -1,12 +1,12 @@
 #include "types.h"
-#include "x86.h"
-#include "traps.h"
 #include "defs.h"
+#include "param.h"
+#include "traps.h"
 #include "spinlock.h"
 #include "dev.h"
-#include "param.h"
 #include "mmu.h"
 #include "proc.h"
+#include "x86.h"
 #include "kbd.h"
 
 #define CRTPORT 0x3d4
diff --git a/cuth b/cuth
new file mode 100755
index 0000000..cce8c0c
--- /dev/null
+++ b/cuth
@@ -0,0 +1,48 @@
+#!/usr/bin/perl
+
+$| = 1;
+
+sub writefile($@){
+	my ($file, @lines) = @_;
+	
+	sleep(1);
+	open(F, ">$file") || die "open >$file: $!";
+	print F @lines;
+	close(F);
+}
+
+# Cut out #include lines that don't contribute anything.
+for($i=0; $i<@ARGV; $i++){
+	$file = $ARGV[$i];
+	if(!open(F, $file)){
+		print STDERR "open $file: $!\n";
+		next;
+	}
+	@lines = <F>;
+	close(F);
+	
+	$obj = "$file.o";
+	$obj =~ s/\.c\.o$/.o/;
+	system("touch $file");
+
+	if(system("make CC='gcc -Werror' $obj >/dev/null 2>\&1") != 0){
+		print STDERR "make $obj failed: $rv\n";
+		next;
+	}
+
+	system("cp $file =$file");
+	for($j=@lines-1; $j>=0; $j--){
+		if($lines[$j] =~ /^#include/){
+			$old = $lines[$j];
+			$lines[$j] = "/* CUT-H */\n";
+			writefile($file, @lines);
+			if(system("make CC='gcc -Werror' $obj >/dev/null 2>\&1") != 0){
+				$lines[$j] = $old;
+			}else{
+				print STDERR "$file $old";
+			}
+		}
+	}
+	writefile($file, grep {!/CUT-H/} @lines);
+	system("rm =$file");
+}
diff --git a/exec.c b/exec.c
index 9f06605..5905c16 100644
--- a/exec.c
+++ b/exec.c
@@ -4,7 +4,6 @@
 #include "proc.h"
 #include "defs.h"
 #include "x86.h"
-#include "fs.h"
 #include "elf.h"
 
 int
diff --git a/file.c b/file.c
index 273ba2a..7f17b65 100644
--- a/file.c
+++ b/file.c
@@ -1,15 +1,9 @@
 #include "types.h"
-#include "stat.h"
-#include "param.h"
-#include "x86.h"
-#include "mmu.h"
-#include "proc.h"
 #include "defs.h"
+#include "param.h"
 #include "file.h"
 #include "spinlock.h"
 #include "dev.h"
-#include "fs.h"
-#include "fsvar.h"
 
 struct devsw devsw[NDEV];
 struct spinlock file_table_lock;
diff --git a/fs.c b/fs.c
index fb82f91..e92ffda 100644
--- a/fs.c
+++ b/fs.c
@@ -11,12 +11,11 @@
 // are in sysfile.c.
 
 #include "types.h"
-#include "stat.h"
+#include "defs.h"
 #include "param.h"
-#include "x86.h"
+#include "stat.h"
 #include "mmu.h"
 #include "proc.h"
-#include "defs.h"
 #include "spinlock.h"
 #include "buf.h"
 #include "fs.h"
diff --git a/ide.c b/ide.c
index 092b8ce..aa8fe29 100644
--- a/ide.c
+++ b/ide.c
@@ -1,10 +1,10 @@
 // Simple PIO-based (non-DMA) IDE driver code.
 
 #include "types.h"
+#include "defs.h"
 #include "param.h"
 #include "mmu.h"
 #include "proc.h"
-#include "defs.h"
 #include "x86.h"
 #include "traps.h"
 #include "spinlock.h"
diff --git a/init.c b/init.c
index e873f3b..d3e1182 100644
--- a/init.c
+++ b/init.c
@@ -1,7 +1,6 @@
 #include "types.h"
 #include "stat.h"
 #include "user.h"
-#include "fs.h"
 #include "fcntl.h"
 
 // init: The initial user-level program
diff --git a/ioapic.c b/ioapic.c
index a009ca8..8da3151 100644
--- a/ioapic.c
+++ b/ioapic.c
@@ -2,9 +2,7 @@
 // http://www.intel.com/design/chipsets/datashts/29056601.pdf
 
 #include "types.h"
-#include "mp.h"
 #include "defs.h"
-#include "x86.h"
 #include "traps.h"
 
 #define IOAPIC  0xFEC00000   // Default physical address of IO APIC
diff --git a/kalloc.c b/kalloc.c
index eb78212..e0b9765 100644
--- a/kalloc.c
+++ b/kalloc.c
@@ -5,12 +5,9 @@
 // One reason the page size is 4k is that the x86 segment size
 // granularity is 4k.
 
-#include "param.h"
 #include "types.h"
 #include "defs.h"
 #include "param.h"
-#include "mmu.h"
-#include "proc.h"
 #include "spinlock.h"
 
 struct spinlock kalloc_lock;
diff --git a/lapic.c b/lapic.c
index 6afc3b8..5df4f86 100644
--- a/lapic.c
+++ b/lapic.c
@@ -2,12 +2,7 @@
 // See Chapter 8 & Appendix C of Intel processor manual volume 3.
 
 #include "types.h"
-#include "defs.h"
-#include "param.h"
-#include "x86.h"
 #include "traps.h"
-#include "mmu.h"
-#include "proc.h"
 
 // Local APIC registers, divided by 4 for use as uint[] indices.
 #define ID      (0x0020/4)   // ID
diff --git a/main.c b/main.c
index a8b3f62..570c164 100644
--- a/main.c
+++ b/main.c
@@ -1,23 +1,15 @@
 #include "types.h"
+#include "defs.h"
 #include "param.h"
 #include "mmu.h"
 #include "proc.h"
-#include "defs.h"
 #include "x86.h"
-#include "traps.h"
-#include "syscall.h"
-#include "elf.h"
-#include "param.h"
-#include "spinlock.h"
 
 extern char edata[], end[];
 
 void bootothers(void);
 
 // Bootstrap processor starts running C code here.
-// This is called main0 not main so that it can have
-// a void return type.  Gcc can't handle functions named
-// main that don't return int.  Really.
 void
 main0(void)
 {
@@ -39,7 +31,7 @@ main0(void)
   asm volatile("movl %0, %%ebp" : : "r" (cpus[bcpu].mpstack+MPSTACK));
 
   lapic_init(bcpu);
-  cprintf("\\ncpu%d: starting xv6\\n\\n", cpu());
+  cprintf("\ncpu%d: starting xv6\n\n", cpu());
 
   pinit();         // process table
   binit();         // buffer cache
@@ -69,7 +61,7 @@ main0(void)
 void
 mpmain(void)
 {
-  cprintf("cpu%d: starting\\n", cpu());
+  cprintf("cpu%d: starting\n", cpu());
   idtinit();
   lapic_init(cpu());
   setupsegs(0);
diff --git a/mkfs.c b/mkfs.c
index b367f61..32bf4e7 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -5,7 +5,6 @@
 #include <fcntl.h>
 #include <assert.h>
 #include "types.h"
-#include "param.h"
 #include "fs.h"
 
 int nblocks = 995;
@@ -55,7 +54,7 @@ int
 main(int argc, char *argv[])
 {
   int i, cc, fd;
-  uint bn, rootino, inum, off;
+  uint rootino, inum, off;
   struct dirent de;
   char buf[512];
   struct dinode din;
diff --git a/mp.c b/mp.c
index edd85df..563a401 100644
--- a/mp.c
+++ b/mp.c
@@ -1,11 +1,10 @@
 // http://developer.intel.com/design/pentium/datashts/24201606.pdf
 
 #include "types.h"
-#include "mp.h"
 #include "defs.h"
 #include "param.h"
+#include "mp.h"
 #include "x86.h"
-#include "traps.h"
 #include "mmu.h"
 #include "proc.h"
 
diff --git a/picirq.c b/picirq.c
index b7d0116..7c5f713 100644
--- a/picirq.c
+++ b/picirq.c
@@ -1,7 +1,6 @@
 #include "types.h"
 #include "x86.h"
 #include "traps.h"
-#include "defs.h"
 
 // I/O Addresses of the two 8259A programmable interrupt controllers
 #define IO_PIC1         0x20    // Master (IRQs 0-7)
diff --git a/pipe.c b/pipe.c
index cd27cbf..83afb35 100644
--- a/pipe.c
+++ b/pipe.c
@@ -1,9 +1,8 @@
 #include "types.h"
+#include "defs.h"
 #include "param.h"
-#include "x86.h"
 #include "mmu.h"
 #include "proc.h"
-#include "defs.h"
 #include "file.h"
 #include "spinlock.h"
 
diff --git a/proc.c b/proc.c
index 776c8b4..eb7d1f8 100644
--- a/proc.c
+++ b/proc.c
@@ -1,10 +1,9 @@
 #include "types.h"
+#include "defs.h"
+#include "param.h"
 #include "mmu.h"
 #include "x86.h"
-#include "param.h"
-#include "file.h"
 #include "proc.h"
-#include "defs.h"
 #include "spinlock.h"
 
 struct spinlock proc_table_lock;
diff --git a/sh.c b/sh.c
index 1b517ef..205b445 100644
--- a/sh.c
+++ b/sh.c
@@ -1,7 +1,6 @@
 #include "types.h"
 #include "stat.h"
 #include "user.h"
-#include "fs.h"
 #include "fcntl.h"
 
 #define BUFSIZ  512
diff --git a/spinlock.c b/spinlock.c
index af0c2e9..236235c 100644
--- a/spinlock.c
+++ b/spinlock.c
@@ -2,9 +2,9 @@
 
 #include "types.h"
 #include "defs.h"
+#include "param.h"
 #include "x86.h"
 #include "mmu.h"
-#include "param.h"
 #include "proc.h"
 #include "spinlock.h"
 
diff --git a/string.c b/string.c
index 2f9fc25..5720245 100644
--- a/string.c
+++ b/string.c
@@ -1,5 +1,4 @@
 #include "types.h"
-#include "defs.h"
 
 void*
 memset(void *dst, int c, uint n)
diff --git a/syscall.c b/syscall.c
index 9fed725..bc6c316 100644
--- a/syscall.c
+++ b/syscall.c
@@ -1,19 +1,10 @@
 #include "types.h"
-#include "stat.h"
+#include "defs.h"
 #include "param.h"
 #include "mmu.h"
 #include "proc.h"
-#include "defs.h"
 #include "x86.h"
-#include "traps.h"
 #include "syscall.h"
-#include "spinlock.h"
-#include "buf.h"
-#include "fs.h"
-#include "fsvar.h"
-#include "elf.h"
-#include "file.h"
-#include "fcntl.h"
 
 // User code makes a system call with INT T_SYSCALL.
 // System call number in %eax.
diff --git a/sysfile.c b/sysfile.c
index 105fb48..71b8785 100644
--- a/sysfile.c
+++ b/sysfile.c
@@ -1,14 +1,9 @@
 #include "types.h"
-#include "stat.h"
+#include "defs.h"
 #include "param.h"
+#include "stat.h"
 #include "mmu.h"
 #include "proc.h"
-#include "defs.h"
-#include "x86.h"
-#include "traps.h"
-#include "syscall.h"
-#include "spinlock.h"
-#include "buf.h"
 #include "fs.h"
 #include "fsvar.h"
 #include "file.h"
diff --git a/sysproc.c b/sysproc.c
index 48fbe37..b769216 100644
--- a/sysproc.c
+++ b/sysproc.c
@@ -1,19 +1,8 @@
 #include "types.h"
-#include "stat.h"
+#include "defs.h"
 #include "param.h"
 #include "mmu.h"
 #include "proc.h"
-#include "defs.h"
-#include "x86.h"
-#include "traps.h"
-#include "syscall.h"
-#include "spinlock.h"
-#include "buf.h"
-#include "fs.h"
-#include "fsvar.h"
-#include "elf.h"
-#include "file.h"
-#include "fcntl.h"
 
 int
 sys_fork(void)
diff --git a/trap.c b/trap.c
index e045aed..5955cfc 100644
--- a/trap.c
+++ b/trap.c
@@ -1,11 +1,10 @@
 #include "types.h"
+#include "defs.h"
 #include "param.h"
 #include "mmu.h"
 #include "proc.h"
-#include "defs.h"
 #include "x86.h"
 #include "traps.h"
-#include "syscall.h"
 #include "spinlock.h"
 
 // Interrupt descriptor table (shared by all CPUs).
diff --git a/umalloc.c b/umalloc.c
index 30f970d..401ee6a 100644
--- a/umalloc.c
+++ b/umalloc.c
@@ -3,8 +3,8 @@
 #include "user.h"
 #include "param.h"
 
-// Memory allocator by Kernighan and Ritchie, The C programming Language,
-// 2nd ed.  Section 8.7.
+// Memory allocator by Kernighan and Ritchie,
+// The C programming Language, 2nd ed.  Section 8.7.
 
 typedef long Align;
 
diff --git a/zombie.c b/zombie.c
index 07ad798..077c02c 100644
--- a/zombie.c
+++ b/zombie.c
@@ -8,8 +8,6 @@
 int
 main(void)
 {
-  int i;
-
   if(fork() > 0)
     sleep(5);  // Let child exit before parent.
   exit();