Index: libcfa/src/concurrency/locks.cfa
===================================================================
--- libcfa/src/concurrency/locks.cfa	(revision d25b2d6b1b89b6a396a1fa4fbb2697d6f7e3ce3c)
+++ libcfa/src/concurrency/locks.cfa	(revision 7b1f6d46fc5a0667747e03864d0195d693c13f3b)
@@ -17,5 +17,4 @@
 		this.t = t;
 		this.lock = 0p;
-		this.listed = false;
 	}
 
@@ -25,5 +24,4 @@
 		this.info = info;
 		this.lock = 0p;
-		this.listed = false;
 	}
 
@@ -36,8 +34,4 @@
 	info_thread(L) *& Next( info_thread(L) * this ) {
 		return (info_thread(L) *)Next( (Colable *)this );
-	}
-
-	bool listed( info_thread(L) * this ) {
-		return Next( (Colable *)this ) != 0p;
 	}
 }
@@ -194,6 +188,6 @@
     	// This condition_variable member is called from the kernel, and therefore, cannot block, but it can spin.
 	    lock( cond->lock __cfaabi_dbg_ctx2 );
-	    
-	    if ( i->listed ) {			// is thread on queue
+	    if ( listed(i) ) {			// is thread on queue
+	    	i->signalled = false;
 	    	cond->last_thread = i;		// REMOVE THIS AFTER DEBUG
 			remove( cond->blocked_threads, *i );		 //remove this thread O(1)
@@ -227,5 +221,5 @@
 	void process_popped( condition_variable(L) & this, info_thread(L) & popped ) with( this ) {
 		if(&popped != 0p) {
-			popped.listed = false;
+			popped.signalled = true;
 			count--;
 			if (popped.lock) {
@@ -266,5 +260,4 @@
 		addTail( blocked_threads, *i );
 		count++;
-		i->listed = true;
 		size_t recursion_count = 0;
 		if (i->lock) {
@@ -308,22 +301,26 @@
 	}
 	
-	void wait( condition_variable(L) & this, Duration duration ) with(this) {
+	bool wait( condition_variable(L) & this, Duration duration ) with(this) {
 		info_thread( L ) i = { active_thread() };
 		queue_info_thread_timeout(this, i, __kernel_get_time() + duration );
-	}
-
-	void wait( condition_variable(L) & this, uintptr_t info, Duration duration ) with(this) { 
+		return i.signalled;
+	}
+
+	bool wait( condition_variable(L) & this, uintptr_t info, Duration duration ) with(this) { 
 		info_thread( L ) i = { active_thread(), info };
 		queue_info_thread_timeout(this, i, __kernel_get_time() + duration );
-	}
-
-	void wait( condition_variable(L) & this, Time time ) with(this) {
+		return i.signalled;
+	}
+
+	bool wait( condition_variable(L) & this, Time time ) with(this) {
 		info_thread( L ) i = { active_thread() };
 		queue_info_thread_timeout(this, i, time);
-	}
-
-	void wait( condition_variable(L) & this, uintptr_t info, Time time ) with(this) {
+		return i.signalled;
+	}
+
+	bool wait( condition_variable(L) & this, uintptr_t info, Time time ) with(this) {
 		info_thread( L ) i = { active_thread(), info };
 		queue_info_thread_timeout(this, i, time);
+		return i.signalled;
 	}
 
@@ -340,26 +337,30 @@
 	}
 	
-	void wait( condition_variable(L) & this, L & l, Duration duration ) with(this) {
+	bool wait( condition_variable(L) & this, L & l, Duration duration ) with(this) {
 		info_thread(L) i = { active_thread() };
 		i.lock = &l;
 		queue_info_thread_timeout(this, i, __kernel_get_time() + duration );
-	}
-	
-	void wait( condition_variable(L) & this, L & l, uintptr_t info, Duration duration ) with(this) {
+		return i.signalled;
+	}
+	
+	bool wait( condition_variable(L) & this, L & l, uintptr_t info, Duration duration ) with(this) {
 		info_thread(L) i = { active_thread(), info };
 		i.lock = &l;
 		queue_info_thread_timeout(this, i, __kernel_get_time() + duration );
-	}
-	
-	void wait( condition_variable(L) & this, L & l, Time time ) with(this) {
+		return i.signalled;
+	}
+	
+	bool wait( condition_variable(L) & this, L & l, Time time ) with(this) {
 		info_thread(L) i = { active_thread() };
 		i.lock = &l;
 		queue_info_thread_timeout(this, i, time );
-	}
-	
-	void wait( condition_variable(L) & this, L & l, uintptr_t info, Time time ) with(this) {
+		return i.signalled;
+	}
+	
+	bool wait( condition_variable(L) & this, L & l, uintptr_t info, Time time ) with(this) {
 		info_thread(L) i = { active_thread(), info };
 		i.lock = &l;
 		queue_info_thread_timeout(this, i, time );
-	}
-}
+		return i.signalled;
+	}
+}
