Index: src/tests/.expect/64/gmp.txt
===================================================================
--- src/tests/.expect/64/gmp.txt	(revision 6e206cb61aa9a135c29ec45c7a2e86503d93a644)
+++ src/tests/.expect/64/gmp.txt	(revision 79b5869e2bd89e2defed0b6c4eb9dd2b9ec60cc5)
@@ -4,4 +4,5 @@
 conversions
 y:97
+y:12345678901234567890123456789
 y:3
 y:-3
@@ -24,4 +25,5 @@
 z:150000000000000000000
 z:16666666666666666666
+16666666666666666666, 2 16666666666666666666, 2
 x:16666666666666666666 y:2
 
Index: src/tests/.expect/concurrent/sched-int-block.txt
===================================================================
--- src/tests/.expect/concurrent/sched-int-block.txt	(revision 79b5869e2bd89e2defed0b6c4eb9dd2b9ec60cc5)
+++ src/tests/.expect/concurrent/sched-int-block.txt	(revision 79b5869e2bd89e2defed0b6c4eb9dd2b9ec60cc5)
@@ -0,0 +1,2 @@
+Starting waiters
+Waiters done
Index: src/tests/Makefile.am
===================================================================
--- src/tests/Makefile.am	(revision 6e206cb61aa9a135c29ec45c7a2e86503d93a644)
+++ src/tests/Makefile.am	(revision 79b5869e2bd89e2defed0b6c4eb9dd2b9ec60cc5)
@@ -22,5 +22,5 @@
 concurrent=yes
 quick_test+= coroutine thread monitor
-concurrent_test=coroutine thread monitor multi-monitor sched-int-disjoint sched-int-barge sched-int-wait sched-ext sched-ext-multi preempt
+concurrent_test=coroutine thread monitor multi-monitor sched-int-barge sched-int-block sched-int-disjoint sched-int-wait sched-ext sched-ext-multi preempt
 else
 concurrent=no
Index: src/tests/Makefile.in
===================================================================
--- src/tests/Makefile.in	(revision 6e206cb61aa9a135c29ec45c7a2e86503d93a644)
+++ src/tests/Makefile.in	(revision 79b5869e2bd89e2defed0b6c4eb9dd2b9ec60cc5)
@@ -230,5 +230,5 @@
 @BUILD_CONCURRENCY_TRUE@concurrent = yes
 @BUILD_CONCURRENCY_FALSE@concurrent_test = 
-@BUILD_CONCURRENCY_TRUE@concurrent_test = coroutine thread monitor multi-monitor sched-int-disjoint sched-int-barge sched-int-wait sched-ext sched-ext-multi preempt
+@BUILD_CONCURRENCY_TRUE@concurrent_test = coroutine thread monitor multi-monitor sched-int-barge sched-int-block sched-int-disjoint sched-int-wait sched-ext sched-ext-multi preempt
 
 # applies to both programs
Index: src/tests/gmp.c
===================================================================
--- src/tests/gmp.c	(revision 6e206cb61aa9a135c29ec45c7a2e86503d93a644)
+++ src/tests/gmp.c	(revision 79b5869e2bd89e2defed0b6c4eb9dd2b9ec60cc5)
@@ -10,11 +10,11 @@
 // Created On       : Tue Apr 19 08:55:51 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun May 14 14:46:50 2017
-// Update Count     : 530
+// Last Modified On : Mon May 22 09:05:09 2017
+// Update Count     : 538
 // 
 
 #include <gmp>
 
