Index: src/tests/.expect/concurrent/sched-int-multi2.txt
===================================================================
--- src/tests/.expect/concurrent/sched-int-multi2.txt	(revision 13e2c5463cbe778bd0973396e2ec5ae662ad39e7)
+++ src/tests/.expect/concurrent/sched-int-multi2.txt	(revision 13e2c5463cbe778bd0973396e2ec5ae662ad39e7)
@@ -0,0 +1,12 @@
+Waiting 1
+Waiting 2
+Waiting 3
+Waiting 4
+Signaling ABC
+Signaling AB
+Signaling BC
+Signaling AC
+Waking 4
+Waking 3
+Waking 2
+Waking 1
Index: src/tests/Makefile.am
===================================================================
--- src/tests/Makefile.am	(revision f621a148a747ee2f6841e0a8767c6a3c5fdc51a1)
+++ src/tests/Makefile.am	(revision 13e2c5463cbe778bd0973396e2ec5ae662ad39e7)
@@ -22,5 +22,5 @@
 concurrent=yes
 quick_test+= coroutine thread monitor
-concurrent_test=coroutine thread monitor multi-monitor sched-int sched-ext preempt
+concurrent_test=coroutine thread monitor multi-monitor sched-int sched-int-multi sched-int-multi2 sched-ext sched-ext-multi preempt
 else
 concurrent=no
Index: src/tests/Makefile.in
===================================================================
--- src/tests/Makefile.in	(revision f621a148a747ee2f6841e0a8767c6a3c5fdc51a1)
+++ src/tests/Makefile.in	(revision 13e2c5463cbe778bd0973396e2ec5ae662ad39e7)
@@ -230,10 +230,10 @@
 @BUILD_CONCURRENCY_TRUE@concurrent = yes
 @BUILD_CONCURRENCY_FALSE@concurrent_test = 
-@BUILD_CONCURRENCY_TRUE@concurrent_test = coroutine thread monitor multi-monitor sched-int sched-ext preempt
-TEST_FLAGS = $(if $(test), 2> .err/${@}.log, )
+@BUILD_CONCURRENCY_TRUE@concurrent_test = coroutine thread monitor multi-monitor sched-int sched-int-multi sched-int-multi2 sched-ext sched-ext-multi preempt
 
 # applies to both programs
 EXTRA_FLAGS = 
 BUILD_FLAGS = -g -Wall -Wno-unused-function @CFA_FLAGS@ ${EXTRA_FLAGS}
+TEST_FLAGS = $(if $(test), 2> .err/${@}.log, )
 fstream_test_SOURCES = fstream_test.c
 vector_test_SOURCES = vector/vector_int.c vector/array.c vector/vector_test.c
Index: src/tests/sched-int-multi2.c
===================================================================
--- src/tests/sched-int-multi2.c	(revision 13e2c5463cbe778bd0973396e2ec5ae662ad39e7)
+++ src/tests/sched-int-multi2.c	(revision 13e2c5463cbe778bd0973396e2ec5ae662ad39e7)
@@ -0,0 +1,119 @@
+#include <fstream>
+#include <kernel>
+#include <monitor>
+#include <thread>
+
+monitor global_t {};
+
+global_t globalA;
+global_t globalB;
+global_t globalC;
+
+condition condAB, condAC, condBC, condABC;
+
+thread Signaler {};
+thread WaiterAB {};
+thread WaiterAC {};
+thread WaiterBC {};
+thread WaiterABC{};
+
+int state;
+
+/*
+multi phase
+*/
+
+//----------------------------------------------------------------------------------------------------
+// Tools
+void signal( condition * cond, global_t * mutex a, global_t * mutex b ) {
+	signal( cond );
+}
+
+void signal( condition * cond, global_t * mutex a, global_t * mutex b, global_t * mutex c ) {
+	signal( cond );
+}
+
+void wait( condition * cond, global_t * mutex a, global_t * mutex b ) {
+	state++;
+	sout | "Waiting" | state | endl;
+	wait( cond );
+	sout | "Waking" | state | endl;
+	state--;
+}
+
+void wait( condition * cond, global_t * mutex a, global_t * mutex b, global_t * mutex c ) {
+	state++;
+	sout | "Waiting" | state | endl;
+	wait( cond );
+	sout | "Waking" | state | endl;
+	state--;
+}
+
+//----------------------------------------------------------------------------------------------------
+// Signaler
+// signals respectively AB, AC, BC, ABC
+void signalerABC( global_t * mutex a, global_t * mutex b, global_t * mutex c ) {
+	sout | "Signaling ABC" | endl;
+	signal( &condABC, a, b, c );
+	sout | "Signaling AB" | endl;
+	signal( &condAB , a, b );
+	sout | "Signaling BC" | endl;
+	signal( &condBC , b, c );
+	sout | "Signaling AC" | endl;
+	signal( &condAC , a, c );
+}
+
+void signalerAB( global_t * mutex a, global_t * mutex b, global_t * c ) {
+	signalerABC(a, b, c);
+}
+
+void signalerA( global_t * mutex a, global_t * b, global_t * c ) {
+	signalerAB (a, b, c);
+}
+
+void main( Signaler* this ) {
+	while( state != 4 ) { yield(); }
+	signalerA( &globalA, &globalB, &globalC );
+}
+
+//----------------------------------------------------------------------------------------------------
+// Waiter ABC
+void main( WaiterABC* this ) {
+	while( state != 0 ) { yield(); }
+	wait( &condABC, &globalA, &globalB, &globalC );
+}
+
+//----------------------------------------------------------------------------------------------------
+// Waiter AB
+void main( WaiterAB* this ) {
+	while( state != 1 ) { yield(); }
+	wait( &condAB , &globalA, &globalB );
+}
+
+//----------------------------------------------------------------------------------------------------
+// Waiter AC
+void main( WaiterAC* this ) {
+	while( state != 2 ) { yield(); }
+	wait( &condAC , &globalA, &globalC );
+}
+
+//----------------------------------------------------------------------------------------------------
+// Waiter BC
+void main( WaiterBC* this ) {
+	while( state != 3 ) { yield(); }
+	wait( &condBC , &globalB, &globalC );
+}
+
+//----------------------------------------------------------------------------------------------------
+// Main
+int main(int argc, char* argv[]) {
+	state = 0;
+	processor p;
+	{
+		WaiterABC a;
+		WaiterAB  b;
+		WaiterBC  c;
+		WaiterAC  d;
+		Signaler  e;
+	}
+}
