Index: libcfa/src/iostream.cfa
===================================================================
--- libcfa/src/iostream.cfa	(revision e638266cf047054e590f284eaed37617f4069afa)
+++ libcfa/src/iostream.cfa	(revision 85d8153362477eb1dea347a576c25be02bf7fa07)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Apr 20 19:09:41 2021
-// Update Count     : 1325
+// Last Modified On : Sat Apr 24 10:03:54 2021
+// Update Count     : 1329
 //
 
@@ -36,5 +36,5 @@
 
 
-forall( ostype & | ostream( ostype ) ) {
+forall( ostype & | basic_ostream( ostype ) ) {
 	ostype & ?|?( ostype & os, bool b ) {
 		if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) );
@@ -294,6 +294,7 @@
 
 		// last character IS spacing or opening punctuation => turn off separator for next item
-		size_t len = strlen( s );
+		int len = strlen( s );
 		ch = s[len - 1];								// must make unsigned
+		fmt( os, "%s", s );								// fmt resets seperator, but reset it again
 		if ( sepPrt$( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {
 			sepOn( os );
@@ -302,5 +303,6 @@
 		} // if
 		if ( ch == '\n' ) setNL$( os, true );			// check *AFTER* sepPrt$ call above as it resets NL flag
-		return write( os, s, len );
+		return os;
+//		return write( os, s, len );
 	} // ?|?
 	void ?|?( ostype & os, const char s[] ) {
@@ -397,5 +399,7 @@
 		return os;
 	} // nlOff
-
+} // distribution
+
+forall( ostype & | ostream( ostype ) ) {
 	ostype & acquire( ostype & os ) {
 		acquire( os );									// call void returning
@@ -445,5 +449,5 @@
 // Default prefix for non-decimal prints is 0b, 0, 0x.
 #define IntegralFMTImpl( T, IFMTNP, IFMTP ) \
-forall( ostype & | ostream( ostype ) ) { \
+forall( ostype & | basic_ostream( ostype ) ) { \
 	ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \
 		if ( sepPrt$( os ) ) fmt( os, "%s", sepGetCur$( os ) ); \
@@ -539,5 +543,5 @@
 #if defined( __SIZEOF_INT128__ )
 // Default prefix for non-decimal prints is 0b, 0, 0x.
-forall( ostype & | ostream( ostype ) )
+forall( ostype & | basic_ostream( ostype ) )
 static inline void base_128( ostype & os, unsigned int128 val, unsigned int128 power, _Ostream_Manip(uint64_t) & f, unsigned int maxdig, unsigned int bits, unsigned int cnt = 0 ) {
 	int wd = 1;											// f.wd is never 0 because 0 implies left-pad
@@ -604,5 +608,5 @@
 
 #define IntegralFMTImpl128( T ) \
-forall( ostype & | ostream( ostype ) ) { \
+forall( ostype & | basic_ostream( ostype ) ) { \
 	ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \
 		_Ostream_Manip(uint64_t) fmt; \
@@ -677,5 +681,5 @@
 
 #define FloatingPointFMTImpl( T, DFMTNP, DFMTP ) \
-forall( ostype & | ostream( ostype ) ) { \
+forall( ostype & | basic_ostream( ostype ) ) { \
 	static void eng( T &value, int & pc, int & exp10 ) { \
 		exp10 = lrint( floor( log10( abs( value ) ) ) ); /* round to desired precision */ \
@@ -723,5 +727,5 @@
 // *********************************** character ***********************************
 
-forall( ostype & | ostream( ostype ) ) {
+forall( ostype & | basic_ostream( ostype ) ) {
 	ostype & ?|?( ostype & os, _Ostream_Manip(char) f ) {
 		if ( f.base != 'c' ) {							// bespoke binary/octal/hex format
@@ -756,5 +760,5 @@
 // *********************************** C string ***********************************
 
-forall( ostype & | ostream( ostype ) ) {
+forall( ostype & | basic_ostream( ostype ) ) {
 	ostype & ?|?( ostype & os, _Ostream_Manip(const char *) f ) {
 		if ( ! f.val ) return os;						// null pointer ?
Index: libcfa/src/iostream.hfa
===================================================================
--- libcfa/src/iostream.hfa	(revision e638266cf047054e590f284eaed37617f4069afa)
+++ libcfa/src/iostream.hfa	(revision 85d8153362477eb1dea347a576c25be02bf7fa07)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Apr 20 19:09:44 2021
-// Update Count     : 385
+// Last Modified On : Sat Apr 24 09:28:56 2021
+// Update Count     : 393
 //
 
@@ -22,5 +22,5 @@
 
 
-trait ostream( ostype & ) {
+trait basic_ostream( ostype & ) {
 	// private
 	bool sepPrt$( ostype & );							// get separator state (on/off)
@@ -47,12 +47,15 @@
 	void sepSetTuple( ostype &, const char [] );		// set tuple separator to string (15 character maximum)
 
-	void ends( ostype & os );							// end of output statement
-	int fail( ostype & );
+	void ends( ostype & );								// end of output statement
+	int fmt( ostype &, const char format[], ... ) __attribute__(( format(printf, 2, 3) ));
 	int flush( ostype & );
-	void open( ostype & os, const char name[], const char mode[] );
-	void close( ostype & os );
+}; // basic_ostream
+	
+trait ostream( ostype & | basic_ostream( ostype ) ) {
+	bool fail( ostype & );								// operation failed?
+	void open( ostype &, const char name[], const char mode[] );
+	void close( ostype & );
 	ostype & write( ostype &, const char [], size_t );
-	int fmt( ostype &, const char format[], ... ) __attribute__(( format(printf, 2, 3) ));
-	void acquire( ostype & );
+	void acquire( ostype & );							// concurrent access
 }; // ostream
 
@@ -67,5 +70,5 @@
 // implement writable for intrinsic types
 
-forall( ostype & | ostream( ostype ) ) {
+forall( ostype & | basic_ostream( ostype ) ) {
 	ostype & ?|?( ostype &, bool );
 	void ?|?( ostype &, bool );
@@ -138,4 +141,7 @@
 	ostype & nlOn( ostype & );
 	ostype & nlOff( ostype & );
+} // distribution
+
+forall( ostype & | ostream( ostype ) ) {
 	ostype & acquire( ostype & );
 } // distribution
@@ -196,5 +202,5 @@
 	_Ostream_Manip(T) & sign( _Ostream_Manip(T) & fmt ) { fmt.flags.sign = true; return fmt; } \
 } /* distribution */ \
-forall( ostype & | ostream( ostype ) ) { \
+forall( ostype & | basic_ostream( ostype ) ) { \
 	ostype & ?|?( ostype & os, _Ostream_Manip(T) f ); \
 	void ?|?( ostype & os, _Ostream_Manip(T) f ); \
@@ -241,5 +247,5 @@
 	_Ostream_Manip(T) & unit( _Ostream_Manip(T) & fmt ) { fmt.flags.nobsdp = true; return fmt; } \
 } /* distribution */ \
-forall( ostype & | ostream( ostype ) ) { \
+forall( ostype & | basic_ostream( ostype ) ) { \
 	ostype & ?|?( ostype & os, _Ostream_Manip(T) f ); \
 	void ?|?( ostype & os, _Ostream_Manip(T) f ); \
@@ -261,5 +267,5 @@
 	_Ostream_Manip(char) & nobase( _Ostream_Manip(char) & fmt ) { fmt.flags.nobsdp = true; return fmt; }
 } // distribution
-forall( ostype & | ostream( ostype ) ) {
+forall( ostype & | basic_ostream( ostype ) ) {
 	ostype & ?|?( ostype & os, _Ostream_Manip(char) f );
 	void ?|?( ostype & os, _Ostream_Manip(char) f );
@@ -279,5 +285,5 @@
 	_Ostream_Manip(const char *) & nobase( _Ostream_Manip(const char *) & fmt ) { fmt.flags.nobsdp = true; return fmt; }
 } // distribution
-forall( ostype & | ostream( ostype ) ) {
+forall( ostype & | basic_ostream( ostype ) ) {
 	ostype & ?|?( ostype & os, _Ostream_Manip(const char *) f );
 	void ?|?( ostype & os, _Ostream_Manip(const char *) f );
@@ -294,5 +300,5 @@
 
 	void ends( istype & os );							// end of output statement
-	int fail( istype & );
+	bool fail( istype & );
 	int eof( istype & );
 	void open( istype & is, const char name[] );
