Index: libcfa/src/concurrency/kernel/startup.cfa
===================================================================
--- libcfa/src/concurrency/kernel/startup.cfa	(revision eaf269d21f42f861fd9f29749c414742326bf919)
+++ libcfa/src/concurrency/kernel/startup.cfa	(revision 3bb1292129f5be158f2a3192bf864d1ab2191cb9)
@@ -279,5 +279,7 @@
 	// When its coroutine terminates, it return control to the mainThread
 	// which is currently here
+	/* paranoid */ verify( !__atomic_load_n(&mainProcessor->do_terminate, __ATOMIC_ACQUIRE) );
 	__atomic_store_n(&mainProcessor->do_terminate, true, __ATOMIC_RELEASE);
+	__wake_proc( mainProcessor );
 	__kernel_last_resume( __cfaabi_tls.this_processor );
 	mainThread->self_cor.state = Halted;
@@ -564,13 +566,14 @@
 extern size_t __page_size;
 void ^?{}(processor & this) with( this ){
-	if( ! __atomic_load_n(&do_terminate, __ATOMIC_ACQUIRE) ) {
-		__cfadbg_print_safe(runtime_core, "Kernel : core %p signaling termination\n", &this);
-
-		__atomic_store_n(&do_terminate, true, __ATOMIC_RELAXED);
+	/* paranoid */ verify( !__atomic_load_n(&do_terminate, __ATOMIC_ACQUIRE) );
+	__cfadbg_print_safe(runtime_core, "Kernel : core %p signaling termination\n", &this);
+
+	__atomic_store_n(&do_terminate, true, __ATOMIC_RELAXED);
+	__disable_interrupts_checked();
 		__wake_proc( &this );
-
-		wait( terminated );
-		/* paranoid */ verify( active_processor() != &this);
-	}
+	__enable_interrupts_checked();
+
+	wait( terminated );
+	/* paranoid */ verify( active_processor() != &this);
 
 	__destroy_pthread( kernel_thread, this.stack, 0p );
