Index: libcfa/src/bits/defs.hfa
===================================================================
--- libcfa/src/bits/defs.hfa	(revision fa2e1835ade3aa1f3812f145ebfef6cd082dbb51)
+++ libcfa/src/bits/defs.hfa	(revision 13edbac1cf5821f9ebcf609f25db2fd5d06ea480)
@@ -30,8 +30,8 @@
 #ifdef __cforall
 #define __cfa_anonymous_object(x) inline struct x
-#define __cfa_dlink(x) inline dlink(x)
+#define __cfa_dlink1(x) dlink(x)
 #else
 #define __cfa_anonymous_object(x) struct x __cfa_anonymous_object
-#define __cfa_dlink(x) struct { struct x * next; struct x * back; } __dlink_substitute
+#define __cfa_dlink1(x) struct { struct x * next; struct x * back; }
 #endif
 
Index: libcfa/src/concurrency/invoke.h
===================================================================
--- libcfa/src/concurrency/invoke.h	(revision fa2e1835ade3aa1f3812f145ebfef6cd082dbb51)
+++ libcfa/src/concurrency/invoke.h	(revision 13edbac1cf5821f9ebcf609f25db2fd5d06ea480)
@@ -196,5 +196,5 @@
 
 		// used to put threads on dlist data structure
-		__cfa_dlink(thread$);
+		__cfa_dlink1(thread$) user_link;
 
 		struct {
@@ -218,7 +218,5 @@
 		#endif
 	};
-	#ifdef __cforall
-		P9_EMBEDDED( thread$, dlink(thread$) )
-	#endif
+
 	// Wrapper for gdb
 	struct cfathread_thread_t { struct thread$ debug; };
@@ -241,4 +239,10 @@
 		}
 
+		static inline tytagref( dlink(thread$), dlink(thread$) ) ?`inner( thread$ & this ) {
+			dlink(thread$) & b = this.user_link;
+			tytagref( dlink(thread$), dlink(thread$) ) result = { b };
+			return result;
+		}
+
 		static inline void ?{}(__monitor_group_t & this) {
 			(this.data){0p};
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision fa2e1835ade3aa1f3812f145ebfef6cd082dbb51)
+++ libcfa/src/concurrency/kernel.cfa	(revision 13edbac1cf5821f9ebcf609f25db2fd5d06ea480)
@@ -602,8 +602,10 @@
 		/* paranoid */ verifyf( ((uintptr_t)thrd->context.SP) < ((uintptr_t)__get_stack(thrd->curr_cor)->base ), "ERROR : thread$ %p has been corrupted.\n StackPointer too small.\n", thrd );
 
-		thrd->state = Halting;
 		if( TICKET_RUNNING != thrd->ticket ) { abort( "Thread terminated with pending unpark" ); }
 		if( thrd != this->owner ) { abort( "Thread internal monitor has incorrect owner" ); }
 		if( this->recursion != 1) { abort( "Thread internal monitor has unbalanced recursion" ); }
+
+		thrd->state = Halting;
+		thrd->ticket = TICKET_DEAD;
 
 		// Leave the thread
Index: libcfa/src/concurrency/kernel/private.hfa
===================================================================
--- libcfa/src/concurrency/kernel/private.hfa	(revision fa2e1835ade3aa1f3812f145ebfef6cd082dbb51)
+++ libcfa/src/concurrency/kernel/private.hfa	(revision 13edbac1cf5821f9ebcf609f25db2fd5d06ea480)
@@ -166,4 +166,5 @@
 #define TICKET_RUNNING ( 0) // thread is running
 #define TICKET_UNBLOCK ( 1) // thread should ignore next block
+#define TICKET_DEAD    (0xDEAD) // thread should never be unparked
 
 //-----------------------------------------------------------------------------
