Index: src/tests/concurrent/examples/boundedBufferEXT.c
===================================================================
--- src/tests/concurrent/examples/boundedBufferEXT.c	(revision 88f15ae7977cd21fe85f845fd0a70397546352f8)
+++ src/tests/concurrent/examples/boundedBufferEXT.c	(revision f6f0cca3f172613989f420c40761026fe191b651)
@@ -8,6 +8,6 @@
 // Created On       : Wed Apr 18 22:52:12 2018
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Apr 18 22:56:17 2018
-// Update Count     : 2
+// Last Modified On : Fri Apr 20 22:25:14 2018
+// Update Count     : 6
 // 
 
@@ -20,5 +20,5 @@
 //Duration default_preemption() { return 0; }
 
-enum { BufferSize = 5 };
+enum { BufferSize = 50 };
 
 forall( otype T )
@@ -33,4 +33,7 @@
 forall( otype T )
 int query( Buffer(T) & buffer ) { return buffer.count; }
+
+forall( otype T )										// forward
+T remove( Buffer(T) & mutex buffer );
 
 forall( otype T )
Index: src/tests/concurrent/examples/boundedBufferINT.c
===================================================================
--- src/tests/concurrent/examples/boundedBufferINT.c	(revision 88f15ae7977cd21fe85f845fd0a70397546352f8)
+++ src/tests/concurrent/examples/boundedBufferINT.c	(revision f6f0cca3f172613989f420c40761026fe191b651)
@@ -8,38 +8,45 @@
 // Created On       : Mon Oct 30 12:45:13 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jan  2 12:18:18 2018
-// Update Count     : 33
+// Last Modified On : Fri Apr 20 22:18:18 2018
+// Update Count     : 78
 //
 
-#include <stdlib>
-#include <fstream>										// random
+#include <stdlib>										// random
+#include <fstream>
 #include <kernel>
 #include <thread>
 #include <unistd.h>										// getpid
 
+//Duration default_preemption() { return 0; }
+
+enum { BufferSize = 50 };
+
+forall( otype T )
 monitor Buffer {
 	condition full, empty;
 	int front, back, count;
-	int elements[20];
+	T elements[BufferSize];
 };
 
-void ?{}( Buffer & buffer ) {
-	buffer.front = buffer.back = buffer.count = 0;
-}
+forall( otype T )
+void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; }
 
-int query( Buffer & buffer ) { return buffer.count; }
+forall( otype T )
+int query( Buffer(T) & buffer ) { return buffer.count; }
 
-void insert( Buffer & mutex buffer, int elem ) with( buffer ) {
-	if ( count == 20 ) wait( empty );
+forall( otype T )
+void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
+	if ( count == BufferSize ) wait( empty );
 	elements[back] = elem;
-	back = ( back + 1 ) % 20;
+	back = ( back + 1 ) % BufferSize;
 	count += 1;
 	signal( full );
 }
 
-int remove( Buffer & mutex buffer ) with( buffer ) {
+forall( otype T )
+T remove( Buffer(T) & mutex buffer ) with( buffer ) {
 	if ( count == 0 ) wait( full );
-	int elem = elements[front];
-	front = ( front + 1 ) % 20;
+	T elem = elements[front];
+	front = ( front + 1 ) % BufferSize;
 	count -= 1;
 	signal( empty );
@@ -47,16 +54,17 @@
 }
 
+const int Sentinel = -1;
+
 thread Producer {
-	Buffer & buffer;
+	Buffer(int) & buffer;
 	unsigned int N;
 };
-void main( Producer & prod ) {
-	for ( int i = 1; i <= prod.N; i += 1 ) {
+void main( Producer & prod ) with( prod ) {
+	for ( int i = 1; i <= N; i += 1 ) {
 		yield( random( 5 ) );
-		insert( prod.buffer, 1 );
+		insert( buffer, 1 );
 	} // for
-	insert( prod.buffer, -1 );
 }
-void ?{}( Producer & prod, Buffer * buffer, unsigned int N ) {
+void ?{}( Producer & prod, Buffer(int) * buffer, int N ) {
 	&prod.buffer = buffer;
 	prod.N = N;
@@ -64,27 +72,26 @@
 
 thread Consumer {
-	Buffer & buffer;
-	int & sum;						// summation of producer values
+	Buffer(int) & buffer;
+	int & sum;											// summation of producer values
 };
-void main( Consumer & cons ) {
-	cons.sum = 0;
+void main( Consumer & cons ) with( cons ) {
+	sum = 0;
 	for ( ;; ) {
 		yield( random( 5 ) );
-		int item = remove( cons.buffer );
-		if ( item == -1 ) break;				// sentinel ?
-		cons.sum += item;
+		int item = remove( buffer );
+	  if ( item == Sentinel ) break;					// sentinel ?
+		sum += item;
 	} // for
 }
-void ?{}( Consumer & cons, Buffer * buffer, int * sum ) {
+void ?{}( Consumer & cons, Buffer(int) * buffer, int & sum ) {
 	&cons.buffer = buffer;
-	&cons.sum = sum;
+	&cons.sum = &sum;
 }
 
 int main() {
-	Buffer buffer;
-	enum { Prods = 5, Cons = 5 };
+	Buffer(int) buffer;
+	enum { Prods = 4, Cons = 5 };
 	Producer * prods[Prods];
 	Consumer * cons[Cons];
-	const int Sentinel = -1;
 	int sums[Cons];
 	int i;
@@ -94,19 +101,19 @@
 	srandom( 1003 );
 
-	for ( i = 0; i < Cons; i += 1 ) {			// create consumers
-		cons[i] = new( &buffer, &sums[i] );
+	for ( i = 0; i < Cons; i += 1 ) {					// create consumers
+		cons[i] = new( &buffer, sums[i] );
 	} // for
-	for ( i = 0; i < Prods; i += 1 ) {			// create producers
-		prods[i] = new( &buffer, 100000u );
+	for ( i = 0; i < Prods; i += 1 ) {					// create producers
+		prods[i] = new( &buffer, 100000 );
 	} // for
 
-	for ( i = 0; i < Prods; i += 1 ) {			// wait for producers to finish
+	for ( i = 0; i < Prods; i += 1 ) {					// wait for producers to finish
 		delete( prods[i] );
 	} // for
-	for ( i = 0; i < Cons; i += 1 ) {			// generate sentinal values to stop consumers
+	for ( i = 0; i < Cons; i += 1 ) {					// generate sentinal values to stop consumers
 		insert( buffer, Sentinel );
 	} // for
 	int sum = 0;
-	for ( i = 0; i < Cons; i += 1 ) {			// wait for consumers to finish
+	for ( i = 0; i < Cons; i += 1 ) {					// wait for consumers to finish
 		delete( cons[i] );
 		sum += sums[i];
@@ -117,4 +124,4 @@
 // Local Variables: //
 // tab-width: 4 //
-// compile-command: "cfa boundedBuffer.c" //
+// compile-command: "cfa boundedBufferINT.c" //
 // End: //
