SunOS can rot in hell.
diff --git a/include/draw.h b/include/draw.h
index 54a566a..4b57934 100644
--- a/include/draw.h
+++ b/include/draw.h
@@ -21,39 +21,35 @@
 extern	int	Rfmt(Fmt*);
 extern	int	Pfmt(Fmt*);
 
-enum
-{
-	DOpaque		= 0xFFFFFFFF,
-	DTransparent	= 0x00000000,		/* only useful for allocimage, memfillcolor */
-	DBlack		= 0x000000FF,
-	DWhite		= 0xFFFFFFFF,
-	DRed		= 0xFF0000FF,
-	DGreen		= 0x00FF00FF,
-	DBlue		= 0x0000FFFF,
-	DCyan		= 0x00FFFFFF,
-	DMagenta		= 0xFF00FFFF,
-	DYellow		= 0xFFFF00FF,
-	DPaleyellow	= 0xFFFFAAFF,
-	DDarkyellow	= 0xEEEE9EFF,
-	DDarkgreen	= 0x448844FF,
-	DPalegreen	= 0xAAFFAAFF,
-	DMedgreen	= 0x88CC88FF,
-	DDarkblue	= 0x000055FF,
-	DPalebluegreen= 0xAAFFFFFF,
-	DPaleblue		= 0x0000BBFF,
-	DBluegreen	= 0x008888FF,
-	DGreygreen	= 0x55AAAAFF,
-	DPalegreygreen	= 0x9EEEEEFF,
-	DYellowgreen	= 0x99994CFF,
-	DMedblue		= 0x000099FF,
-	DGreyblue	= 0x005DBBFF,
-	DPalegreyblue	= 0x4993DDFF,
-	DPurpleblue	= 0x8888CCFF,
+#define 	DOpaque		0xFFFFFFFF
+#define 	DTransparent	0x00000000		/* only useful for allocimage memfillcolor */
+#define 	DBlack		0x000000FF
+#define 	DWhite		0xFFFFFFFF
+#define 	DRed		0xFF0000FF
+#define 	DGreen		0x00FF00FF
+#define 	DBlue		0x0000FFFF
+#define 	DCyan		0x00FFFFFF
+#define 	DMagenta		0xFF00FFFF
+#define 	DYellow		0xFFFF00FF
+#define 	DPaleyellow	0xFFFFAAFF
+#define 	DDarkyellow	0xEEEE9EFF
+#define 	DDarkgreen	0x448844FF
+#define 	DPalegreen	0xAAFFAAFF
+#define 	DMedgreen	0x88CC88FF
+#define 	DDarkblue	0x000055FF
+#define 	DPalebluegreen 0xAAFFFFFF
+#define 	DPaleblue		0x0000BBFF
+#define 	DBluegreen	0x008888FF
+#define 	DGreygreen	0x55AAAAFF
+#define 	DPalegreygreen	0x9EEEEEFF
+#define 	DYellowgreen	0x99994CFF
+#define 	DMedblue		0x000099FF
+#define 	DGreyblue	0x005DBBFF
+#define 	DPalegreyblue	0x4993DDFF
+#define 	DPurpleblue	0x8888CCFF
 
-	DNotacolor	= 0xFFFFFF00,
-	DNofill		= DNotacolor,
-	
-};
+#define 	DNotacolor	0xFFFFFF00
+#define 	DNofill		DNotacolor
 
 enum
 {
diff --git a/src/cmd/9p.c b/src/cmd/9p.c
index 16fa202..e6646b7 100644
--- a/src/cmd/9p.c
+++ b/src/cmd/9p.c
@@ -239,7 +239,7 @@
 		usage();
 
 	fid = xwalk(argv[0]);
-	if((d = fsdirfstat(fid)) < 0)
+	if((d = fsdirfstat(fid)) == 0)
 		sysfatal("dirfstat: %r");
 	fmtinstall('D', dirfmt);
 	fmtinstall('M', dirmodefmt);
diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c
index 50c0cfc..f84ead2 100644
--- a/src/cmd/9term/9term.c
+++ b/src/cmd/9term/9term.c
@@ -214,7 +214,7 @@
 	if(maxtab <= 0)
 		maxtab = 8;
 
-	initdraw(nil, nil, "9term");
+	initdraw(0, nil, "9term");
 	notify(hangupnote);
 
 	mc = initmouse(nil, screen);
@@ -299,13 +299,27 @@
 {
 	Rune r;
 	int i;
-	Alt a[] = {
-		{mc->c, &mc->m, CHANRCV},
-		{kc->c, &r, CHANRCV},
-		{hostc, &i, CHANRCV},
-		{mc->resizec, nil, CHANRCV},
-		{nil, nil, CHANEND},
-	};
+	Alt a[5];
+
+	a[0].c = mc->c;
+	a[0].v = &mc->m;
+	a[0].op = CHANRCV;
+
+	a[1].c = kc->c;
+	a[1].v = &r;
+	a[1].op = CHANRCV;
+
+	a[2].c = hostc;
+	a[2].v = &i;
+	a[2].op = CHANRCV;
+
+	a[3].c = mc->resizec;
+	a[3].v = nil;
+	a[3].op = CHANRCV;
+
+	a[4].c = nil;
+	a[4].v = nil;
+	a[4].op = CHANEND;
 
 	for(;;) {
 		tcheck();
@@ -326,7 +340,7 @@
 			key(r);
 			break;
 		case 2:
-			conswrite(rcbuf[i].data, rcbuf[i].n);
+			conswrite((char*)rcbuf[i].data, rcbuf[i].n);
 			break;
 		case 3:
 			doreshape();
diff --git a/src/cmd/9term/SunOS.c b/src/cmd/9term/SunOS.c
index d7db9fc..d9104ed 100644
--- a/src/cmd/9term/SunOS.c
+++ b/src/cmd/9term/SunOS.c
@@ -1,6 +1,8 @@
-#include "9term.h"
+#include <u.h>
 #include <termios.h>
 #include <sys/termios.h>
+#include <libc.h>
+#include "term.h"
 
 int
 getpts(int fd[], char *slave)
@@ -14,6 +16,19 @@
 	return 0;
 }
 
+int
+childpty(int fd[], char *slave)
+{
+	int sfd;
+
+	close(fd[1]);
+	setsid();
+	sfd = open(slave, ORDWR);
+	if(sfd < 0)
+		sysfatal("open %s: %r\n", slave);
+	return sfd;
+}
+
 struct winsize ows;
 
 void
@@ -26,7 +41,7 @@
 	ws.ws_xpixel = dx;
 	ws.ws_ypixel = dy;
 	if(ws.ws_row != ows.ws_row || ws.ws_col != ows.ws_col)
-	if(ioctl(rcfd[0], TIOCSWINSZ, &ws) < 0)
+	if(ioctl(rcfd, TIOCSWINSZ, &ws) < 0)
 		fprint(2, "ioctl: %r\n");
 	ows = ws;
 }
diff --git a/src/cmd/9term/rcstart.c b/src/cmd/9term/rcstart.c
index df18782..a6a72fe 100644
--- a/src/cmd/9term/rcstart.c
+++ b/src/cmd/9term/rcstart.c
@@ -35,7 +35,12 @@
 		dup(sfd, 0);
 		dup(sfd, 1);
 		dup(sfd, 2);
-		system("stty tabs -onlcr -echo erase ^h intr ^?");
+//		system("stty tabs -onlcr -echo erase '^h' intr '^?'");
+		system("echo tabs; stty tabs");
+		system("echo onlcr; stty -onlcr");
+		system("echo echo; stty -echo");
+		system("echo erase; stty erase '^h'");
+		system("echo intr; stty intr '^?'");
 		execvp(argv[0], argv);
 		fprint(2, "exec %s failed: %r\n", argv[0]);
 		_exits("oops");
diff --git a/src/cmd/9term/win.c b/src/cmd/9term/win.c
index 95d84a3..d1fc5e1 100644
--- a/src/cmd/9term/win.c
+++ b/src/cmd/9term/win.c
@@ -133,10 +133,10 @@
 		name = "gnot";
 
 	threadnotify(nopipes, 1);
-	if((fs = nsmount("acme", "")) < 0)
+	if((fs = nsmount("acme", "")) == 0)
 		sysfatal("nsmount acme: %r");
 	ctlfd = fsopen(fs, "new/ctl", ORDWR|OCEXEC);
-	if(ctlfd < 0 || fsread(ctlfd, buf, 12) != 12)
+	if(ctlfd == 0 || fsread(ctlfd, buf, 12) != 12)
 		sysfatal("ctl: %r");
 	id = atoi(buf);
 	sprint(buf, "%d/tag", id);
diff --git a/src/cmd/acme/addr.c b/src/cmd/acme/addr.c
index d64db61..2a34474 100644
--- a/src/cmd/acme/addr.c
+++ b/src/cmd/acme/addr.c
@@ -64,7 +64,7 @@
 		if(line<0 || line>t->file->b.nc)
 			goto Rescue;
 		*evalp = TRUE;
-		return (Range){line, line};
+		return range(line, line);
 	}
 	q0 = r.q0;
 	q1 = r.q1;
