Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision 1e208eaf1b3b9a933894763281cdac06ad5ed888)
+++ libcfa/src/concurrency/kernel.cfa	(revision 9d6e1b8ae1a5072ddee5a7fcfec69271df0f6430)
@@ -251,4 +251,5 @@
 		/* paranoid */ verify( ! __preemption_enabled() );
 		/* paranoid */ verify( kernelTLS().this_thread == thrd_dst );
+		/* paranoid */ verify( thrd_dst->curr_cluster == this->cltr );
 		/* paranoid */ verify( thrd_dst->context.SP );
 		/* paranoid */ verify( thrd_dst->state != Halted );
@@ -267,4 +268,5 @@
 		/* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ), "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst );
 		/* paranoid */ verify( thrd_dst->context.SP );
+		/* paranoid */ verify( thrd_dst->curr_cluster == this->cltr );
 		/* paranoid */ verify( kernelTLS().this_thread == thrd_dst );
 		/* paranoid */ verify( ! __preemption_enabled() );
@@ -360,7 +362,8 @@
 void __schedule_thread( $thread * thrd ) {
 	/* paranoid */ verify( ! __preemption_enabled() );
+	/* paranoid */ verify( kernelTLS().this_proc_id );
 	/* paranoid */ verify( thrd );
 	/* paranoid */ verify( thrd->state != Halted );
-	/* paranoid */ verify( kernelTLS().this_proc_id );
+	/* paranoid */ verify( thrd->curr_cluster );
 	/* paranoid */ #if defined( __CFA_WITH_VERIFY__ )
 	/* paranoid */ 	if( thrd->state == Blocked || thrd->state == Start ) assertf( thrd->preempted == __NO_PREEMPTION,
@@ -473,14 +476,22 @@
 		disable_interrupts();
 
+		/* paranoid */ verify( ! __preemption_enabled() );
+		/* paranoid */ verify( thrd->state == Active );
+		/* paranoid */ verify( 0x0D15EA5E0D15EA5Ep == thrd->canary );
+		/* paranoid */ verify( kernelTLS().this_thread == thrd );
+		/* paranoid */ verify( thrd->context.SP );
+		/* paranoid */ verifyf( ((uintptr_t)thrd->context.SP) > ((uintptr_t)__get_stack(thrd->curr_cor)->limit), "ERROR : $thread %p has been corrupted.\n StackPointer too large.\n", thrd );
+		/* 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 = Halted;
 		if( TICKET_RUNNING != thrd->ticket ) { abort( "Thread terminated with pending unpark" ); }
-		if( thrd != this->owner || this->recursion != 1) { abort( "Thread internal monitor has unbalanced recursion" ); }
+		if( thrd != this->owner ) { abort( "Thread internal monitor has incorrect owner" ); }
+		if( this->recursion != 1) { abort( "Thread internal monitor has unbalanced recursion" ); }
 
 		// Leave the thread
-		/* paranoid */ verify( ! __preemption_enabled() );
 		returnToKernel();
+
+		// Control flow should never reach here!
 		abort();
-
-		// Control flow should never reach here!
 	}
 }
Index: libcfa/src/concurrency/monitor.cfa
===================================================================
--- libcfa/src/concurrency/monitor.cfa	(revision 1e208eaf1b3b9a933894763281cdac06ad5ed888)
+++ libcfa/src/concurrency/monitor.cfa	(revision 9d6e1b8ae1a5072ddee5a7fcfec69271df0f6430)
@@ -166,4 +166,5 @@
 	}
 	// SKULLDUGGERY: join will act as a dtor so it would normally trigger to above check
+	// because join will not release the monitor after it executed.
 	// to avoid that it sets the owner to the special value thrd | 1p before exiting
 	else if( this->owner == ($thread*)(1 | (uintptr_t)thrd) ) {
@@ -172,5 +173,5 @@
 
 		// No one has the monitor, just take it
-		this->owner = thrd;
+		__set_owner( this, thrd );
 
 		verifyf( active_thread() == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", active_thread(), this->owner, this->recursion, this );
@@ -285,7 +286,12 @@
 
 	// Lock the monitor now
+	/* paranoid */ verify( 0x0D15EA5E0D15EA5Ep == thrd->canary );
 	/* paranoid */ verify( this->lock.lock );
+	/* paranoid */ verify( thrd->context.SP );
+	/* paranoid */ verifyf( ((uintptr_t)thrd->context.SP) > ((uintptr_t)__get_stack(thrd->curr_cor)->limit), "ERROR : $thread %p has been corrupted.\n StackPointer too large.\n", thrd );
+	/* 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 );
+	/* paranoid */ verify( ! __preemption_enabled() );
+
 	/* paranoid */ verifyf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", thrd, this->owner, this->recursion, this );
-	/* paranoid */ verify( ! __preemption_enabled() );
 	/* paranoid */ verify( thrd->state == Halted );
 	/* paranoid */ verify( this->recursion == 1 );
