Index: libcfa/src/concurrency/kernel/fwd.hfa
===================================================================
--- libcfa/src/concurrency/kernel/fwd.hfa	(revision c06551b988f564d4bba9f99c9aeec146690e3599)
+++ libcfa/src/concurrency/kernel/fwd.hfa	(revision 1c56bf7102e90c1bc70a37565dadd8a811d1d3e4)
@@ -274,29 +274,33 @@
 			// intented to be use by wait, wait_any, waitfor, etc. rather than used directly
 			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 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 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 true;
-
-				// got == 2p: the future is ready but the context hasn't fully been consumed
-				// spin until it is safe to move on
-				if( got == 2p ) {
-					while( this.ptr != 1p ) Pause();
-					return false;
-				}
-
-				// got == any thing else, something wen't wrong here, abort
-				abort("Future in unexpected state");
+				for() {
+					struct oneshot * expected = this.ptr;
+
+					// expected == 0p: future was never actually setup, just return
+					if( expected == 0p ) return false;
+
+					// expected == 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( expected == 1p ) return true;
+
+					// expected == 2p: the future is ready but the context hasn't fully been consumed
+					// spin until it is safe to move on
+					if( expected == 2p ) {
+						while( this.ptr != 1p ) Pause();
+						/* paranoid */ verify( this.ptr != 1p );
+						return true;
+					}
+
+					// expected != wait_ctx: the future was setup with a different context ?!?!
+					// something went wrong here, abort
+					if( expected != &wait_ctx ) abort("Future in unexpected state");
+
+					// we still have the original context, then no one else saw it
+					// attempt to remove the context so it doesn't get consumed.
+					if(__atomic_compare_exchange_n( &this.ptr, &expected, 0p, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {
+						return false;
+					}
+				}
 			}
 