@@ -104,7 +104,7 @@
 			--q0;
 	}
 	*evalp = TRUE;
-	return (Range){q0, q1};
+	return range(q0, q1);
 
     Rescue:
 	if(md != nil)
@@ -197,7 +197,7 @@
 				if(c == '.')
 					r = ar;
 				else
-					r = (Range){t->file->b.nc, t->file->b.nc};
+					r = range(t->file->b.nc, t->file->b.nc);
 			if(q < q1)
 				dir = Fore;
 			else
diff --git a/src/cmd/acme/exec.c b/src/cmd/acme/exec.c
index 0e3389d..3c1aad2 100644
--- a/src/cmd/acme/exec.c
+++ b/src/cmd/acme/exec.c
@@ -106,7 +106,7 @@
 	{ LTab,		tab,		FALSE,	XXX,		XXX		},
 	{ LUndo,		undo,	FALSE,	TRUE,	XXX		},
 	{ LZerox,	zeroxx,	FALSE,	XXX,		XXX		},
-	{ nil, 			nil,		0,		0,		0		},
+	{ nil, 			0,		0,		0,		0		},
 };
 
 Exectab*
diff --git a/src/cmd/acme/fns.h b/src/cmd/acme/fns.h
index c164bb3..3cabc66 100644
--- a/src/cmd/acme/fns.h
+++ b/src/cmd/acme/fns.h
@@ -91,6 +91,7 @@
 void		startplumbing(void);
 
 Runestr	runestr(Rune*, uint);
