Index: src/libcfa/concurrency/alarm.c
===================================================================
--- src/libcfa/concurrency/alarm.c	(revision 2f0a06782533aa6fcd6240724fe8d0dce348e8c6)
+++ src/libcfa/concurrency/alarm.c	(revision cac8a6e84337137e8c5c1110acd046d6651782ec)
@@ -37,4 +37,5 @@
 
 void __kernel_set_timer( Duration alarm ) {
+	verifyf(alarm >= 1`us || alarm == 0, "Setting timer to < 1us (%luns)", alarm.tv);
 	setitimer( ITIMER_REAL, &(itimerval){ alarm }, NULL );
 }
@@ -68,5 +69,6 @@
 }
 
-__cfaabi_dbg_debug_do( bool validate( alarm_list_t * this ) {
+#if !defined(NDEBUG) && (defined(__CFA_DEBUG__) || defined(__CFA_VERIFY__))
+bool validate( alarm_list_t * this ) {
 	alarm_node_t ** it = &this->head;
 	while( (*it) ) {
@@ -75,5 +77,6 @@
 
 	return it == this->tail;
-})
+}
+#endif
 
 static inline void insert_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t p ) {
Index: src/libcfa/concurrency/preemption.c
===================================================================
--- src/libcfa/concurrency/preemption.c	(revision 2f0a06782533aa6fcd6240724fe8d0dce348e8c6)
+++ src/libcfa/concurrency/preemption.c	(revision cac8a6e84337137e8c5c1110acd046d6651782ec)
@@ -15,4 +15,5 @@
 
 #include "preemption.h"
+#include <assert.h>
 
 extern "C" {
@@ -91,4 +92,5 @@
 	//Loop throught every thing expired
 	while( node = get_expired( alarms, currtime ) ) {
+		// __cfaabi_dbg_print_buffer_decl( " KERNEL: preemption tick.\n" );
 
 		// Check if this is a kernel
@@ -103,4 +105,5 @@
 		Duration period = node->period;
 		if( period > 0 ) {
+			// __cfaabi_dbg_print_buffer_local( " KERNEL: alarm period is %lu.\n", period.tv );
 			node->alarm = 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
@@ -112,5 +115,13 @@
 
 	// If there are still alarms pending, reset the timer
-	if( alarms->head ) { __kernel_set_timer( alarms->head->alarm - currtime ); }
+	if( alarms->head ) {
+		__cfaabi_dbg_print_buffer_decl( " KERNEL: @%lu(%lu) resetting alarm to %lu.\n", currtime.tv, __kernel_get_time().tv, (alarms->head->alarm - currtime).tv);
+		Duration delta = alarms->head->alarm - currtime;
+		Duration caped = max(delta, 50`us);
+		// itimerval tim  = { caped };
+		// __cfaabi_dbg_print_buffer_local( "    Values are %lu, %lu, %lu %lu.\n", delta.tv, caped.tv, tim.it_value.tv_sec, tim.it_value.tv_usec);
+
+		__kernel_set_timer( caped );
+	}
 }
 
@@ -335,11 +346,14 @@
 	if( !preemption_ready() ) { return; }
 
-	__cfaabi_dbg_print_buffer_decl( " KERNEL: preempting core %p (%p).\n", kernelTLS.this_processor, kernelTLS.this_thread );
+	__cfaabi_dbg_print_buffer_decl( " KERNEL: preempting core %p (%p @ %p).\n", kernelTLS.this_processor, kernelTLS.this_thread, (void *)(cxt->uc_mcontext.CFA_REG_IP) );
 
 	// Sync flag : prevent recursive calls to the signal handler
 	kernelTLS.preemption_state.in_progress = true;
 
-	// We are about to CtxSwitch out of the signal handler, let other handlers in
-	signal_unblock( SIGUSR1 );
+	// Clear sighandler mask before context switching.
+	static_assert( sizeof( sigset_t ) == sizeof( cxt->uc_sigmask ), "Expected cxt->uc_sigmask to be of sigset_t" );
+	if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), NULL ) == -1 ) {
+		abort( "internal error, sigprocmask" );
+	}
 
 	// TODO: this should go in finish action
@@ -377,4 +391,5 @@
 				case EAGAIN :
 				case EINTR :
+					{__cfaabi_dbg_print_buffer_decl( " KERNEL: Spurious wakeup %d.\n", err );}
 					continue;
        			case EINVAL :
@@ -424,11 +439,18 @@
 	sigset_t oldset;
 	int ret;
-	ret = sigprocmask(0, NULL, &oldset);
+	ret = pthread_sigmask(0, NULL, &oldset);
 	if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); }
 
 	ret = sigismember(&oldset, SIGUSR1);
 	if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
-
 	if(ret == 1) { abort("ERROR SIGUSR1 is disabled"); }
+
+	ret = sigismember(&oldset, SIGALRM);
+	if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
+	if(ret == 0) { abort("ERROR SIGALRM is enabled"); }
+
+	ret = sigismember(&oldset, SIGTERM);
+	if(ret <  0) { abort("ERROR sigismember returned %d", ret); }
+	if(ret == 1) { abort("ERROR SIGTERM is disabled"); }
 }
 
Index: src/libcfa/time
===================================================================
--- src/libcfa/time	(revision 2f0a06782533aa6fcd6240724fe8d0dce348e8c6)
+++ src/libcfa/time	(revision cac8a6e84337137e8c5c1110acd046d6651782ec)
@@ -1,10 +1,10 @@
-// 
+//
 // Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
 //
 // The contents of this file are covered under the licence agreement in the
 // file "LICENCE" distributed with Cforall.
-// 
-// time -- 
-// 
+//
+// time --
+//
 // Author           : Peter A. Buhr
 // Created On       : Wed Mar 14 23:18:57 2018
@@ -12,5 +12,5 @@
 // Last Modified On : Sat Apr 14 17:48:23 2018
 // Update Count     : 636
-// 
+//
 
 #pragma once
@@ -91,4 +91,7 @@
 static inline int64_t ?`w( Duration dur ) { return dur.tv / (7LL * 24LL * 60LL * 60LL * TIMEGRAN); }
 
+static inline Duration max( Duration lhs, Duration rhs ) { return  (lhs.tv < rhs.tv) ? rhs : lhs;}
+static inline Duration min( Duration lhs, Duration rhs ) { return !(rhs.tv < lhs.tv) ? lhs : rhs;}
+
 
 //######################### C timeval #########################
