Index: libcfa/src/concurrency/alarm.cfa
===================================================================
--- libcfa/src/concurrency/alarm.cfa	(revision 7fca83260189dfdbcdd6158e13e93402ac8fe85f)
+++ libcfa/src/concurrency/alarm.cfa	(revision afd7fafbc24fcdf66cddb218210f54db0a58cd3d)
@@ -118,7 +118,7 @@
 		insert( &alarms, this );
 		__kernel_set_timer( this->initial );
+		this->set = true;
 	}
 	unlock( event_kernel->lock );
-	this->set = true;
 	enable_interrupts();
 }
@@ -129,9 +129,9 @@
 	{
 		verify( validate( event_kernel->alarms ) );
-		remove( *this );
+		if (this->set) remove( *this );
+		this->set = false;
 	}
 	unlock( event_kernel->lock );
 	enable_interrupts();
-	this->set = false;
 }
 
Index: libcfa/src/concurrency/locks.cfa
===================================================================
--- libcfa/src/concurrency/locks.cfa	(revision 7fca83260189dfdbcdd6158e13e93402ac8fe85f)
+++ libcfa/src/concurrency/locks.cfa	(revision afd7fafbc24fcdf66cddb218210f54db0a58cd3d)
@@ -313,8 +313,8 @@
 
 	// helper for wait()'s' with a timeout
-	void queue_info_thread_timeout( condition_variable(L) & this, info_thread(L) & info, Duration t ) with(this) {
+	void queue_info_thread_timeout( condition_variable(L) & this, info_thread(L) & info, Duration t, Alarm_Callback callback ) with(this) {
 		lock( lock __cfaabi_dbg_ctx2 );
 		size_t recursion_count = queue_and_get_recursion(this, &info);
-		alarm_node_wrap(L) node_wrap = { t, 0`s, alarm_node_wrap_cast, &this, &info };
+		alarm_node_wrap(L) node_wrap = { t, 0`s, callback, &this, &info };
 		register_self( &node_wrap.alarm_node );
 		unlock( lock );
@@ -332,5 +332,5 @@
 	#define WAIT_TIME( u, l, t ) \
 		info_thread( L ) i = { active_thread(), u, l }; \
-		queue_info_thread_timeout(this, i, t ); \
+		queue_info_thread_timeout(this, i, t, alarm_node_wrap_cast ); \
 		return i.signalled;
 
