Index: tests/concurrent/.expect/ctor-check.txt
===================================================================
--- tests/concurrent/.expect/ctor-check.txt	(revision f57f6ea0123dde6ef60d03a36bc14b98636c0d45)
+++ tests/concurrent/.expect/ctor-check.txt	(revision 473d1da0d5ef74775e6169cdebec373109e9769d)
@@ -2,5 +2,5 @@
 ?{}: function
 ... with parameters
-  lvalue reference to instance of struct Empty with body
+  this: lvalue reference to instance of struct Empty with body
 ... returning nothing
  with body
Index: tests/concurrent/.expect/semaphore.txt
===================================================================
--- tests/concurrent/.expect/semaphore.txt	(revision f57f6ea0123dde6ef60d03a36bc14b98636c0d45)
+++ 	(revision )
@@ -1,3 +1,0 @@
-Starting
-Done!
-Match!
Index: tests/concurrent/.expect/spinaphore.txt
===================================================================
--- tests/concurrent/.expect/spinaphore.txt	(revision f57f6ea0123dde6ef60d03a36bc14b98636c0d45)
+++ 	(revision )
@@ -1,3 +1,0 @@
-Starting
-Done!
-Match!
Index: tests/concurrent/preempt.cfa
===================================================================
--- tests/concurrent/preempt.cfa	(revision f57f6ea0123dde6ef60d03a36bc14b98636c0d45)
+++ tests/concurrent/preempt.cfa	(revision 473d1da0d5ef74775e6169cdebec373109e9769d)
@@ -1,2 +1,3 @@
+#include <fstream.hfa>
 #include <kernel.hfa>
 #include <thread.hfa>
@@ -25,12 +26,15 @@
 thread worker_t {
 	int value;
+	unsigned spin;
 };
 
 void ?{}( worker_t & this, int value ) {
 	this.value = value;
+	this.spin = 0;
 }
 
 void main(worker_t & this) {
 	while(TEST(counter < N)) {
+		if(this.spin > 100_000_000) abort | "Worker" | this.value | "has been spinning too long! (" | this.spin | ")";
 		__cfaabi_check_preemption();
 		if( (counter % 7) == this.value ) {
@@ -40,7 +44,9 @@
 			if( (next % 100) == 0 ) printf("%d\n", (int)next);
 			__cfaabi_check_preemption();
+			this.spin = 0;
 		}
 		__cfaabi_check_preemption();
 		KICK_WATCHDOG;
+		this.spin++;
 	}
 }
