Index: src/tests/concurrent/coroutineYield.c
===================================================================
--- src/tests/concurrent/coroutineYield.c	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/concurrent/coroutineYield.c	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -4,4 +4,6 @@
 #include <thread>
 #include <time>
+
+#include "long_tests.h"
 
 #ifndef PREEMPTION_RATE
@@ -13,5 +15,5 @@
 }
 
-#ifdef LONG_TEST
+#ifdef TEST_LONG
 static const unsigned long N = 600_000ul;
 #else
@@ -33,9 +35,10 @@
 int main(int argc, char* argv[]) {
 	Coroutine c;
-	for(int i = 0; i < N; i++) {
+	for(int i = 0; TEST(i < N); i++) {
 		sout | "Thread 1" | endl;
 		resume(c);
 		sout | "Thread 2" | endl;
 		yield();
+		KICK_WATCHDOG;
 	}
 }
Index: src/tests/concurrent/preempt.c
===================================================================
--- src/tests/concurrent/preempt.c	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/concurrent/preempt.c	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -2,4 +2,6 @@
 #include <thread>
 #include <time>
+
+#include "long_tests.h"
 
 #ifndef PREEMPTION_RATE
@@ -11,5 +13,5 @@
 }
 
-#ifdef LONG_TEST
+#ifdef TEST_LONG
 static const unsigned long N = 30_000ul;
 #else
@@ -30,5 +32,5 @@
 
 void main(worker_t & this) {
-	while(counter < N) {
+	while(TEST(counter < N)) {
 		__cfaabi_check_preemption();
 		if( (counter % 7) == this.value ) {
@@ -40,4 +42,5 @@
 		}
 		__cfaabi_check_preemption();
+		KICK_WATCHDOG;
 	}
 }
Index: src/tests/concurrent/signal/block.c
===================================================================
--- src/tests/concurrent/signal/block.c	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/concurrent/signal/block.c	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -14,4 +14,6 @@
 #include <time>
 
+#include "long_tests.h"
+
 #ifndef PREEMPTION_RATE
 #define PREEMPTION_RATE 10`ms
@@ -22,5 +24,5 @@
 }
 
-#ifdef LONG_TEST
+#ifdef TEST_LONG
 static const unsigned long N = 150_000ul;
 #else
@@ -66,6 +68,7 @@
 thread Waiter {};
 void main( Waiter & this ) {
-	for( int i = 0; i < N; i++ ) {
+	for( int i = 0; TEST(i < N); i++ ) {
 		wait_op( globalA, globalB, i );
+		KICK_WATCHDOG;
 	}
 }
Index: src/tests/concurrent/signal/disjoint.c
===================================================================
--- src/tests/concurrent/signal/disjoint.c	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/concurrent/signal/disjoint.c	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -4,4 +4,6 @@
 #include <thread>
 #include <time>
+
+#include "long_tests.h"
 
 #ifndef PREEMPTION_RATE
@@ -13,5 +15,5 @@
 }
 
-#ifdef LONG_TEST
+#ifdef TEST_LONG
 static const unsigned long N = 300_000ul;
 #else
@@ -71,5 +73,5 @@
 	if( (d.counter % 1000) == 0 ) sout | d.counter | endl;
 
-	return d.counter < N;
+	return TEST(d.counter < N);
 }
 
@@ -77,5 +79,5 @@
 
 void main( Waiter & this ) {
-	while( wait( mut, data ) ) { yield(); }
+	while( wait( mut, data ) ) { KICK_WATCHDOG; yield(); }
 }
 
@@ -94,5 +96,5 @@
 
 	//This is technically a mutual exclusion violation but the mutex monitor protects us
-	bool running = data.counter < N && data.counter > 0;
+	bool running = TEST(data.counter < N) && data.counter > 0;
 	if( data.state != SIGNAL && running ) {
 		sout | "ERROR Eager signal" | data.state | endl;
Index: src/tests/concurrent/signal/wait.c
===================================================================
--- src/tests/concurrent/signal/wait.c	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/concurrent/signal/wait.c	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -12,4 +12,6 @@
 #include <time>
 
+#include "long_tests.h"
+
 #ifndef PREEMPTION_RATE
 #define PREEMPTION_RATE 10`ms
@@ -20,5 +22,5 @@
 }
 
