Index: src/libcfa/concurrency/alarm.c
===================================================================
--- src/libcfa/concurrency/alarm.c	(revision b751c8eb84f240ff8d0369e92d113a9845d93693)
+++ src/libcfa/concurrency/alarm.c	(revision 47ecf2b292dc674c395437d675839124283948b3)
@@ -43,5 +43,5 @@
 
 void __kernel_set_timer( __cfa_time_t alarm ) {
-	// LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Kernel : set timer to %lu\n", (__cfa_time_t)alarm );
+	LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Kernel : set timer to %lu\n", (__cfa_time_t)alarm );
 	itimerval val;
 	val.it_value.tv_sec = alarm / TIMEGRAN;			// seconds
Index: src/libcfa/concurrency/coroutine.c
===================================================================
--- src/libcfa/concurrency/coroutine.c	(revision b751c8eb84f240ff8d0369e92d113a9845d93693)
+++ src/libcfa/concurrency/coroutine.c	(revision 47ecf2b292dc674c395437d675839124283948b3)
@@ -44,5 +44,5 @@
 // Coroutine ctors and dtors
 void ?{}(coStack_t* this) {
-	this->size		= 10240;	// size of stack
+	this->size		= 65000;	// size of stack
 	this->storage	= NULL;	// pointer to stack
 	this->limit		= NULL;	// stack grows towards stack limit
@@ -50,5 +50,5 @@
 	this->context	= NULL;	// address of cfa_context_t
 	this->top		= NULL;	// address of top of storage
-	this->userStack	= false;	
+	this->userStack	= false;
 }
 
@@ -114,5 +114,5 @@
 	assert( src->stack.context );
 	CtxSwitch( src->stack.context, dst->stack.context );
-	// when CtxSwitch returns we are back in the src coroutine		
+	// when CtxSwitch returns we are back in the src coroutine
 
 	// set state of new coroutine to active
@@ -132,5 +132,5 @@
 		this->size = libCeiling( storageSize, 16 );
 		// use malloc/memalign because "new" raises an exception for out-of-memory
-		
+
 		// assume malloc has 8 byte alignment so add 8 to allow rounding up to 16 byte alignment
 		LIB_DEBUG_DO( this->storage = memalign( pageSize, cxtSize + this->size + pageSize ) );
Index: src/libcfa/concurrency/kernel.c
===================================================================
--- src/libcfa/concurrency/kernel.c	(revision b751c8eb84f240ff8d0369e92d113a9845d93693)
+++ src/libcfa/concurrency/kernel.c	(revision 47ecf2b292dc674c395437d675839124283948b3)
@@ -337,6 +337,6 @@
 		sigaddset( &new_mask, SIGALRM );
 
-		if ( sigprocmask( SIG_BLOCK, &new_mask, &old_mask ) == -1 ) {
-			abortf( "internal error, sigprocmask" );
+		if ( pthread_sigmask( SIG_BLOCK, &new_mask, &old_mask ) == -1 ) {
+			abortf( "internal error, pthread_sigmask" );
 		}
 
@@ -348,6 +348,6 @@
 	// Toggle back previous signal mask of system processor.
 	if ( is_system_proc ) {
-		if ( sigprocmask( SIG_SETMASK, &old_mask, NULL ) == -1 ) {
-			abortf( "internal error, sigprocmask" );
+		if ( pthread_sigmask( SIG_SETMASK, &old_mask, NULL ) == -1 ) {
+			abortf( "internal error, pthread_sigmask" );
 		} // if
 	} // if
Index: src/libcfa/concurrency/preemption.c
===================================================================
--- src/libcfa/concurrency/preemption.c	(revision b751c8eb84f240ff8d0369e92d113a9845d93693)
+++ src/libcfa/concurrency/preemption.c	(revision 47ecf2b292dc674c395437d675839124283948b3)
@@ -179,7 +179,5 @@
 		if( prev == 1 && proc->pending_preemption ) {
 			proc->pending_preemption = false;
-			LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Executing deferred CtxSwitch on %p\n", this_processor );
 			BlockInternal( thrd );
-			LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Executing deferred back\n" );
 		}
 
@@ -189,12 +187,5 @@
 
 static inline void signal_unblock( int sig ) {
-	// LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Processor : %p unblocking sig %i\n", this_processor, sig );
-
-	// LIB_DEBUG_DO(
-	// 	sigset_t waiting;
-	// 	sigemptyset(&waiting);
-	// 	sigpending(&waiting);
-	// 	verify( !sigismember(&waiting, sig) );
-	// )
+	LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Unblock %d on %p\n", sig, this_processor );
 
 	sigset_t mask;
@@ -202,8 +193,18 @@
 	sigaddset( &mask, sig );
 
-	if ( sigprocmask( SIG_UNBLOCK, &mask, NULL ) == -1 ) {
-	    abortf( "internal error, sigprocmask" );
+	if ( pthread_sigmask( SIG_UNBLOCK, &mask, NULL ) == -1 ) {
+	    abortf( "internal error, pthread_sigmask" );
 	} // if
 }
+
+// static inline void signal_block( int sig ) {
+// 	sigset_t mask;
+// 	sigemptyset( &mask );
+// 	sigaddset( &mask, sig );
+
+// 	if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) {
+// 	    abortf( "internal error, pthread_sigmask" );
+// 	} // if
+// }
 
 static inline bool preemption_ready() {
@@ -225,27 +226,30 @@
 }
 
+#ifdef __x86_64__
+#define CFA_REG_IP REG_RIP
+#else
+#define CFA_REG_IP REG_EIP
+#endif
+
 void sigHandler_ctxSwitch( __CFA_SIGPARMS__ ) {
-	LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "CtxSw IRH %10p running %10p @ %10p\n", this_processor, this_thread, (void *)(cxt->uc_mcontext.gregs[REG_RIP]) );
-	LIB_DEBUG_DO( last_interrupt = (void *)(cxt->uc_mcontext.gregs[REG_RIP]); )
+	LIB_DEBUG_DO( last_interrupt = (void *)(cxt->uc_mcontext.gregs[CFA_REG_IP]); )
+	verify( this_processor != systemProcessor );
 
 	if( preemption_ready() ) {
-		// LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Ctx Switch IRH : Blocking thread %p on %p\n", this_thread, this_processor );
 		signal_unblock( SIGUSR1 );
 		BlockInternal( (thread_desc*)this_thread );
-		// LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Ctx Switch IRH : Back\n\n");
 	}
 	else {
-		// LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Ctx Switch IRH : Defering\n" );
 		defer_ctxSwitch();
-		signal_unblock( SIGUSR1 );
 	}
 }
 
 void sigHandler_alarm( __CFA_SIGPARMS__ ) {
-	LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "\nAlarm IRH %10p running %10p @ %10p\n", this_processor, this_thread, (void *)(cxt->uc_mcontext.gregs[REG_RIP]) );
-	LIB_DEBUG_DO( last_interrupt = (void *)(cxt->uc_mcontext.gregs[REG_RIP]); )
+	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 );
 	}
@@ -257,14 +261,11 @@
 
 	if( preemption_ready() && this_processor->pending_preemption ) {
-		// LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Alarm IRH : Blocking thread %p on %p\n", this_thread, this_processor );
+
 		this_processor->pending_preemption = false;
 		BlockInternal( (thread_desc*)this_thread );
-		// LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Alarm Switch IRH : Back\n\n");
 	}
 }
 
 static void preempt( processor * this ) {
-	// LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Processor : signalling %p\n", this );
-
 	if( this != systemProcessor ) {
 		pthread_kill( this->kernel_thread, SIGUSR1 );
@@ -284,8 +285,4 @@
 	act.sa_sigaction = (void (*)(int, siginfo_t *, void *))handler;
 	act.sa_flags = flags;
-
-	// disabled during signal handler
-	sigemptyset( &act.sa_mask );
-	sigaddset( &act.sa_mask, sig );
 
 	if ( sigaction( sig, &act, NULL ) == -1 ) {
