Index: src/tests/.expect/concurrent/sched-int-multi.txt
===================================================================
--- src/tests/.expect/concurrent/sched-int-multi.txt	(revision 13e2c5463cbe778bd0973396e2ec5ae662ad39e7)
+++ src/tests/.expect/concurrent/sched-int-multi.txt	(revision a933dcf4f76c961f7d549e1d12cb5c25c204c120)
@@ -1,7 +1,100 @@
-Waiting All
-Entering A
-Entering A & B
-Signal
-Leaving  A & B
-Leaving  A
-Done waiting
+1000
+2000
+3000
+4000
+5000
+6000
+7000
+8000
+9000
+10000
+11000
+12000
+13000
+14000
+15000
+16000
+17000
+18000
+19000
+20000
+21000
+22000
+23000
+24000
+25000
+26000
+27000
+28000
+29000
+30000
+31000
+32000
+33000
+34000
+35000
+36000
+37000
+38000
+39000
+40000
+41000
+42000
+43000
+44000
+45000
+46000
+47000
+48000
+49000
+50000
+51000
+52000
+53000
+54000
+55000
+56000
+57000
+58000
+59000
+60000
+61000
+62000
+63000
+64000
+65000
+66000
+67000
+68000
+69000
+70000
+71000
+72000
+73000
+74000
+75000
+76000
+77000
+78000
+79000
+80000
+81000
+82000
+83000
+84000
+85000
+86000
+87000
+88000
+89000
+90000
+91000
+92000
+93000
+94000
+95000
+96000
+97000
+98000
+99000
+100000
Index: src/tests/sched-int-multi.c
===================================================================
--- src/tests/sched-int-multi.c	(revision 13e2c5463cbe778bd0973396e2ec5ae662ad39e7)
+++ src/tests/sched-int-multi.c	(revision a933dcf4f76c961f7d549e1d12cb5c25c204c120)
@@ -4,50 +4,85 @@
 #include <thread>
 
+enum state_t { WAIT, SIGNAL, BARGE };
+
 monitor global_t {};
 
+monitor global_data_t {
+	bool done;
+	int counter;
+	state_t state;
+};
+
+void ?{} ( global_data_t * this ) {
+	this->done = false;
+	this->counter = 0;
+	this->state = BARGE;
+}
+
+void ^?{} ( global_data_t * this ) {}
+
+global_t globalA;
 global_t globalB;
-global_t globalA;
+global_data_t globalC;
 
 condition cond;
 
-thread Signalee {};
-thread Signaler {};
+thread Threads {};
 
-void signalee_action( global_t * mutex a, global_t * mutex b ) {
-	sout | "Waiting All" | endl;
-	wait( &cond );
-	sout | "Done waiting" | endl;
+bool logicC( global_t * mutex a, global_t * mutex b, global_data_t * mutex c ) {
+	c->counter++;
+
+	int action = c->counter % 10;
+
+	if( action == 1 || action == 3 ) {
+		if(c->state != BARGE) {
+			sout | "ERROR Mutual exclusion is inconsistent for wait" | endl;
+			abort();
+		}
+
+		c->state = WAIT;
+		wait( &cond );
+
+		if(c->state != SIGNAL) {
+			sout | "ERROR Barging detected" | endl;
+			abort();
+		}
+	}
+	else if( action == 6 ) {
+		if(c->state != BARGE) {
+			sout | "ERROR Mutual exclusion is inconsistent for signal" | endl;
+			abort();
+		}
+
+		c->state = SIGNAL;
+
+		signal( &cond );
+		signal( &cond );
+	}
+	else {
+		c->state = BARGE;
+	}
+
+	if( (c->counter % 1000) == 0 ) sout | c->counter | endl;
+	if( c->counter == 100_000 ) c->done = true;
+	return !c->done;
 }
 
-void main( Signalee* this ) {
-	signalee_action( &globalA, &globalB );
+bool logicB( global_t * mutex a, global_t * mutex b ) {
+	return logicC(a, b, &globalC);
 }
 
-void signaler_action_inner( global_t * mutex a, global_t * mutex b ) {
-	sout | "Entering A & B" | endl;
-	sout | "Signal" | endl;
-	signal( &cond );
-	sout | "Leaving  A & B" | endl;
+bool logicA( global_t * mutex a ) {
+	return logicB(a, &globalB);
 }
 
-void signaler_action( global_t * mutex a, global_t * b ) {
-	sout | "Entering A" | endl;
-	signaler_action_inner( a, b );
-	sout | "Leaving  A" | endl;
-}
-
-void main( Signaler* this ) {
-	for(int i = 0; i < 10_000; i++) {
-		asm volatile ("" : : : "memory");
-	}
-
-	signaler_action( &globalA, &globalB );
+void main( Threads* this ) {
+	while( logicA(&globalA) ) { yield(); };
 }
 
 int main(int argc, char* argv[]) {
-	processor p;
+	processor p[3];
 	{
-		Signalee a;
-		Signaler b;
+		Threads t[20];
 	}
 }