+Range range(int, int);
 
 #define	runemalloc(a)		(Rune*)emalloc((a)*sizeof(Rune))
 #define	runerealloc(a, b)	(Rune*)erealloc((a), (b)*sizeof(Rune))
diff --git a/src/cmd/acme/fsys.c b/src/cmd/acme/fsys.c
index af4255c..fb4ae5c 100644
--- a/src/cmd/acme/fsys.c
+++ b/src/cmd/acme/fsys.c
@@ -310,7 +310,7 @@
 fsysflush(Xfid *x, Fid *f)
 {
 	USED(f);
-	sendp(x->c, xfidflush);
+	sendp(x->c, (void*)xfidflush);
 	return nil;
 }
 
@@ -526,7 +526,7 @@
 	if(((f->dir->perm&~(DMDIR|DMAPPEND))&m) != m)
 		goto Deny;
 
-	sendp(x->c, xfidopen);
+	sendp(x->c, (void*)xfidopen);
 	return nil;
 
     Deny:
@@ -624,7 +624,7 @@
 		free(b);
 		return x;
 	}
-	sendp(x->c, xfidread);
+	sendp(x->c, (void*)xfidread);
 	return nil;
 }
 
@@ -633,7 +633,7 @@
 fsyswrite(Xfid *x, Fid *f)
 {
 	USED(f);
-	sendp(x->c, xfidwrite);
+	sendp(x->c, (void*)xfidwrite);
 	return nil;
 }
 
@@ -642,7 +642,7 @@
 fsysclunk(Xfid *x, Fid *f)
 {
 	fsysdelid(f->mntdir);
-	sendp(x->c, xfidclose);
+	sendp(x->c, (void*)xfidclose);
 	return nil;
 }
 
diff --git a/src/cmd/acme/look.c b/src/cmd/acme/look.c
index 7023382..f892640 100644
--- a/src/cmd/acme/look.c
+++ b/src/cmd/acme/look.c
@@ -591,7 +591,7 @@
 	e->u.at = t;
 	e->a0 = amin+1;
 	eval = FALSE;
-	address(nil, nil, (Range){-1,-1}, (Range){0, 0}, t, e->a0, amax, tgetc, &eval, (uint*)&e->a1);
+	address(nil, nil, range(-1,-1), range(0,0), t, e->a0, amax, tgetc, &eval, (uint*)&e->a1);
 	return TRUE;
 
    Isntfile:
@@ -723,7 +723,7 @@
 		eval = FALSE;
 	else{
 		eval = TRUE;
-		r = address(nil, t, (Range){-1, -1}, (Range){t->q0, t->q1}, e->u.at, e->a0, e->a1, e->agetc, &eval, &dummy);
+		r = address(nil, t, range(-1,-1), range(t->q0, t->q1), e->u.at, e->a0, e->a1, e->agetc, &eval, &dummy);
 		if(eval == FALSE)
 			e->jump = FALSE;	/* don't jump if invalid address */
 	}
diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c
index c0cd7ec..6c1243c 100644
--- a/src/cmd/acme/text.c
+++ b/src/cmd/acme/text.c
@@ -894,7 +894,7 @@
 		/* horrible botch: while asleep, may have lost selection altogether */
 		if(selectq > t->file->b.nc)
 			selectq = t->org + t->fr.p0;
-		t->fr.scroll = nil;
+		t->fr.scroll = 0;
 		if(selectq < t->org)
 			q0 = selectq;
 		else
diff --git a/src/cmd/acme/util.c b/src/cmd/acme/util.c
index a7307e0..f72a5bf 100644
--- a/src/cmd/acme/util.c
+++ b/src/cmd/acme/util.c
@@ -14,6 +14,16 @@
 static	Point		prevmouse;
 static	Window	*mousew;
 