-int main() {
+int main( void ) {
 	sout | "constructors" | endl;
 	short int si = 3;
@@ -25,4 +25,6 @@
 	sout | "conversions" | endl;
 	y = 'a';
+	sout | "y:" | y | endl;
+	y = "12345678901234567890123456789";
 	sout | "y:" | y | endl;
 	y = si;
@@ -62,7 +64,7 @@
 	z = x / 3;
 	sout | "z:" | z | endl;
+	sout | div( x, 3 ) | x / 3 | "," | x % 3 | endl;
 	[ x, y ] = div( x, 3 );
 	sout | "x:" | x | "y:" | y | endl;
-//	sout | div( x, 3 ) | x / 3 | "," | x % 3 | endl;
 
 	sout | endl;
@@ -72,7 +74,7 @@
 	fn = (Int){0}; fn1 = fn;							// 1st case
 	sout | (int)0 | fn | endl;
-	fn = (Int){1}; fn2 = fn1; fn1 = fn;					// 2nd case
+	fn = 1; fn2 = fn1; fn1 = fn;						// 2nd case
 	sout | 1 | fn | endl;
-	for ( int i = 2; i <= 200; i += 1 ) {
+	for ( unsigned int i = 2; i <= 200; i += 1 ) {
 		fn = fn1 + fn2; fn2 = fn1; fn1 = fn;			// general case
 		sout | i | fn | endl;
@@ -83,7 +85,7 @@
 	sout | "Factorial Numbers" | endl;
 	Int fact;
-	fact = (Int){1};									// 1st case
+	fact = 1;											// 1st case
 	sout | (int)0 | fact | endl;
-	for ( int i = 1; i <= 40; i += 1 ) {
+	for ( unsigned int i = 1; i <= 40; i += 1 ) {
 		fact = fact * i;								// general case
 		sout | i | fact | endl;
Index: src/tests/sched-int-block.c
===================================================================
--- src/tests/sched-int-block.c	(revision 79b5869e2bd89e2defed0b6c4eb9dd2b9ec60cc5)
+++ src/tests/sched-int-block.c	(revision 79b5869e2bd89e2defed0b6c4eb9dd2b9ec60cc5)
@@ -0,0 +1,113 @@
+#include <fstream>
+#include <kernel>
+#include <monitor>
+#include <stdlib>
+#include <thread>
+
+static const unsigned N = 100_000;
+
+enum state_t { WAITED, SIGNAL, BARGE };
+
+monitor global_t {};
+
+monitor global_data_t {
+	state_t state;
+	bool ran;
+};
+
+void ?{} ( global_data_t * this ) {
+	this->state = BARGE;
+}
+
+void ^?{} ( global_data_t * this ) {}
+
+global_data_t globalA, globalB;
+
+condition cond;
+
+volatile bool done;
+
+//------------------------------------------------------------------------------
+void wait_op( global_data_t * mutex a, global_data_t * mutex b, unsigned i ) {
+	wait( &cond );
+	a->ran = b->ran = true;
+
+	yield( ((unsigned)rand48()) % 10 );
+
+	if(a->state != SIGNAL || b->state != SIGNAL) {
+		sout | "ERROR Barging detected" | a->state | b->state | endl;
+		abort();
+	}
+
+	a->state = b->state = WAITED;
+
+	yield( ((unsigned)rand48()) % 10 );
+}
+
+thread Waiter {};
+void main( Waiter* this ) {
+	for( int i = 0; i < N; i++ ) {
+		wait_op( &globalA, &globalB, i );
+	}
+}
+
+//------------------------------------------------------------------------------
+void signal_op( global_data_t * mutex a, global_data_t * mutex b ) {
+	yield( ((unsigned)rand48()) % 10 );
+
+	a->ran = b->ran = false;
+	a->state = b->state = SIGNAL;
+
+	signal_block( &cond );
+
+	yield( ((unsigned)rand48()) % 10 );
+
+	assert(a->ran == b->ran);
+	if(a->ran)
+	{
+		if(a->state != WAITED || b->state != WAITED) {
+			sout | "ERROR Barging detected" | a->state | b->state | endl;
+			abort();
+		}
+	}
+
+}
+
+thread Signaller {};
+void main( Signaller* this ) {
+	while( !done ) {
+		signal_op( &globalA, &globalB );
+	}
+}
+
+//------------------------------------------------------------------------------
+void barge_op( global_data_t * mutex a ) {
+	a->state = BARGE;
+}
+
+thread Barger {};
+void main( Barger* this ) {
+	for( unsigned i = 0; !done; i++ ) {
+		//Choose some monitor to barge into with some irregular pattern
+		bool choose_a = (i % 13) > (i % 17);
+		barge_op( choose_a ? &globalA : &globalB );
+	}
+}
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[]) {
+	rand48seed(0);
+	done = false;
+	processor p;
+	{
+		Signaller s[4];
+		Barger b[13];
+		sout | "Starting waiters" | endl;
+		{
+			Waiter w[3];
+		}
+		sout | "Waiters done" | endl;
+		done = true;
+	}
+}
