Index: tests/concurrent/futures/multi.cfa
===================================================================
--- tests/concurrent/futures/multi.cfa	(revision 84cd72d2bd79d578296b7f9b6a027edd2703da3c)
+++ tests/concurrent/futures/multi.cfa	(revision b374dbcdcbe91cf6b881e5c289e6fd6cbd0834d7)
@@ -5,5 +5,5 @@
 
 thread Server {
-	int cnt, iteration;
+	int pending, done, iteration;
 	multi_future(int) * request;
 };
@@ -11,5 +11,6 @@
 void ?{}( Server & this ) {
 	((thread&)this){"Server Thread"};
-	this.cnt = 0;
+	this.pending = 0;
+	this.done = 0;
 	this.iteration = 0;
 	this.request = 0p;
@@ -17,6 +18,6 @@
 
 void ^?{}( Server & mutex this ) {
-	assert(this.cnt == 0);
-    this.request = 0p;
+	assert(this.pending == 0);
+	this.request = 0p;
 }
 
@@ -25,30 +26,31 @@
 }
 
-void process( Server & mutex this ) {
-	fulfil( *this.request, this.iteration );
-	this.iteration++;
+void call( Server & mutex this ) {
+	this.pending++;
 }
 
-void call( Server & mutex this ) {
-	this.cnt++;
+void finish( Server & mutex this ) {
+	this.done++;
 }
 
-void finish( Server & mutex this ) { }
-
 void main( Server & this ) {
+	MAIN_LOOP:
 	for() {
 		waitfor( ^?{} : this ) {
 			break;
 		}
-		or when( this.cnt < NFUTURES ) waitfor( call: this ) {
-			if (this.cnt == NFUTURES) {
-				process(this);
+		or waitfor( call: this ) {
+			if (this.pending != NFUTURES) { continue MAIN_LOOP; }
+
+			this.pending = 0;
+			fulfil( *this.request, this.iteration );
+			this.iteration++;
+
+			for(NFUTURES) {
+				waitfor( finish: this );
 			}
-		}
-		or waitfor( finish: this ) {
-			if (this.cnt == NFUTURES) {
-				reset( *this.request );
-				this.cnt = 0;
-			}
+
+			reset( *this.request );
+			this.done = 0;
 		}
 	}