+Range
+range(int q0, int q1)
+{
+	Range r;
+
+	r.q0 = q0;
+	r.q1 = q1;
+	return r;
+}
+
 Runestr
 runestr(Rune *r, uint n)
 {
diff --git a/src/cmd/acme/xfid.c b/src/cmd/acme/xfid.c
index 839308e..5fc4c5a 100644
--- a/src/cmd/acme/xfid.c
+++ b/src/cmd/acme/xfid.c
@@ -47,7 +47,7 @@
 	threadsetname("xfidctlthread");
 	x = arg;
 	for(;;){
-		f = recvp(x->c);
+		f = (void(*)(Xfid*))recvp(x->c);
 		(*f)(x);
 		flushimage(display, 1);
 		sendp(cxfidfree, x);
@@ -104,8 +104,8 @@
 		switch(q){
 		case QWaddr:
 			if(w->nopen[q]++ == 0){
-				w->addr = (Range){0,0};
-				w->limit = (Range){-1,-1};
+				w->addr = range(0,0);
+				w->limit = range(-1,-1);
 			}
 			break;
 		case QWdata:
@@ -164,7 +164,7 @@
 			seq++;
 			filemark(t->file);
 			cut(t, t, nil, FALSE, TRUE, nil, 0);
-			w->wrselrange = (Range){t->q1, t->q1};
+			w->wrselrange = range(t->q1, t->q1);
 			w->nomark = TRUE;
 			break;
 		case QWeditout:
@@ -173,7 +173,7 @@
 				respond(x, &fc, Eperm);
 				return;
 			}
-			w->wrselrange = (Range){t->q1, t->q1};
+			w->wrselrange = range(t->q1, t->q1);
 			break;
 		}
 		winunlock(w);
diff --git a/src/cmd/dict/ahd.c b/src/cmd/dict/ahd.c
index 18a56d0..7f18ad9 100644
--- a/src/cmd/dict/ahd.c
+++ b/src/cmd/dict/ahd.c
@@ -7,15 +7,19 @@
  * American Heritage Dictionary (encrypted)
  */
 
-static Rune intab[256] = {
-	[0x82] 0xe9,
-	[0x85] 0xe0,
-	[0x89] 0xeb,
-	[0x8a] 0xe8,
-	[0xa4] 0xf1,
-	[0xf8] 0xb0,
-	[0xf9] 0xb7,
-};
+static Rune intab[256];
+
+static void
+initintab(void)
+{
+	intab[0x82] =  0xe9;
+	intab[0x85] =  0xe0;
+	intab[0x89] =  0xeb;
+	intab[0x8a] =  0xe8;
+	intab[0xa4] =  0xf1;
+	intab[0xf8] =  0xb0;
+	intab[0xf9] =  0xb7;
+}
 
 static char	tag[64];
 
@@ -33,6 +37,7 @@
 	int c, state = Run;
 
 	if(!inited){
+		initintab();
 		for(c=0; c<256; c++)
 			if(intab[c] == 0)
 				intab[c] = c;
diff --git a/src/cmd/dict/movie.c b/src/cmd/dict/movie.c
index b191e14..7e42b93 100644
--- a/src/cmd/dict/movie.c
+++ b/src/cmd/dict/movie.c
@@ -67,7 +67,7 @@
 	tagtab[TI]=	"TI";
 	tagtab[TX]=	"TX";
 	tagtab[VD]=	"VD";
-};
+}
 
 static char	*mget(int, char *, char *, char **);
 #if 0
diff --git a/src/cmd/dict/oed.c b/src/cmd/dict/oed.c
index 868eb48..1e1c0c5 100644
--- a/src/cmd/dict/oed.c
+++ b/src/cmd/dict/oed.c
@@ -992,7 +992,7 @@
 static char	auxname[Maxaux][Buflen];
 static char	auxval[Maxaux][Buflen];
 static char	spec[Buflen];
-static uchar	*auxstate[Naux];	/* vals for most recent tag */
+static char	*auxstate[Naux];	/* vals for most recent tag */
 static Entry	curentry;
 #define cursize (curentry.end-curentry.start)
 
@@ -1154,7 +1154,7 @@
 							outchars(auxstate[Num]);
 							outchars(") ");
 						} else if(t == Sgk) {
-							i = grtab[auxstate[Num][0]];
+							i = grtab[(uchar)auxstate[Num][0]];
 							if(i != NONE)
 								outrune(i);
 							outchars(".  ");
diff --git a/src/cmd/grep/grep.y b/src/cmd/grep/grep.y
index 60d8382..fdde683 100644
--- a/src/cmd/grep/grep.y
+++ b/src/cmd/grep/grep.y
@@ -124,7 +124,7 @@
 	exits("syntax");
 }
 
