Index: src/libcfa/concurrency/preemption.c
===================================================================
--- src/libcfa/concurrency/preemption.c	(revision acb89ed284a096777eee8392dd775f6c9e5785ff)
+++ src/libcfa/concurrency/preemption.c	(revision a0b3e324b0df6359f02e5071acdf1b97ef78c30f)
@@ -222,5 +222,6 @@
 	sigprocmask( SIG_BLOCK, &mask, NULL );
 
-	pthread_kill( alarm_thread, SIGINT );
+	sigval val = { 1 };
+	pthread_sigqueue( alarm_thread, SIGALRM, val );
 	pthread_join( alarm_thread, NULL );
 	LIB_DEBUG_PRINT_SAFE("Kernel : Preemption stopped\n");
@@ -281,6 +282,4 @@
 	sigemptyset( &mask );
 	sigaddset( &mask, SIGALRM );
-	sigaddset( &mask, SIGUSR2 );
-	sigaddset( &mask, SIGINT  );
 
 	if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) {
@@ -289,27 +288,32 @@
 
 	while( true ) {
-		int sig;
-		if( sigwait( &mask, &sig ) != 0  ) {
+		siginfo_t info;
+		int sig = sigwaitinfo( &mask, &info );
+		if( sig < 0 ) {
 			abortf( "internal error, sigwait" );
 		}
-
-		switch( sig) {
-			case SIGALRM:
+		else if( sig == SIGALRM )
+		{
+			LIB_DEBUG_PRINT_SAFE("Kernel : Caught signal %d (%d)\n", sig, info.si_value.sival_int );
+			if( info.si_value.sival_int == 0 )
+			{
 				LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
 				lock( &systemProcessor->alarm_lock DEBUG_CTX2 );
 				tick_preemption();
 				unlock( &systemProcessor->alarm_lock );
+			}
+			else if( info.si_value.sival_int == 1 )
+			{
 				break;
-			case SIGUSR2:
-				//TODO other actions
-				break;
-			case SIGINT:
-				LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n");
-				return NULL;
-			default:
-				abortf( "internal error, sigwait returned sig %d", sig );
-				break;
-		}
-	}
+			}
+		}
+		else
+		{
+			LIB_DEBUG_PRINT_SAFE("Kernel : Unexpected signal %d (%d)\n", sig, info.si_value.sival_int);
+		}
+	}
+
+	LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n");
+	return NULL;
 }
 