-#ifdef LONG_TEST
+#ifdef TEST_LONG
 static const unsigned long N = 375_000ul;
 #else
@@ -90,6 +92,7 @@
 // Waiter ABC
 void main( WaiterABC & this ) {
-	for( int i = 0; i < N; i++ ) {
+	for( int i = 0; TEST(i < N); i++ ) {
 		wait( condABC, globalA, globalB, globalC );
+		KICK_WATCHDOG;
 	}
 
@@ -100,6 +103,7 @@
 // Waiter AB
 void main( WaiterAB & this ) {
-	for( int i = 0; i < N; i++ ) {
+	for( int i = 0; TEST(i < N); i++ ) {
 		wait( condAB , globalA, globalB );
+		KICK_WATCHDOG;
 	}
 
@@ -110,6 +114,7 @@
 // Waiter AC
 void main( WaiterAC & this ) {
-	for( int i = 0; i < N; i++ ) {
+	for( int i = 0; TEST(i < N); i++ ) {
 		wait( condAC , globalA, globalC );
+		KICK_WATCHDOG;
 	}
 
@@ -120,6 +125,7 @@
 // Waiter BC
 void main( WaiterBC & this ) {
-	for( int i = 0; i < N; i++ ) {
+	for( int i = 0; TEST(i < N); i++ ) {
 		wait( condBC , globalB, globalC );
+		KICK_WATCHDOG;
 	}
 
Index: src/tests/long_tests.h
===================================================================
--- src/tests/long_tests.h	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
+++ src/tests/long_tests.h	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -0,0 +1,14 @@
+#pragma once
+
+#include <unistd.h>
+
+#if   defined(TEST_FOREVER)
+#define TEST(x) 1
+#define KICK_WATCHDOG write(STDOUT_FILENO, ".", 1)
+#elif defined(TEST_LONG)
+#define TEST(x) x
+#define KICK_WATCHDOG
+#else
+#define TEST(x) x
+#define KICK_WATCHDOG
+#endif
Index: src/tests/preempt_longrun/Makefile.am
===================================================================
--- src/tests/preempt_longrun/Makefile.am	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/preempt_longrun/Makefile.am	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -19,9 +19,11 @@
 preempt=10ul\`ms
 debug=-debug
+type=LONG
 
 REPEAT = ${abs_top_srcdir}/tools/repeat
+WATCHDOG = ${abs_top_srcdir}/tools/watchdog
 TIME = /usr/bin/time -f "%E"
 
-BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -O2 -DPREEMPTION_RATE=${preempt} -DLONG_TEST
+BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -O2 -DPREEMPTION_RATE=${preempt} -I.. -I. -DTEST_$(shell echo $(type) | tr a-z A-Z)
 CFLAGS = ${BUILD_FLAGS}
 CC = @CFA_BINDIR@/@CFA_NAME@
@@ -29,7 +31,16 @@
 TESTS = block coroutine create disjoint enter enter3 processor stack wait yield
 
-.INTERMEDIATE: ${TESTS}
+# .INTERMEDIATE: ${TESTS}
 
 all-local: ${TESTS:=.run}
+
+runall : ${TESTS:=.run}
+	@ echo "All programs terminated normally"
+
+watchall : ${TESTS:=.watch}
+	@ echo "All programs terminated normally"
+
+compileall : ${TESTS}
+	@ echo "Compiled"
 
 clean-local:
@@ -44,4 +55,9 @@
 	@ echo -e "${<}: SUCCESS\n"
 
+%.watch : % ${WATCHDOG}
+	@ time ${WATCHDOG} ./${<}
+	@ rm ${<}
+	@ echo -e "${<}: SUCCESS\n"
+
 %.time : % ${REPEAT}
 	@ ${REPEAT} -i -s -- $(repeats) $(TIME) -a -o times.log ./${<}
@@ -49,4 +65,7 @@
 	@ echo -e "${<}: SUCCESS\n"
 
-${REPEAT}:
+${REPEAT}: ${abs_top_srcdir}/tools/Makefile
 	@+make -C ${abs_top_srcdir}/tools/
+
+${WATCHDOG}: ${abs_top_srcdir}/tools/Makefile
+	@+make -C ${abs_top_srcdir}/tools/
Index: src/tests/preempt_longrun/Makefile.in
===================================================================
--- src/tests/preempt_longrun/Makefile.in	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/preempt_longrun/Makefile.in	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -452,7 +452,9 @@
 preempt = 10ul\`ms
 debug = -debug
+type = LONG
 REPEAT = ${abs_top_srcdir}/tools/repeat
+WATCHDOG = ${abs_top_srcdir}/tools/watchdog
 TIME = /usr/bin/time -f "%E"
-BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -O2 -DPREEMPTION_RATE=${preempt} -DLONG_TEST
+BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -O2 -DPREEMPTION_RATE=${preempt} -I.. -I. -DTEST_$(shell echo $(type) | tr a-z A-Z)
 TESTS = block coroutine create disjoint enter enter3 processor stack wait yield
 all: all-am
@@ -873,7 +875,16 @@
 
 
-.INTERMEDIATE: ${TESTS}
+# .INTERMEDIATE: ${TESTS}
 
 all-local: ${TESTS:=.run}
+
+runall : ${TESTS:=.run}
+	@ echo "All programs terminated normally"
+
+watchall : ${TESTS:=.watch}
+	@ echo "All programs terminated normally"
+
+compileall : ${TESTS}
+	@ echo "Compiled"
 
 clean-local:
@@ -888,4 +899,9 @@
 	@ echo -e "${<}: SUCCESS\n"
 
+%.watch : % ${WATCHDOG}
+	@ time ${WATCHDOG} ./${<}
+	@ rm ${<}
+	@ echo -e "${<}: SUCCESS\n"
+
 %.time : % ${REPEAT}
 	@ ${REPEAT} -i -s -- $(repeats) $(TIME) -a -o times.log ./${<}
@@ -893,5 +909,8 @@
 	@ echo -e "${<}: SUCCESS\n"
 
-${REPEAT}:
+${REPEAT}: ${abs_top_srcdir}/tools/Makefile
+	@+make -C ${abs_top_srcdir}/tools/
+
+${WATCHDOG}: ${abs_top_srcdir}/tools/Makefile
 	@+make -C ${abs_top_srcdir}/tools/
 
Index: src/tests/preempt_longrun/create.c
===================================================================
--- src/tests/preempt_longrun/create.c	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/preempt_longrun/create.c	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -2,4 +2,6 @@
 #include <thread>
 #include <time>
+
+#include "long_tests.h"
 
 #ifndef PREEMPTION_RATE
@@ -19,6 +21,7 @@
 int main(int argc, char* argv[]) {
 	processor p;
-	for(int i = 0; i < N; i++) {
+	for(int i = 0; TEST(i < N); i++) {
 		worker_t w[7];
+		KICK_WATCHDOG;
 	}
 }
Index: src/tests/preempt_longrun/enter.c
===================================================================
--- src/tests/preempt_longrun/enter.c	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/preempt_longrun/enter.c	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -3,4 +3,6 @@
 #include <thread>
 #include <time>
+
+#include "long_tests.h"
 
 #ifndef PREEMPTION_RATE
@@ -15,10 +17,12 @@
 
 monitor mon_t {};
-void foo( mon_t & mutex this ) {}
+void foo( mon_t & mutex this ) {
+	KICK_WATCHDOG;
+}
 
 mon_t mon;
 thread worker_t {};
 void main( worker_t & this ) {
-	for( unsigned long i = 0; i < N; i++ ) {
+	for( unsigned long i = 0; TEST(i < N); i++ ) {
 		foo( mon );
 	}
Index: src/tests/preempt_longrun/enter3.c
===================================================================
--- src/tests/preempt_longrun/enter3.c	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/preempt_longrun/enter3.c	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -3,4 +3,6 @@
 #include <thread>
 #include <time>
+
+#include "long_tests.h"
 
 #ifndef PREEMPTION_RATE
@@ -18,10 +20,12 @@
 mon_t mon1, mon2, mon3;
 
-void foo( mon_t & mutex a, mon_t & mutex b, mon_t & mutex c ) {}
+void foo( mon_t & mutex a, mon_t & mutex b, mon_t & mutex c ) {
+	KICK_WATCHDOG;
+}
 
 thread worker_t {};
 
 void main( worker_t & this ) {
-	for( unsigned long i = 0; i < N; i++ ) {
+	for( unsigned long i = 0; TEST(i < N); i++ ) {
 		foo( mon1, mon2, mon3 );
 	}
Index: src/tests/preempt_longrun/processor.c
===================================================================
--- src/tests/preempt_longrun/processor.c	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/preempt_longrun/processor.c	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -4,4 +4,6 @@
 
 #include <unistd.h>
+
+#include "long_tests.h"
 
 #ifndef PREEMPTION_RATE
@@ -17,18 +19,15 @@
 int main(int argc, char* argv[]) {
 	processor * p[15];
-	write(STDOUT_FILENO, "Preparing\n", sizeof("Preparing\n"));
 	for ( int pi = 0; pi < 15; pi++ ) {
 		p[pi] = new();
 	}
-	write(STDOUT_FILENO, "Starting\n", sizeof("Starting\n"));
-	for ( int i = 0; i < N; i++) {
+	for ( int i = 0; TEST(i < N); i++) {
 		int pi = i % 15;
 		delete( p[pi] );
 		p[pi] = new();
+		KICK_WATCHDOG;
 	}
-	write(STDOUT_FILENO, "Stopping\n", sizeof("Stopping\n"));
 	for ( int pi = 0; pi < 15; pi++ ) {
 		delete( p[pi] );
 	}
-	write(STDOUT_FILENO, "Done\n", sizeof("Done\n"));
 }
Index: src/tests/preempt_longrun/stack.c
===================================================================
--- src/tests/preempt_longrun/stack.c	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/preempt_longrun/stack.c	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -3,4 +3,6 @@
 #include <thread>
 #include <time>
+
+#include "long_tests.h"
 
 #ifndef PREEMPTION_RATE
@@ -18,10 +20,11 @@
 	volatile long long a = 326_417ul;
 	volatile long long n = 1l;
-	for (volatile long long i = 0; i < p; i++) {
+	for (volatile long long i = 0; TEST(i < p); i++) {
 		n *= a;
 		n %= p;
+		KICK_WATCHDOG;
 	}
 
-	if( n != a ) {
+	if( !TEST(n == a) ) {
 		abort();
 	}
Index: src/tests/preempt_longrun/yield.c
===================================================================
--- src/tests/preempt_longrun/yield.c	(revision 85b1deb20af020daa008d82abbbc54f9b152d5c0)
+++ src/tests/preempt_longrun/yield.c	(revision 7bdcac1f3631ee6408a86b4d0321433114fee6d3)
@@ -2,4 +2,6 @@
 #include <thread>
 #include <time>
+
+#include "long_tests.h"
 
 #ifndef PREEMPTION_RATE
@@ -11,5 +13,5 @@
 }
 
-#ifdef LONG_TEST
+#ifdef TEST_LONG
 static const unsigned long N = 9_750_000ul;
 #else
@@ -20,6 +22,7 @@
 
 void main(worker_t & this) {
-	for(int i = 0; i < N; i++) {
+	for(int i = 0; TEST(i < N); i++) {
 		yield();
+		KICK_WATCHDOG;
 	}
 }