-long
+int
 yylex(void)
 {
 	char *q, *eq;
diff --git a/src/cmd/plumb/fsys.c b/src/cmd/plumb/fsys.c
index 33a4458..0f5bcc8 100644
--- a/src/cmd/plumb/fsys.c
+++ b/src/cmd/plumb/fsys.c
@@ -122,22 +122,25 @@
 static Fcall* fsysstat(Fcall*, uchar*, Fid*);
 static Fcall* fsyswstat(Fcall*, uchar*, Fid*);
 
-Fcall* 	(*fcall[Tmax])(Fcall*, uchar*, Fid*) =
+Fcall* 	(*fcall[Tmax])(Fcall*, uchar*, Fid*);
+
+static void
+initfcall(void)
 {
-	[Tflush]	= fsysflush,
-	[Tversion]	= fsysversion,
-	[Tauth]	= fsysauth,
-	[Tattach]	= fsysattach,
-	[Twalk]	= fsyswalk,
-	[Topen]	= fsysopen,
-	[Tcreate]	= fsyscreate,
-	[Tread]	= fsysread,
-	[Twrite]	= fsyswrite,
-	[Tclunk]	= fsysclunk,
-	[Tremove]= fsysremove,
-	[Tstat]	= fsysstat,
-	[Twstat]	= fsyswstat,
-};
+	fcall[Tflush]	= fsysflush;
+	fcall[Tversion]	= fsysversion;
+	fcall[Tauth]	= fsysauth;
+	fcall[Tattach]	= fsysattach;
+	fcall[Twalk]	= fsyswalk;
+	fcall[Topen]	= fsysopen;
+	fcall[Tcreate]	= fsyscreate;
+	fcall[Tread]	= fsysread;
+	fcall[Twrite]	= fsyswrite;
+	fcall[Tclunk]	= fsysclunk;
+	fcall[Tremove]= fsysremove;
+	fcall[Tstat]	= fsysstat;
+	fcall[Twstat]	= fsyswstat;
+}
 
 char	Ebadfcall[] =	"bad fcall type";
 char	Eperm[] = 	"permission denied";
@@ -208,6 +211,7 @@
 	uchar *buf;
 
 	USED(v);
