diff --git a/src/lib9/dial.c b/src/lib9/dial.c
index fa19cce..99d3799 100644
--- a/src/lib9/dial.c
+++ b/src/lib9/dial.c
@@ -12,6 +12,7 @@
 
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <netinet/tcp.h>
 #include <sys/un.h>
 #include <netdb.h>
 
@@ -68,6 +69,10 @@
 		close(s);
 		return -1;
 	}
+	if(proto == SOCK_STREAM){
+		int one = 1;
+		setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&one, sizeof one);
+	}
 	return s;
 
 Unix:
diff --git a/src/libcomplete/complete.c b/src/libcomplete/complete.c
new file mode 100644
index 0000000..3a06447
--- /dev/null
+++ b/src/libcomplete/complete.c
@@ -0,0 +1,139 @@
+#include <u.h>
+#include <libc.h>
+#include "complete.h"
+
+static int
+longestprefixlength(char *a, char *b, int n)
+{
+	int i, w;
+	Rune ra, rb;
+
+	for(i=0; i<n; i+=w){
+		w = chartorune(&ra, a);
+		chartorune(&rb, b);
+		if(ra != rb)
+			break;
+		a += w;
+		b += w;
+	}
+	return i;
+}
+
+void
+freecompletion(Completion *c)
+{
+	if(c){
+		free(c->filename);
+		free(c);
+	}
+}
+
+static int
+strpcmp(const void *va, const void *vb)
+{
+	char *a, *b;
+
+	a = *(char**)va;
+	b = *(char**)vb;
+	return strcmp(a, b);
+}
+
+Completion*
+complete(char *dir, char *s)
+{
+	long i, l, n, nmatch, len, nbytes;
+	int fd, minlen;
+	Dir *dirp;
+	char **name, *p;
+	ulong* mode;
+	Completion *c;
+
+	if(strchr(s, '/') != nil){
+		werrstr("slash character in name argument to complete()");
+		return nil;
+	}
+
+	fd = open(dir, OREAD);
+	if(fd < 0)
+		return nil;
+
+	n = dirreadall(fd, &dirp);
+	if(n <= 0)
+		return nil;
+
+	/* find longest string, for allocation */
+	len = 0;
+	for(i=0; i<n; i++){
+		l = strlen(dirp[i].name) + 1 + 1; /* +1 for /   +1 for \0 */
+		if(l > len)
+			len = l;
+	}
+
+	name = malloc(n*sizeof(char*));
+	mode = malloc(n*sizeof(ulong));
+	c = malloc(sizeof(Completion) + len);
+	if(name == nil || mode == nil || c == nil)
+		goto Return;
+	memset(c, 0, sizeof(Completion));
+
+	/* find the matches */
+	len = strlen(s);
+	nmatch = 0;
+	minlen = 1000000;
+	for(i=0; i<n; i++)
+		if(strncmp(s, dirp[i].name, len) == 0){
+			name[nmatch] = dirp[i].name;
+			mode[nmatch] = dirp[i].mode;
+			if(minlen > strlen(dirp[i].name))
+				minlen = strlen(dirp[i].name);
+			nmatch++;
+		}
+
+	if(nmatch > 0) {
+		/* report interesting results */
+		/* trim length back to longest common initial string */
+		for(i=1; i<nmatch; i++)
+			minlen = longestprefixlength(name[0], name[i], minlen);
+
+		/* build the answer */
+		c->complete = (nmatch == 1);
+		c->advance = c->complete || (minlen > len);
+		c->string = (char*)(c+1);
+		memmove(c->string, name[0]+len, minlen-len);
+		if(c->complete)
+			c->string[minlen++ - len] = (mode[0]&DMDIR)? '/' : ' ';
+		c->string[minlen - len] = '\0';
+	} else {
+		/* no match, so return all possible strings */
+		for(i=0; i<n; i++){
+			name[i] = dirp[i].name;
+			mode[i] = dirp[i].mode;
+		}
+		nmatch = n;
+	}
+
+	/* attach list of names */
+	nbytes = nmatch * sizeof(char*);
+	for(i=0; i<nmatch; i++)
+		nbytes += strlen(name[i]) + 1 + 1;
+	c->filename = malloc(nbytes);
+	if(c->filename == nil)
+		goto Return;
+	p = (char*)(c->filename + nmatch);
+	for(i=0; i<nmatch; i++){
+		c->filename[i] = p;
+		strcpy(p, name[i]);
+		p += strlen(p);
+		if(mode[i] & DMDIR)
+			*p++ = '/';
+		*p++ = '\0';
+	}
+	c->nfile = nmatch;
+	qsort(c->filename, c->nfile, sizeof(c->filename[0]), strpcmp);
+
+  Return:
+	free(name);
+	free(mode);
+	free(dirp);
+	return c;
+}
diff --git a/src/libcomplete/mkfile b/src/libcomplete/mkfile
new file mode 100644
index 0000000..233dbef
--- /dev/null
+++ b/src/libcomplete/mkfile
@@ -0,0 +1,10 @@
+PLAN9=../..
+<$PLAN9/src/mkhdr
+
+LIB=libcomplete.a
+OFILES=\
+	complete.$O\
+
+HFILES=$PLAN9/include/complete.h
+
+<$PLAN9/src/mksyslib
diff --git a/src/libdraw/openfont.c b/src/libdraw/openfont.c
index 0b3dc25..a359327 100644
--- a/src/libdraw/openfont.c
+++ b/src/libdraw/openfont.c
@@ -19,6 +19,7 @@
 		if(nambuf == nil)
 			return 0;
 		if((fd = open(nambuf, OREAD)) < 0){
+fprint(2, "failed at %s\n", nambuf);
 			free(nambuf);
 			return 0;
 		}
