Index: src/libcfa/concurrency/kernel.c
===================================================================
--- src/libcfa/concurrency/kernel.c	(revision a0b3e324b0df6359f02e5071acdf1b97ef78c30f)
+++ src/libcfa/concurrency/kernel.c	(revision 0764cfbca3dfe9f98e59f93f6dbb28d920692ea2)
@@ -60,4 +60,5 @@
 volatile thread_local coroutine_desc * this_coroutine;
 volatile thread_local thread_desc * this_thread;
+volatile thread_local bool preemption_in_progress = 0;
 volatile thread_local unsigned short disable_preempt_count = 1;
 
Index: src/libcfa/concurrency/kernel_private.h
===================================================================
--- src/libcfa/concurrency/kernel_private.h	(revision a0b3e324b0df6359f02e5071acdf1b97ef78c30f)
+++ src/libcfa/concurrency/kernel_private.h	(revision 0764cfbca3dfe9f98e59f93f6dbb28d920692ea2)
@@ -79,4 +79,5 @@
 extern volatile thread_local coroutine_desc * this_coroutine;
 extern volatile thread_local thread_desc * this_thread;
+extern volatile thread_local bool preemption_in_progress;
 extern volatile thread_local unsigned short disable_preempt_count;
 
Index: src/libcfa/concurrency/preemption.c
===================================================================
--- src/libcfa/concurrency/preemption.c	(revision a0b3e324b0df6359f02e5071acdf1b97ef78c30f)
+++ src/libcfa/concurrency/preemption.c	(revision 0764cfbca3dfe9f98e59f93f6dbb28d920692ea2)
@@ -180,5 +180,5 @@
 
 static inline bool preemption_ready() {
-	return disable_preempt_count == 0;
+	return disable_preempt_count == 0 && !preemption_in_progress;
 }
 
@@ -218,4 +218,6 @@
 
 void kernel_stop_preemption() {
+	LIB_DEBUG_PRINT_SAFE("Kernel : Preemption stopping\n");
+
 	sigset_t mask;
 	sigfillset( &mask );
@@ -248,5 +250,8 @@
 	LIB_DEBUG_DO( last_interrupt = (void *)(cxt->uc_mcontext.gregs[CFA_REG_IP]); )
 	if( preemption_ready() ) {
+		preemption_in_progress = true;
 		signal_unblock( SIGUSR1 );
+		this_processor->pending_preemption = false;
+		preemption_in_progress = false;
 		BlockInternal( (thread_desc*)this_thread );
 	}
@@ -255,26 +260,4 @@
 	}
 }
-
-// void sigHandler_alarm( __CFA_SIGPARMS__ ) {
-// 	LIB_DEBUG_DO( last_interrupt = (void *)(cxt->uc_mcontext.gregs[CFA_REG_IP]); )
-// 	verify( this_processor == systemProcessor );
-
-// 	if( try_lock( &systemProcessor->alarm_lock DEBUG_CTX2 ) ) {
-// 		tick_preemption();
-// 		systemProcessor->pending_alarm = false;
-// 		unlock( &systemProcessor->alarm_lock );
-// 	}
-// 	else {
-// 		defer_alarm();
-// 	}
-
-// 	signal_unblock( SIGALRM );
-
-// 	if( preemption_ready() && this_processor->pending_preemption ) {
-
-// 		this_processor->pending_preemption = false;
-// 		BlockInternal( (thread_desc*)this_thread );
-// 	}
-// }
 
 void * alarm_loop( __attribute__((unused)) void * args ) {
