Index: libcfa/src/concurrency/kernel/fwd.hfa
===================================================================
--- libcfa/src/concurrency/kernel/fwd.hfa	(revision 254ad1b52e2ee6c74b7c67d7ff2a946c1f613982)
+++ libcfa/src/concurrency/kernel/fwd.hfa	(revision c7015e6b0399c7efde4f094495d88dc518c417cc)
@@ -219,9 +219,9 @@
 			// Mark as fulfilled, wake thread if needed
 			// return true if a thread was unparked
-			bool post(oneshot & this) {
+			$thread * post(oneshot & this, bool do_unpark = true) {
 				struct $thread * got = __atomic_exchange_n( &this.ptr, 1p, __ATOMIC_SEQ_CST);
-				if( got == 0p ) return false;
-				unpark( got );
-				return true;
+				if( got == 0p ) return 0p;
+				if(do_unpark) unpark( got );
+				return got;
 			}
 		}
@@ -335,5 +335,5 @@
 			// from the server side, mark the future as fulfilled
 			// delete it if needed
-			bool fulfil( future_t & this ) {
+			$thread * fulfil( future_t & this, bool do_unpark = true  ) {
 				for() {
 					struct oneshot * expected = this.ptr;
@@ -343,5 +343,5 @@
 						#pragma GCC diagnostic ignored "-Wfree-nonheap-object"
 					#endif
-						if( expected == 3p ) { free( &this ); return false; }
+						if( expected == 3p ) { free( &this ); return 0p; }
 					#if defined(__GNUC__) && __GNUC__ >= 7
 						#pragma GCC diagnostic pop
@@ -355,6 +355,6 @@
 					struct oneshot * want = expected == 0p ? 1p : 2p;
 					if(__atomic_compare_exchange_n(&this.ptr, &expected, want, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) {
-						if( expected == 0p ) { /* paranoid */ verify( this.ptr == 1p); return false; }
-						bool ret = post( *expected );
+						if( expected == 0p ) { /* paranoid */ verify( this.ptr == 1p); return 0p; }
+						$thread * ret = post( *expected, do_unpark );
 						__atomic_store_n( &this.ptr, 1p, __ATOMIC_SEQ_CST);
 						return ret;