diff --git a/src/libthread/iocall.c b/src/libthread/iocall.c
index d9cf9d0..0577f8a 100644
--- a/src/libthread/iocall.c
+++ b/src/libthread/iocall.c
@@ -3,6 +3,7 @@
 long
 iocall(Ioproc *io, long (*op)(va_list*), ...)
 {
+	char e[ERRMAX];
 	int ret, inted;
 	Ioproc *msg;
 
@@ -39,11 +40,13 @@
 	va_end(io->arg);
 	ret = io->ret;
 	if(ret < 0)
-		errstr(io->err, sizeof io->err);
+		strecpy(e, e+sizeof e, io->err);
 	io->inuse = 0;
 
 	/* release resources */
 	while(send(io->creply, &io) == -1)
 		;
+	if(ret < 0)
+		errstr(e, sizeof e);
 	return ret;
 }
diff --git a/src/libthread/iodial.c b/src/libthread/iodial.c
index 8171156..2e45cfe 100644
--- a/src/libthread/iodial.c
+++ b/src/libthread/iodial.c
@@ -4,14 +4,17 @@
 _iodial(va_list *arg)
 {
 	char *addr, *local, *dir;
-	int *cdfp;
+	int *cdfp, fd;
 
 	addr = va_arg(*arg, char*);
 	local = va_arg(*arg, char*);
 	dir = va_arg(*arg, char*);
 	cdfp = va_arg(*arg, int*);
 
-	return dial(addr, local, dir, cdfp);
+fprint(2, "before dial\n");
+	fd = dial(addr, local, dir, cdfp);
+fprint(2, "after dial\n");
+	return fd;
 }
 
 int
diff --git a/src/libthread/iowrite.c b/src/libthread/iowrite.c
index 664a84b..593224c 100644
--- a/src/libthread/iowrite.c
+++ b/src/libthread/iowrite.c
@@ -5,13 +5,14 @@
 {
 	int fd;
 	void *a;
-	long n;
+	long n, nn;
 
 	fd = va_arg(*arg, int);
 	a = va_arg(*arg, void*);
 	n = va_arg(*arg, long);
-	n = write(fd, a, n);
-	return n;
+	nn = write(fd, a, n);
+fprint(2, "_iowrite %d %d %r\n", n, nn);
+	return nn;
 }
 
 long
diff --git a/src/libthread/mkfile b/src/libthread/mkfile
index 739aaf8..8854cde 100644
--- a/src/libthread/mkfile
+++ b/src/libthread/mkfile
@@ -16,10 +16,12 @@
 	id.$O\
 	iocall.$O\
 	ioclose.$O\
+	iodial.$O\
 	ioopen.$O\
 	ioproc.$O\
 	ioread.$O\
 	ioreadn.$O\
+	iosleep.$O\
 	iowrite.$O\
 	kill.$O\
 	lib.$O\
diff --git a/src/libthread/note.c b/src/libthread/note.c
index b25f2b2..1136156 100644
--- a/src/libthread/note.c
+++ b/src/libthread/note.c
@@ -92,7 +92,7 @@
 //		_exits(_threadexitsallstatus);
 //	}
 
-	if(strcmp(s, "threadint")==0)
+	if(strcmp(s, "threadint")==0 || strcmp(s, "interrupt")==0)
 		noted(NCONT);
 
 	p = _threadgetproc();