Index: tests/concurrent/semaphore.cfa
===================================================================
--- tests/concurrent/semaphore.cfa	(revision f57f6ea0123dde6ef60d03a36bc14b98636c0d45)
+++ 	(revision )
@@ -1,78 +1,0 @@
-#include <fstream.hfa>
-#include <locks.hfa>
-#include <thread.hfa>
-#include <mutex_stmt.hfa>
-
-enum { num_blockers = 17, num_unblockers = 13 };
-
-void thrash() {
-	unsigned t[100];
-	for(i; 100) {
-		t[i] = 0xDEADBEEF;
-	}
-}
-
-ThreadBenaphore ben;
-
-// const unsigned int num_blocks = 25000;
-const unsigned int num_blocks = 5;
-
-thread Blocker {
-	size_t sum;
-};
-
-void main(Blocker & this) {
-	thread$ * me = active_thread();
-	this.sum = 0;
-	for(num_blocks) {
-		this.sum += (unsigned)me;
-		thrash();
-		P(ben);
-		if(((thread&)this).seqable.next != 0p) mutex(sout) sout | "Link not invalidated";
-		thrash();
-	}
-}
-
-thread Unblocker {
-	size_t sum;
-};
-
-void main(Unblocker & this) {
-	this.sum = 0;
-	LOOP: for() {
-		waitfor( ^?{} : this) {
-			break LOOP;
-		}
-		or else {}
-
-		thread$ * t = V(ben, false);
-		if(t) {
-			this.sum += (unsigned)t;
-			unpark(t);
-		}
-		yield(random(10));
-	}
-}
-
-int main() {
-	size_t usum = 0;
-	size_t bsum = 0;
-
-	sout | "Starting";
-	{
-		Blocker   blockers  [num_blockers  ];
-		Unblocker unblockers[num_unblockers];
-
-		for(i;num_blockers) {
-			bsum += join(blockers[i]).sum;
-		}
-
-		sout | "Done!";
-
-		for(i;num_unblockers) {
-			usum += join(unblockers[i]).sum;
-		}
-	}
-	if(bsum == usum) sout | "Match!";
-	else sout | "No Match!" | usum | "!=" | bsum;
-}
Index: tests/concurrent/spinaphore.cfa
===================================================================
--- tests/concurrent/spinaphore.cfa	(revision f57f6ea0123dde6ef60d03a36bc14b98636c0d45)
+++ 	(revision )
@@ -1,94 +1,0 @@
-#include <fstream.hfa>
-#include <locks.hfa>
-#include <thread.hfa>
-
-enum { num_blockers = 17, num_unblockers = 13 };
-
-void thrash() {
-	unsigned t[100];
-	for(i; 100) {
-		t[i] = 0xDEADBEEF;
-	}
-}
-
-Semaphore0nary sem;
-
-const unsigned int num_blocks = 1625;
-
-thread Blocker {
-	size_t sum;
-};
-void main(Blocker & this);
-
-Blocker * from_thread(thread$ * t) {
-	Blocker & nullb = *(Blocker*)0p;
-	thread$ & nullt = (thread&)nullb;
-	uintptr_t offset  = (uintptr_t)&nullt;
-	uintptr_t address = ((uintptr_t)t) - offset;
-	return (Blocker*)address;
-}
-
-void main(Blocker & this) {
-	thread$ * me = active_thread();
-	Blocker * me1 = &this;
-	Blocker * me2 = from_thread(me);
-	if( me1 != me2 ) sout | "Bad casting!" | me1 | "vs" | me2;
-	this.sum = 0;
-	for(num_blocks) {
-		P(sem);
-		if(((thread&)this).seqable.next != 0p) sout | "Link not invalidated";
-	}
-}
-
-const unsigned int num_unblocks = 2125;
-
-thread Unblocker {
-	size_t sum;
-};
-
-void main(Unblocker & this) {
-	this.sum = 0;
-	unsigned me = (unsigned)(uintptr_t)&this;
-	for(num_unblocks) {
-		thread$ * t = V(sem, false);
-		Blocker * b = from_thread(t);
-		b->sum += me;
-		this.sum += (unsigned)(uintptr_t)b;
-		unpark(t);
-		yield(random(10));
-	}
-}
-
-int main() {
-	size_t usum = 0;
-	size_t bsum = 0;
-
-	if((num_unblocks * num_unblockers) != (num_blocks * num_blockers)) sout | "Mismatched Operations: " | (num_unblocks * num_unblockers) | "vs" | (num_blocks * num_blockers);
-
-	sout | "Starting";
-	{
-		Blocker   blockers  [num_blockers  ];
-		Unblocker unblockers[num_unblockers];
-
-		for(i;num_blockers) {
-			for(num_blocks)
-				usum += (unsigned)(uintptr_t)&blockers[i];
-		}
-
-		for(i;num_unblockers) {
-			for(num_unblocks)
-				bsum += (unsigned)(uintptr_t)&unblockers[i];
-		}
-
-		for(i;num_blockers) {
-			bsum -= join(blockers[i]).sum;
-		}
-
-		for(i;num_unblockers) {
-			usum -= join(unblockers[i]).sum;
-		}
-	}
-	sout | "Done!";
-	if(bsum == 0 && usum == 0) sout | "Match!";
-	else sout | "No Match!" | usum | "/" | bsum;
-}
