diff --git a/acid/thread b/acid/thread
index ac4cce8..1bc723c 100644
--- a/acid/thread
+++ b/acid/thread
@@ -1,24 +1,29 @@
 
 defn labpc(l)
 {
-	if objtype == "386" then
-		return longjmp;
-	return *(l+4);
+	complex Label l;
+
+	return l.pc;
 }
 
-defn labsp(l)
+defn label(l)
 {
-	return *l;
+	complex Label l;
+
+	if objtype == "386" then
+		return {"PC", l.pc, "BX", l.bx, "SP", l.sp, "BP", l.bp, "SI", l.si, "DI", l.di};
+	return {};
 }
 
+
 defn labstk(l)
 {
-	_stk(labpc(l), labsp(l), 0, 0);
+	_stk(label(l), 0);
 }
 
 defn lablstk(l)
 {
-	_stk(labpc(l), labsp(l), 0, 1);
+	_stk(label(l), 1);
 }
 
 defn altfmt(A){
@@ -57,8 +62,8 @@
 }
 
 threadignsrc = {
-	"^/sys/src/libc",
-	"^/sys/src/libthread",
+	"plan9/src/libc",
+	"plan9/src/libthread",
 };
 
 defn fnname(a){
@@ -81,32 +86,24 @@
 }
 
 defn threadstkline(T){
-	local stk, frame, pc, pc0, file, lastpc0, s, sym, i, stop;
+	local stk, frame, pc, pc0, file, s, sym, i, stop;
 
-	if T.state == Running then{
-		pc = *PC;
-		stk = strace(*PC, *SP, linkreg(0));
-	}else{
-		pc = labpc(T.sched);
-		stk = strace(labpc(T.sched), labsp(T.sched), 0);
-	}
-	lastpc0 = 0;
-	pc0 = 0;
+	if T.state == Running then
+		stk = strace({});
+	else
+		stk = strace(label(T.sched));
+
 	stop = 0;
 	while stk && !stop do {
+		frame = head stk;
+		stk = tail stk;
+		pc = frame[2];
+		pc0 = frame[0];
 		file = pcfile(pc);
-		if !regexp("^/sys/src/libc/", file)
-		&& !regexp("^/sys/src/libthread/", file) 
+		if !regexp("plan9/src/libc/", file)
+		&& !regexp("plan9/src/libthread/", file) 
 		&& match(file, stkignore)==-1 then
 			stop = 1;
-		else{
-			lastpc0 = pc0;
-			frame = head stk;
-			stk = tail stk;
-			nextframe = head stk;
-			pc = frame[1];
-			pc0 = nextframe[0];
-		}
 	}
 	file = pcfile(pc);
 	s = file+":"+itoa(pcline(pc), "%d");
@@ -165,7 +162,7 @@
 	while T != 0 do{
 		print("\t");
 		thread(T);
-		T = T.nextt;
+		T = (Thread)T.nextt;
 	}
 	setproc(mainpid);
 }
@@ -173,6 +170,7 @@
 defn threads(){
 	local P;
 
+	complex Pqueue _threadpq;
 	P = (Proc)_threadpq.$head;
 	while P != 0 do{
 		if P != (Proc)_threadpq.$head then print("\n");
@@ -184,6 +182,7 @@
 defn stacks(){
 	local P, mainpid;
 
+	stkprefix = "";
 	mainpid = pid;
 	P = (Proc)_threadpq.$head;
 	while P != 0 do{
@@ -195,7 +194,7 @@
 	//	}
 	//	print("threadstks(", P\X, ")\n");
 		threadstks(P);
-		P = P.next;
+		P = (Proc)P.next;
 		print("\n");
 	}
 	setproc(mainpid);
@@ -219,7 +218,7 @@
 			}
 			sp = *(T.sched);
 			print(top-sp\D, "\n");
-			T = T.nextt;
+			T = (Thread)T.nextt;
 		}
 		P = P.next;
 	}
@@ -240,8 +239,8 @@
 	stkprefix = pref+"\t\t";
 	ign = stkignore;
 	stkignore = {
-		"^/sys/src/libthread/",
-		"^/sys/src/libc/(386|arm|alpha|sparc|power|mips)/"
+		"plan9/src/libthread/",
+		"plan9/src/libc/(386|arm|alpha|sparc|power|mips)/"
 	};
 	setproc(P.pid);
 	Tq = (Tqueue)P.threads;
@@ -252,7 +251,7 @@
 		print("\t");
 		thread(T);
 		threadstk(T);
-		T = T.nextt;
+		T = (Thread)T.nextt;
 		print("\n");
 	}
 	setproc(mainpid);
