Index: src/libcfa/concurrency/kernel.c
===================================================================
--- src/libcfa/concurrency/kernel.c	(revision 169d94423f252c409fa619afb3ac75cdecb6f03f)
+++ src/libcfa/concurrency/kernel.c	(revision 41fcd941e552062fa7dae8d4c0be131064ff92bb)
@@ -170,5 +170,5 @@
 	if( ! do_terminate ) {
 		__cfaabi_dbg_print_safe("Kernel : core %p signaling termination\n", &this);
-		do_terminate = true;
+		terminate(&this);
 		P( terminated );
 		pthread_join( kernel_thread, NULL );
Index: src/libcfa/concurrency/kernel_private.h
===================================================================
--- src/libcfa/concurrency/kernel_private.h	(revision 169d94423f252c409fa619afb3ac75cdecb6f03f)
+++ src/libcfa/concurrency/kernel_private.h	(revision 41fcd941e552062fa7dae8d4c0be131064ff92bb)
@@ -60,4 +60,5 @@
 void runThread(processor * this, thread_desc * dst);
 void finishRunning(processor * this);
+void terminate(processor * this);
 void spin(processor * this, unsigned int * spin_count);
 
Index: src/libcfa/concurrency/preemption.c
===================================================================
--- src/libcfa/concurrency/preemption.c	(revision 169d94423f252c409fa619afb3ac75cdecb6f03f)
+++ src/libcfa/concurrency/preemption.c	(revision 41fcd941e552062fa7dae8d4c0be131064ff92bb)
@@ -67,4 +67,9 @@
 }
 
+enum {
+	PREEMPT_NORMAL    = 0,
+	PREEMPT_TERMINATE = 1,
+};
+
 //=============================================================================================
 // Kernel Preemption logic
@@ -209,5 +214,13 @@
 // kill wrapper : signal a processor
 static void preempt( processor * this ) {
-	pthread_kill( this->kernel_thread, SIGUSR1 );
+	sigval_t value = { PREEMPT_NORMAL };
+	pthread_sigqueue( this->kernel_thread, SIGUSR1, value );
+}
+
+// kill wrapper : signal a processor
+void terminate(processor * this) {
+	this->do_terminate = true;
+	sigval_t value = { PREEMPT_TERMINATE };
+	pthread_sigqueue( this->kernel_thread, SIGUSR1, value );
 }
 
@@ -298,4 +311,17 @@
 void sigHandler_ctxSwitch( __CFA_SIGPARMS__ ) {
 	__cfaabi_dbg_debug_do( last_interrupt = (void *)(cxt->uc_mcontext.CFA_REG_IP); )
+
+	// SKULLDUGGERY: if a thread creates a processor and the immediately deletes it,
+	// the interrupt that is supposed to force the kernel thread to preempt might arrive
+	// before the kernel thread has even started running. When that happens an iterrupt
+	// we a null 'this_processor' will be caught, just ignore it.
+	if(!this_processor) return;
+
+	choose(sfp->si_value.sival_int) {
+		case PREEMPT_NORMAL   : ;// Normal case, nothing to do here
+		case PREEMPT_TERMINATE: verify(this_processor->do_terminate);
+		default:
+			abortf( "internal error, signal value is %d", sfp->si_value.sival_int );
+	}
 
 	// Check if it is safe to preempt here