+	initfcall();
 	t = nil;
 	for(;;){
 		buf = malloc(messagesize);	/* avoid memset of emalloc */
diff --git a/src/cmd/ramfs.c b/src/cmd/ramfs.c
index 2c1658b..e155607 100644
--- a/src/cmd/ramfs.c
+++ b/src/cmd/ramfs.c
@@ -89,21 +89,25 @@
 	*rread(Fid*), *rwrite(Fid*), *rclunk(Fid*),
 	*rremove(Fid*), *rstat(Fid*), *rwstat(Fid*);
 
-char 	*(*fcalls[])(Fid*) = {
-	[Tversion]	rversion,
-	[Tflush]	rflush,
-	[Tauth]	rauth,
-	[Tattach]	rattach,
-	[Twalk]		rwalk,
-	[Topen]		ropen,
-	[Tcreate]	rcreate,
-	[Tread]		rread,
-	[Twrite]	rwrite,
-	[Tclunk]	rclunk,
-	[Tremove]	rremove,
-	[Tstat]		rstat,
-	[Twstat]	rwstat,
-};
+char 	*(*fcalls[Tmax])(Fid*);
+
+static void
+initfcalls(void)
+{
+	fcalls[Tversion]=	rversion;
+	fcalls[Tflush]=	rflush;
+	fcalls[Tauth]=	rauth;
+	fcalls[Tattach]=	rattach;
+	fcalls[Twalk]=		rwalk;
+	fcalls[Topen]=		ropen;
+	fcalls[Tcreate]=	rcreate;
+	fcalls[Tread]=		rread;
+	fcalls[Twrite]=	rwrite;
+	fcalls[Tclunk]=	rclunk;
+	fcalls[Tremove]=	rremove;
+	fcalls[Tstat]=		rstat;
+	fcalls[Twstat]=	rwstat;
+}
 
 char	Eperm[] =	"permission denied";
 char	Enotdir[] =	"not a directory";
@@ -141,6 +145,7 @@
 	int stdio = 0;
 	char *service;
 
+	initfcalls();
 	service = "ramfs";
 	defmnt = "/tmp";
 	ARGBEGIN{
diff --git a/src/cmd/rc/plan9ish.c b/src/cmd/rc/plan9ish.c
index 6b32a22..30fa896 100644
--- a/src/cmd/rc/plan9ish.c
+++ b/src/cmd/rc/plan9ish.c
@@ -216,10 +216,9 @@
 }
 */
 int
-cmpenv(a, b)
-char **a, **b;
+cmpenv(const void *a, const void *b)
 {
-	return strcmp(*a, *b);
+	return strcmp(*(char**)a, *(char**)b);
 }
 char **mkenv(){
 	register char **env, **ep, *p, *q;
@@ -462,7 +461,7 @@
 	interrupted=0;
 }
 int
-Isatty(fd){
+Isatty(int fd){
 	return isatty(fd);
 }
 void Abort(void){
diff --git a/src/cmd/sam/unix.c b/src/cmd/sam/unix.c
index b8a67b9..162ba74 100644
--- a/src/cmd/sam/unix.c
+++ b/src/cmd/sam/unix.c
@@ -1,3 +1,4 @@
+#include <u.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
diff --git a/src/cmd/samterm/plan9.c b/src/cmd/samterm/plan9.c
index f8614d3..feb8957 100644
--- a/src/cmd/samterm/plan9.c
+++ b/src/cmd/samterm/plan9.c
@@ -1,3 +1,4 @@
+#include <u.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <errno.h>
diff --git a/src/lib9/date.c b/src/lib9/date.c
index 8f852de..47abaf3 100644
--- a/src/lib9/date.c
+++ b/src/lib9/date.c
@@ -43,7 +43,7 @@
 	if(bigtm->zone[0] == 0){
 		s = getenv("TIMEZONE");
 		if(s){
-			strecpy(bigtm->zone, bigtm->zone+4, tm->tm_zone);
+			strecpy(bigtm->zone, bigtm->zone+4, s);
 			free(s);
 		}
 	}
diff --git a/src/libdraw/devdraw.c b/src/libdraw/devdraw.c
index f474986..49a641b 100644
--- a/src/libdraw/devdraw.c
+++ b/src/libdraw/devdraw.c
@@ -834,7 +834,7 @@
 					err = "image parameters incompatibile with screen";
 					goto error;
 				}
-				reffn = nil;
+				reffn = 0;
 				switch(refresh){
 				case Refbackup:
 					break;
@@ -985,9 +985,9 @@
 			oy = BGLONG(a+41);
 			op = drawclientop(client);
 			/* high bit indicates arc angles are present */
-			if(ox & (1<<31)){
-				if((ox & (1<<30)) == 0)
-					ox &= ~(1<<31);
+			if(ox & ((ulong)1<<31)){
+				if((ox & ((ulong)1<<30)) == 0)
+					ox &= ~((ulong)1<<31);
 				memarc(dst, p, e0, e1, c, src, sp, ox, oy, op);
 			}else
 				memellipse(dst, p, e0, e1, c, src, sp, op);
diff --git a/src/libdraw/ellipse.c b/src/libdraw/ellipse.c
index 7a063f1..33f67c6 100644
--- a/src/libdraw/ellipse.c
+++ b/src/libdraw/ellipse.c
@@ -56,27 +56,27 @@
 void
 arc(Image *dst, Point c, int a, int b, int thick, Image *src, Point sp, int alpha, int phi)
 {
-	alpha |= 1<<31;
+	alpha |= ((ulong)1)<<31;
 	doellipse('e', dst, &c, a, b, thick, src, &sp, alpha, phi, SoverD);
 }
 
 void
 arcop(Image *dst, Point c, int a, int b, int thick, Image *src, Point sp, int alpha, int phi, Drawop op)
 {
-	alpha |= 1<<31;
+	alpha |= (ulong)1<<31;
 	doellipse('e', dst, &c, a, b, thick, src, &sp, alpha, phi, op);
 }
 
 void
 fillarc(Image *dst, Point c, int a, int b, Image *src, Point sp, int alpha, int phi)
 {
-	alpha |= 1<<31;
+	alpha |= (ulong)1<<31;
 	doellipse('E', dst, &c, a, b, 0, src, &sp, alpha, phi, SoverD);
 }
 
 void
 fillarcop(Image *dst, Point c, int a, int b, Image *src, Point sp, int alpha, int phi, Drawop op)
 {
-	alpha |= 1<<31;
+	alpha |= (ulong)1<<31;
 	doellipse('E', dst, &c, a, b, 0, src, &sp, alpha, phi, op);
 }
diff --git a/src/libdraw/md-draw.c b/src/libdraw/md-draw.c
index d0f2d4f..c8ad2a6 100644
--- a/src/libdraw/md-draw.c
+++ b/src/libdraw/md-draw.c
@@ -1906,7 +1906,7 @@
 	default:
 		assert(0 /* boolcopyfn */);
 	}
-	return nil;
+	return 0;
 }
 
 /*
diff --git a/src/libdraw/ml-lsetrefresh.c b/src/libdraw/ml-lsetrefresh.c
index 44079be..17d04cb 100644
--- a/src/libdraw/ml-lsetrefresh.c
+++ b/src/libdraw/ml-lsetrefresh.c
@@ -29,7 +29,7 @@
 		return 0;
 	/* easiest way is just to update the entire save area */
 	l->refreshfn(i, i->r, l->refreshptr);
-	l->refreshfn = nil;
+	l->refreshfn = 0;
 	l->refreshptr = nil;
 	return 1;
 }
diff --git a/src/libdraw/unix.c b/src/libdraw/unix.c
index 491bc66..76bc75d 100644
--- a/src/libdraw/unix.c
+++ b/src/libdraw/unix.c
@@ -1,6 +1,5 @@
-#include <sys/stat.h>
-
 #include <u.h>
+#include <sys/stat.h>
 #include <libc.h>
 #include <draw.h>
 
diff --git a/src/libdraw/x11-alloc.c b/src/libdraw/x11-alloc.c
index 9a6585c..fa7dddd 100644
--- a/src/libdraw/x11-alloc.c
+++ b/src/libdraw/x11-alloc.c
@@ -1,6 +1,5 @@
-#include "x11-inc.h"
-
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <memdraw.h>
diff --git a/src/libdraw/x11-cload.c b/src/libdraw/x11-cload.c
index 7a84a98..33e3170 100644
--- a/src/libdraw/x11-cload.c
+++ b/src/libdraw/x11-cload.c
@@ -1,6 +1,5 @@
-#include "x11-inc.h"
-
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <memdraw.h>
diff --git a/src/libdraw/x11-draw.c b/src/libdraw/x11-draw.c
index 6373e4e..0a28813 100644
--- a/src/libdraw/x11-draw.c
+++ b/src/libdraw/x11-draw.c
@@ -1,6 +1,5 @@
-#include "x11-inc.h"
-
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <memdraw.h>
diff --git a/src/libdraw/x11-event.c b/src/libdraw/x11-event.c
index ba9d031..0548b62 100644
--- a/src/libdraw/x11-event.c
+++ b/src/libdraw/x11-event.c
@@ -1,6 +1,5 @@
-#include "x11-inc.h"
-
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <cursor.h>
diff --git a/src/libdraw/x11-fill.c b/src/libdraw/x11-fill.c
index 33fc6a2..fc43a68 100644
--- a/src/libdraw/x11-fill.c
+++ b/src/libdraw/x11-fill.c
@@ -1,6 +1,5 @@
-#include "x11-inc.h"
-
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <memdraw.h>
diff --git a/src/libdraw/x11-get.c b/src/libdraw/x11-get.c
index 693b293..395f455 100644
--- a/src/libdraw/x11-get.c
+++ b/src/libdraw/x11-get.c
@@ -1,6 +1,5 @@
-#include "x11-inc.h"
-
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <memdraw.h>
diff --git a/src/libdraw/x11-init.c b/src/libdraw/x11-init.c
index c959eee..c6fc881 100644
--- a/src/libdraw/x11-init.c
+++ b/src/libdraw/x11-init.c
@@ -1,8 +1,8 @@
 /*
  * Some of the stuff in this file is not X-dependent and should be elsewhere.
  */
-#include "x11-inc.h"
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <memdraw.h>
@@ -69,7 +69,8 @@
 static Image*
 getimage0(Display *d)
 {
-	char *a, info[12*12+1];
+	char info[12*12+1];
+	uchar *a;
 	int n;
 	Image *image;
 
@@ -323,7 +324,7 @@
 	name.value = (uchar*)label;
 	name.encoding = XA_STRING;
 	name.format = 8;
-	name.nitems = strlen(name.value);
+	name.nitems = strlen((char*)name.value);
 
 	memset(&normalhint, 0, sizeof normalhint);
 	normalhint.flags = USSize|PMaxSize;
@@ -435,7 +436,7 @@
 	name.value = (uchar*)label;
 	name.encoding = XA_STRING;
 	name.format = 8;
-	name.nitems = strlen(name.value);
+	name.nitems = strlen((char*)name.value);
 
 	memset(&classhint, 0, sizeof classhint);
 	classhint.res_name = label;
diff --git a/src/libdraw/x11-itrans.c b/src/libdraw/x11-itrans.c
index 509b55c..3a74588 100644
--- a/src/libdraw/x11-itrans.c
+++ b/src/libdraw/x11-itrans.c
@@ -1,8 +1,7 @@
 /* input event and data structure translation */
 
-#include "x11-inc.h"
-
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <memdraw.h>
@@ -318,8 +317,8 @@
 
 	fg = _x.map[0];
 	bg = _x.map[255];
-	xsrc = XCreateBitmapFromData(_x.display, _x.drawable, src, 16, 16);
-	xmask = XCreateBitmapFromData(_x.display, _x.drawable, mask, 16, 16);
+	xsrc = XCreateBitmapFromData(_x.display, _x.drawable, (char*)src, 16, 16);
+	xmask = XCreateBitmapFromData(_x.display, _x.drawable, (char*)mask, 16, 16);
 	xc = XCreatePixmapCursor(_x.display, xsrc, xmask, &fg, &bg, -c->offset.x, -c->offset.y);
 	if(xc != 0) {
 		XDefineCursor(_x.display, _x.drawable, xc);
@@ -412,14 +411,14 @@
 		data = nil;
 	}else{
 		if(xdata){
-			data = strdup((char*)xdata);
+			data = (uchar*)strdup((char*)xdata);
 			XFree(xdata);
 		}else
 			data = nil;
 	}
 out:
 	qunlock(&clip.lk);
-	return data;
+	return (char*)data;
 }
 
 void
diff --git a/src/libdraw/x11-keyboard.c b/src/libdraw/x11-keyboard.c
index 83bbbfe..071d16c 100644
--- a/src/libdraw/x11-keyboard.c
+++ b/src/libdraw/x11-keyboard.c
@@ -1,5 +1,5 @@
-#include "x11-inc.h"
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <thread.h>
diff --git a/src/libdraw/x11-load.c b/src/libdraw/x11-load.c
index 5292275..a7446f3 100644
--- a/src/libdraw/x11-load.c
+++ b/src/libdraw/x11-load.c
@@ -1,6 +1,5 @@
-#include "x11-inc.h"
-
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <memdraw.h>
diff --git a/src/libdraw/x11-mouse.c b/src/libdraw/x11-mouse.c
index 6da045b..93f7ecf 100644
--- a/src/libdraw/x11-mouse.c
+++ b/src/libdraw/x11-mouse.c
@@ -1,5 +1,5 @@
-#include "x11-inc.h"
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <thread.h>
diff --git a/src/libdraw/x11-pixelbits.c b/src/libdraw/x11-pixelbits.c
index 22dfc60..5cbdded 100644
--- a/src/libdraw/x11-pixelbits.c
+++ b/src/libdraw/x11-pixelbits.c
@@ -1,6 +1,5 @@
-#include "x11-inc.h"
-
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <memdraw.h>
diff --git a/src/libdraw/x11-unload.c b/src/libdraw/x11-unload.c
index 471ca88..d01a232 100644
--- a/src/libdraw/x11-unload.c
+++ b/src/libdraw/x11-unload.c
@@ -1,6 +1,5 @@
-#include "x11-inc.h"
-
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <memdraw.h>
diff --git a/src/libdraw/x11-wsys.c b/src/libdraw/x11-wsys.c
index e27202f..c996bd3 100644
--- a/src/libdraw/x11-wsys.c
+++ b/src/libdraw/x11-wsys.c
@@ -1,5 +1,5 @@
-#include "x11-inc.h"
 #include <u.h>
+#include "x11-inc.h"
 #include <libc.h>
 #include <draw.h>
 #include <memdraw.h>
diff --git a/src/libfs/wstat.c b/src/libfs/wstat.c
index 90ae0e0..f1f14ea 100644
--- a/src/libfs/wstat.c
+++ b/src/libfs/wstat.c
@@ -24,7 +24,7 @@
 int
 fsdirfwstat(Fid *fid, Dir *d)
 {
-	char *a;
+	uchar *a;
 	int n, nn;
 	Fcall tx, rx;
 
diff --git a/src/libmp/port/dat.h b/src/libmp/port/dat.h
index 7c834ac..50fbf67 100644
--- a/src/libmp/port/dat.h
+++ b/src/libmp/port/dat.h
@@ -1,4 +1,4 @@
-#define	mpdighi  (mpdigit)(1<<(Dbits-1))
+#define	mpdighi  (mpdigit)((ulong)1<<(Dbits-1))
 #define DIGITS(x) ((Dbits - 1 + (x))/Dbits)
 
 // for converting between int's and mpint's
diff --git a/src/libsec/port/x509.c b/src/libsec/port/x509.c
index 7aa0dd7..838c8b4 100644
--- a/src/libsec/port/x509.c
+++ b/src/libsec/port/x509.c
@@ -1593,7 +1593,7 @@
 	(Ints*)&oid_md5,
 	nil
 };
-static DigestFun digestalg[NUMALGS+1] = { md5, md5, md5, md5, sha1, md5, nil };
+static DigestFun digestalg[NUMALGS+1] = { md5, md5, md5, md5, sha1, md5, 0 };
 
 static void
 freecert(CertX509* c)
diff --git a/src/libthread/exec-unix.c b/src/libthread/exec-unix.c
index eb31e99..372923c 100644
--- a/src/libthread/exec-unix.c
+++ b/src/libthread/exec-unix.c
@@ -1,3 +1,4 @@
+#include <u.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include "threadimpl.h"
diff --git a/src/libthread/exit.c b/src/libthread/exit.c
index 4cda307..1f9c26a 100644
--- a/src/libthread/exit.c
+++ b/src/libthread/exit.c
@@ -1,3 +1,4 @@
+#include <u.h>
 #include <signal.h>
 #include "threadimpl.h"
 
diff --git a/src/libthread/ioopen.c b/src/libthread/ioopen.c
index efca4ca..219e581 100644
--- a/src/libthread/ioopen.c
+++ b/src/libthread/ioopen.c
@@ -1,3 +1,4 @@
+#include <u.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include "threadimpl.h"
diff --git a/src/libthread/kill.c b/src/libthread/kill.c
index 31dc3d5..648bd66 100644
--- a/src/libthread/kill.c
+++ b/src/libthread/kill.c
@@ -1,3 +1,4 @@
+#include <u.h>
 #include <signal.h>
 #include "threadimpl.h"
 
diff --git a/src/libthread/main.c b/src/libthread/main.c
index bcab77c..04e6cd9 100644
--- a/src/libthread/main.c
+++ b/src/libthread/main.c
@@ -1,3 +1,4 @@
+#include <u.h>
 #include <signal.h>
 #include "threadimpl.h"
 
diff --git a/src/libthread/note.c b/src/libthread/note.c
index 1136156..de92d48 100644
--- a/src/libthread/note.c
+++ b/src/libthread/note.c
@@ -25,12 +25,12 @@
 	int (*from)(void*, char*), (*to)(void*, char*);
 
 	if(in){
-		from = nil;
+		from = 0;
 		to = f;
 		topid = _threadgetproc()->pid;
 	}else{
 		from = f;
-		to = nil;
+		to = 0;
 		topid = 0;
 	}
 	lock(&onnotelock);