Index: src/libcfa/concurrency/alarm.c
===================================================================
--- src/libcfa/concurrency/alarm.c	(revision d6ff3ffe233bdce51812ab9635b616b629ab09af)
+++ src/libcfa/concurrency/alarm.c	(revision 933dbbdd51fba981922aaec1bce1f186615e9671)
@@ -43,8 +43,8 @@
 
 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 %llu\n", (__cfa_time_t)alarm );
 	itimerval val;
 	val.it_value.tv_sec = alarm / TIMEGRAN;			// seconds
-	val.it_value.tv_usec = (alarm % TIMEGRAN) / ( TIMEGRAN / 1_000_000L ); // microseconds
+	val.it_value.tv_usec = max( (alarm % TIMEGRAN) / ( TIMEGRAN / 1_000_000L ), 1000 ); // microseconds
 	val.it_interval.tv_sec = 0;
 	val.it_interval.tv_usec = 0;
Index: src/libcfa/concurrency/alarm.h
===================================================================
--- src/libcfa/concurrency/alarm.h	(revision d6ff3ffe233bdce51812ab9635b616b629ab09af)
+++ src/libcfa/concurrency/alarm.h	(revision 933dbbdd51fba981922aaec1bce1f186615e9671)
@@ -19,8 +19,9 @@
 
 #include <stdbool.h>
+#include <stdint.h>
 
 #include "assert"
 
-typedef unsigned long int __cfa_time_t;
+typedef uint64_t __cfa_time_t;
 
 struct thread_desc;
Index: src/libcfa/concurrency/preemption.c
===================================================================
--- src/libcfa/concurrency/preemption.c	(revision d6ff3ffe233bdce51812ab9635b616b629ab09af)
+++ src/libcfa/concurrency/preemption.c	(revision 933dbbdd51fba981922aaec1bce1f186615e9671)
@@ -66,8 +66,8 @@
 
 void tick_preemption() {
-	// LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Ticking preemption\n" );
-
 	alarm_list_t * alarms = &systemProcessor->alarms;
 	__cfa_time_t currtime = __kernel_get_time();
+
+	// LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Ticking preemption @ %llu\n", currtime );
 	while( alarms->head && alarms->head->alarm < currtime ) {
 		alarm_node_t * node = pop(alarms);
@@ -83,6 +83,8 @@
 		verify( validate( alarms ) );
 
-		if( node->period > 0 ) {
-			node->alarm = currtime + node->period;
+		__cfa_time_t period = node->period;
+		if( period > 0 ) {
+			node->alarm = currtime + period;
+			// LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Reinsert %p @ %llu (%llu + %llu)\n", node, node->alarm, currtime, period );
 			insert( alarms, node );
 		}
@@ -101,5 +103,5 @@
 
 void update_preemption( processor * this, __cfa_time_t duration ) {
-	LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Processor : %p updating preemption to %lu\n", this, duration );
+	LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Processor : %p updating preemption to %llu\n", this, duration );
 
 	alarm_node_t * alarm = this->preemption_alarm;
@@ -273,28 +275,22 @@
 		siginfo_t info;
 		int sig = sigwaitinfo( &mask, &info );
-		if( sig < 0 ) {
-			abortf( "internal error, sigwait" );
-		}
-		else if( sig == SIGALRM )
+		assertf(sig == SIGALRM, "Kernel Internal Error, sigwait: Unexpected signal %d (%d : %d)\n", sig, info.si_code, info.si_value.sival_int);
+
+		LIB_DEBUG_PRINT_SAFE("Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int );
+		switch( info.si_code )
 		{
-			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;
-			}
-		}
-		else
-		{
-			LIB_DEBUG_PRINT_SAFE("Kernel : Unexpected signal %d (%d)\n", sig, info.si_value.sival_int);
-		}
-	}
-
+		case SI_TIMER:
+		case SI_KERNEL:
+			LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
+			lock( &systemProcessor->alarm_lock DEBUG_CTX2 );
+			tick_preemption();
+			unlock( &systemProcessor->alarm_lock );
+			break;
+		case SI_QUEUE:
+			goto EXIT;
+		}
+	}
+
+EXIT:
 	LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n");
 	return NULL;
