Index: libcfa/src/concurrency/kernel/fwd.hfa
===================================================================
--- libcfa/src/concurrency/kernel/fwd.hfa	(revision aeb20a4d256d7e9fe5da6b3be21994f201fa9cbe)
+++ libcfa/src/concurrency/kernel/fwd.hfa	(revision c06551b988f564d4bba9f99c9aeec146690e3599)
@@ -200,5 +200,4 @@
 					struct thread$ * expected = this.ptr;
 					if(expected == 1p) return false;
-					/* paranoid */ verify( expected == 0p );
 					if(__atomic_compare_exchange_n(&this.ptr, &expected, active_thread(), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {
 						park();
@@ -213,5 +212,5 @@
 			thread$ * post(oneshot & this, bool do_unpark = true) {
 				struct thread$ * got = __atomic_exchange_n( &this.ptr, 1p, __ATOMIC_SEQ_CST);
-				if( got == 0p ) return 0p;
+				if( got == 0p || got == 1p ) return 0p;
 				if(do_unpark) unpark( got );
 				return got;
@@ -263,5 +262,4 @@
 
 					// The future is not fulfilled, try to setup the wait context
-					/* paranoid */ verify( expected == 0p );
 					if(__atomic_compare_exchange_n(&this.ptr, &expected, &wait_ctx, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {
 						return true;
@@ -275,20 +273,20 @@
 			// should retract the wait ctx
 			// intented to be use by wait, wait_any, waitfor, etc. rather than used directly
-			void retract( future_t & this, oneshot & wait_ctx ) {
+			bool retract( future_t & this, oneshot & wait_ctx ) {
 				// Remove the wait context
 				struct oneshot * got = __atomic_exchange_n( &this.ptr, 0p, __ATOMIC_SEQ_CST);
 
 				// got == 0p: future was never actually setup, just return
-				if( got == 0p ) return;
+				if( got == 0p ) return false;
 
 				// got == wait_ctx: since fulfil does an atomic_swap,
 				// if we got back the original then no one else saw context
 				// It is safe to delete (which could happen after the return)
-				if( got == &wait_ctx ) return;
+				if( got == &wait_ctx ) return false;
 
 				// got == 1p: the future is ready and the context was fully consumed
 				// the server won't use the pointer again
 				// It is safe to delete (which could happen after the return)
-				if( got == 1p ) return;
+				if( got == 1p ) return true;
 
 				// got == 2p: the future is ready but the context hasn't fully been consumed
@@ -296,5 +294,5 @@
 				if( got == 2p ) {
 					while( this.ptr != 1p ) Pause();
-					return;
+					return false;
 				}
 
@@ -379,4 +377,26 @@
 				return ret;
 			}
+
+			// Wait for any future to be fulfilled
+			future_t & wait_any( future_t * futures, size_t num_futures ) {
+				oneshot temp;
+
+				// setup all futures
+				// if any are already satisfied return
+				for ( i; num_futures ) {
+					if( !setup(futures[i], temp) ) return futures[i];
+				}
+				
+				// Wait context is setup, just wait on it
+				wait( temp );
+				
+				size_t ret;
+				// attempt to retract all futures
+				for ( i; num_futures ) {
+					if ( retract( futures[i], temp ) ) ret = i;
+				}
+				
+				return futures[ret];
+			}
 		}
 
