Index: libcfa/src/concurrency/preemption.cfa
===================================================================
--- libcfa/src/concurrency/preemption.cfa	(revision c993b1521e96d36bed6b395f8eec5284bc85f5f5)
+++ libcfa/src/concurrency/preemption.cfa	(revision 27c97673eaef007dbc6ced268535966743ca910d)
@@ -18,4 +18,5 @@
 
 #include "preemption.hfa"
+
 #include <assert.h>
 
@@ -26,4 +27,5 @@
 #include <limits.h>										// PTHREAD_STACK_MIN
 
+#include "bits/debug.hfa"
 #include "bits/signal.hfa"
 #include "kernel_private.hfa"
@@ -105,5 +107,5 @@
 static inline alarm_node_t * get_expired( alarm_list_t * alarms, Time currtime ) {
 	if( ! & (*alarms)`first ) return 0p;						// If no alarms return null
-	if( (*alarms)`first.alarm >= currtime ) return 0p;	// If alarms head not expired return null
+	if( (*alarms)`first.timeval >= currtime ) return 0p;	// If alarms head not expired return null
 	return pop(alarms);									// Otherwise just pop head
 }
@@ -141,5 +143,5 @@
 		if( period > 0 ) {
 			__cfadbg_print_buffer_local( preemption, " KERNEL: alarm period is %lu.\n", period`ns );
-			node->alarm = currtime + period;    // Alarm is periodic, add currtime to it (used cached current time)
+			node->timeval = currtime + period;  // Alarm is periodic, add currtime to it (used cached current time)
 			insert( alarms, node );             // Reinsert the node for the next time it triggers
 		}
@@ -148,7 +150,6 @@
 	// If there are still alarms pending, reset the timer
 	if( & (*alarms)`first ) {
-		Duration delta = (*alarms)`first.alarm - currtime;
-		Duration capped = max(delta, 50`us);
-		__kernel_set_timer( capped );
+		Duration delta = (*alarms)`first.timeval - currtime;
+		__kernel_set_timer( delta );
 	}
 }
@@ -160,6 +161,6 @@
 	// Alarms need to be enabled
 	if ( duration > 0 && ! alarm->set ) {
-		alarm->alarm = __kernel_get_time() + duration;
-		alarm->period = duration;
+		alarm->initial = duration;
+		alarm->period  = duration;
 		register_self( alarm );
 	}
@@ -167,12 +168,12 @@
 	else if ( duration == 0 && alarm->set ) {
 		unregister_self( alarm );
-		alarm->alarm = 0;
-		alarm->period = 0;
+		alarm->initial = 0;
+		alarm->period  = 0;
 	}
 	// If alarm is different from previous, change it
 	else if ( duration > 0 && alarm->period != duration ) {
 		unregister_self( alarm );
-		alarm->alarm = __kernel_get_time() + duration;
-		alarm->period = duration;
+		alarm->initial = duration;
+		alarm->period  = duration;
 		register_self( alarm );
 	}
@@ -599,5 +600,6 @@
 
 	// Notify the alarm thread of the shutdown
-	sigval val = { 1 };
+	sigval val;
+	val.sival_int = 0;
 	pthread_sigqueue( alarm_thread, SIGALRM, val );
 
@@ -619,5 +621,5 @@
 // Used by thread to control when they want to receive preemption signals
 void ?{}( preemption_scope & this, processor * proc ) {
-	(this.alarm){ proc, (Time){ 0 }, 0`s };
+	(this.alarm){ proc, 0`s, 0`s };
 	this.proc = proc;
 	this.proc->preemption_alarm = &this.alarm;
@@ -705,4 +707,7 @@
 		int sig = sigwaitinfo( &mask, &info );
 
+		__cfadbg_print_buffer_decl ( preemption, " KERNEL: sigwaitinfo returned %d, c: %d, v: %d\n", sig, info.si_code, info.si_value.sival_int );
+		__cfadbg_print_buffer_local( preemption, " KERNEL: SI_QUEUE %d, SI_TIMER %d, SI_KERNEL %d\n", SI_QUEUE, SI_TIMER, SI_KERNEL );
+
 		if( sig < 0 ) {
 			//Error!
@@ -711,5 +716,5 @@
 				case EAGAIN :
 				case EINTR :
-					{__cfaabi_dbg_print_buffer_decl( " KERNEL: Spurious wakeup %d.\n", err );}
+					{__cfadbg_print_buffer_local( preemption, " KERNEL: Spurious wakeup %d.\n", err );}
 					continue;
 				case EINVAL :
@@ -723,8 +728,19 @@
 		assertf(sig == SIGALRM, "Kernel Internal Error, sigwait: Unexpected signal %d (%d : %d)\n", sig, info.si_code, info.si_value.sival_int);
 
-		// __cfaabi_dbg_print_safe( "Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int );
 		// Switch on the code (a.k.a. the sender) to
 		switch( info.si_code )
 		{
+		// Signal was not sent by the kernel but by an other thread
+		case SI_QUEUE:
+			// other threads may signal the alarm thread to shut it down
+			// or to manual cause the preemption tick
+			// use info.si_value and handle the case here
+			switch( info.si_value.sival_int ) {
+			case 0:
+				goto EXIT;
+			default:
+				abort( "SI_QUEUE with val %d", info.si_value.sival_int);
+			}
+			// fallthrough
 		// Timers can apparently be marked as sent for the kernel
 		// In either case, tick preemption
@@ -736,9 +752,4 @@
 			unlock( event_kernel->lock );
 			break;
-		// Signal was not sent by the kernel but by an other thread
-		case SI_QUEUE:
-			// For now, other thread only signal the alarm thread to shut it down
-			// If this needs to change use info.si_value and handle the case here
-			goto EXIT;
 		}
 	}
