Index: doc/user/user.tex
===================================================================
--- doc/user/user.tex	(revision b0f7a431679f3dd6bb471f22feea766dda4b90ef)
+++ doc/user/user.tex	(revision d3950125f9b8e14c660f3f5da742e6ad404ee9a7)
@@ -11,6 +11,6 @@
 %% Created On       : Wed Apr  6 14:53:29 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Thu Jun 22 16:53:29 2017
-%% Update Count     : 2493
+%% Last Modified On : Sat Jul  1 17:19:42 2017
+%% Update Count     : 2495
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -2612,8 +2612,8 @@
 Manipulators \Indexc{sepOn}\index{manipulator!sepOn@©sepOn©} and \Indexc{sepOff}\index{manipulator!sepOff@©sepOff©} \emph{locally} toggle printing the separator, \ie the seperator is adjusted only with respect to the next printed item.
 \begin{cfa}[mathescape=off,belowskip=0pt]
-sout | sepOn | 1 | 2 | 3 | sepOn | endl;	§\C{// separator at start of line}§
+sout | sepOn | 1 | 2 | 3 | sepOn | endl;	§\C{// separator at start/end of line}§
 \end{cfa}
 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
- 1 2 3
+® ®1 2 3® ®
 \end{cfa}
 \begin{cfa}[mathescape=off,aboveskip=0pt,belowskip=0pt]
Index: src/libcfa/fstream
===================================================================
--- src/libcfa/fstream	(revision b0f7a431679f3dd6bb471f22feea766dda4b90ef)
+++ src/libcfa/fstream	(revision d3950125f9b8e14c660f3f5da742e6ad404ee9a7)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 15 18:11:09 2017
-// Update Count     : 104
+// Last Modified On : Sat Jul  1 16:37:53 2017
+// Update Count     : 112
 //
 
@@ -24,4 +24,5 @@
 	_Bool sepDefault;
 	_Bool sepOnOff;
+	_Bool lastSepOn;
 	const char * sepCur;
 	char separator[separateSize];
@@ -35,4 +36,5 @@
 const char * sepGetCur( ofstream * );
 void sepSetCur( ofstream *, const char * );
+_Bool lastSepOn( ofstream * );
 
 // public
Index: src/libcfa/fstream.c
===================================================================
--- src/libcfa/fstream.c	(revision b0f7a431679f3dd6bb471f22feea766dda4b90ef)
+++ src/libcfa/fstream.c	(revision d3950125f9b8e14c660f3f5da742e6ad404ee9a7)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 15 18:11:11 2017
-// Update Count     : 234
+// Last Modified On : Sat Jul  1 16:37:54 2017
+// Update Count     : 242
 //
 
@@ -33,4 +33,5 @@
 	this->sepDefault = sepDefault;
 	this->sepOnOff = sepOnOff;
+	this->lastSepOn = false;
 	sepSet( this, separator );
 	sepSetCur( this, sepGet( this ) );
@@ -39,5 +40,6 @@
 
 // private
-_Bool sepPrt( ofstream * os ) { return os->sepOnOff; }
+_Bool lastSepOn( ofstream * os ) { return os->lastSepOn; }
+_Bool sepPrt( ofstream * os ) { os->lastSepOn = false; return os->sepOnOff; }
 void sepReset( ofstream * os ) { os->sepOnOff = os->sepDefault; }
 void sepReset( ofstream * os, _Bool reset ) { os->sepDefault = reset; os->sepOnOff = os->sepDefault; }
@@ -46,10 +48,11 @@
 
 // public
-void sepOn( ofstream * os ) { os->sepOnOff = 1; }
-void sepOff( ofstream * os ) { os->sepOnOff = 0; }
+void sepOn( ofstream * os ) { os->lastSepOn = true; os->sepOnOff = true; }
+void sepOff( ofstream * os ) { os->lastSepOn = false; os->sepOnOff = 0; }
 
 _Bool sepDisable( ofstream *os ) {
 	_Bool temp = os->sepDefault;
 	os->sepDefault = false;
+	os->lastSepOn = false;
 	sepReset( os );
 	return temp;
@@ -92,5 +95,5 @@
 		exit( EXIT_FAILURE );
 	} // if
-	?{}( os, file, 1, 0, " ", ", " );
+	?{}( os, file, true, false, " ", ", " );
 } // open
 
@@ -132,7 +135,7 @@
 } // fmt
 
-static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 1, 0, " ", ", " };
+static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), true, false, " ", ", " };
 ofstream *sout = &soutFile;
-static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 1, 0, " ", ", " };
+static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), true, false, " ", ", " };
 ofstream *serr = &serrFile;
 
Index: src/libcfa/iostream
===================================================================
--- src/libcfa/iostream	(revision b0f7a431679f3dd6bb471f22feea766dda4b90ef)
+++ src/libcfa/iostream	(revision d3950125f9b8e14c660f3f5da742e6ad404ee9a7)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May 15 18:08:44 2017
-// Update Count     : 105
+// Last Modified On : Sat Jul  1 16:37:52 2017
+// Update Count     : 108
 //
 
@@ -31,4 +31,5 @@
 	_Bool sepDisable( ostype * );						// set default state to off, and return previous state
 	_Bool sepEnable( ostype * );						// set default state to on, and return previous state
+	_Bool lastSepOn( ostype * );						// last manipulator is setOn (context sensitive)
 
 	const char * sepGet( ostype * );					// get separator string
Index: src/libcfa/iostream.c
===================================================================
--- src/libcfa/iostream.c	(revision b0f7a431679f3dd6bb471f22feea766dda4b90ef)
+++ src/libcfa/iostream.c	(revision d3950125f9b8e14c660f3f5da742e6ad404ee9a7)
@@ -10,6 +10,6 @@
 // Created On       : Wed May 27 17:56:53 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon May  8 18:24:23 2017
-// Update Count     : 369
+// Last Modified On : Sat Jul  1 16:37:51 2017
+// Update Count     : 374
 //
 
@@ -217,4 +217,5 @@
 forall( dtype ostype | ostream( ostype ) )
 ostype * endl( ostype * os ) {
+	if ( lastSepOn( os ) ) fmt( os, "%s", sepGetCur( os ) );
 	os | '\n';
 	flush( os );
Index: src/tests/.expect/io.txt
===================================================================
--- src/tests/.expect/io.txt	(revision b0f7a431679f3dd6bb471f22feea766dda4b90ef)
+++ src/tests/.expect/io.txt	(revision d3950125f9b8e14c660f3f5da742e6ad404ee9a7)
@@ -5,5 +5,5 @@
 
 x (1 x [2 x {3 x =4 x $5 x £6 x ¥7 x ¡8 x ¿9 x «10
-1, x 2. x 3; x 4! x 5? x 6% x 7¢ x 8» x 9) x 10] x 11} x
+1, x 2. x 3; x 4! x 5? x 6% x 7¢ x 8» x 9) x 10] x 11} x 
 x`1`x'2'x"3"x:4:x 5 x	6	x
 7
@@ -14,5 +14,5 @@
 x
 10
-x
+x 
 x ( 1 ) x 2 , x 3 :x: 4
 A 
@@ -23,22 +23,34 @@
 1.11.21.3
 1.1+2.3i1.1-2.3i1.1-2.3i
- abcxyz
-abcxyz
+ abcxyz 
+abcxyz 
 
 1.1, $1.2, $1.3
 1.1+2.3i, $1.1-2.3i, $1.1-2.3i
-abc, $xyz
+abc, $xyz, $
 
 1, 2, 3, 4
+
 1, $2, $3 ", $"
 1 2 3 " "
+
+ 1 2 3 
+12 3
  1 2 3
-12 3
+1 2 3
+ 1 2 3
+
 123
 1 23
 1 2 3
+123
+1 2 3
+123 
+1 2 3
+
 1 2 3 4 " "
 1, 2, 3, 4 ", "
 1, 2, 3, 4
+
 3, 4, a, 7.2
 3, 4, a, 7.2
Index: src/tests/io.c
===================================================================
--- src/tests/io.c	(revision b0f7a431679f3dd6bb471f22feea766dda4b90ef)
+++ src/tests/io.c	(revision d3950125f9b8e14c660f3f5da742e6ad404ee9a7)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar  2 16:56:02 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jun  8 09:52:10 2017
-// Update Count     : 51
+// Last Modified On : Sat Jul  1 16:21:07 2017
+// Update Count     : 58
 // 
 
@@ -108,4 +108,5 @@
 	[int, int] t1 = [1, 2], t2 = [3, 4];
 	sout | t1 | t2 | endl;								// print tuple
+	sout | endl;
 
 	sepSet( sout, " " );
@@ -114,11 +115,21 @@
 	sepSet( sout, " " );								// reset separator to " "
 	sout | 1 | 2 | 3 | " \"" | sepGet( sout ) | "\"" | endl;
+	sout | endl;
 
-	sout | sepOn | 1 | 2 | 3 | sepOn | endl;			// separator at start of line
+	sout | sepOn | 1 | 2 | 3 | sepOn | endl;			// separator at start/end of line
 	sout | 1 | sepOff | 2 | 3 | endl;					// locally turn off implicit separator
+	sout | sepOn | 1 | 2 | 3 | sepOn | sepOff | endl;	// separator at start of line
+	sout | 1 | 2 | 3 | endl | sepOn;					// separator at start of next line
+	sout | 1 | 2 | 3 | endl;
+	sout | endl;
 
 	sout | sepDisable | 1 | 2 | 3 | endl;				// globally turn off implicit separation
 	sout | 1 | sepOn | 2 | 3 | endl;					// locally turn on implicit separator
-	sout | sepEnable | 1 | 2 | 3 | endl;				// globally turn on implicit separation
+	sout | sepEnable | 1 | 2 | 3 | endl | sepDisable;	// globally turn on/off implicit separation
+	sout | 1 | 2 | 3 | endl | sepEnable;				// globally turn on implicit separation
+	sout | 1 | 2 | 3 | sepOn | sepDisable | endl;		// ignore seperate at end of line
+	sout | 1 | 2 | 3 | sepOn | sepEnable | endl;		// separator at end of line
+	sout | 1 | 2 | 3 | endl;
+	sout | endl;
 
 	sepSetTuple( sout, " " );							// set tuple separator from ", " to " "
@@ -126,6 +137,6 @@
 	sepSetTuple( sout, ", " );							// reset tuple separator to ", "
 	sout | t1 | t2 | " \"" | sepGetTuple( sout ) | "\"" | endl;
-
 	sout | t1 | t2 | endl;								// print tuple
+	sout | endl;
 
 	[int, int, const char *, double] t3 = { 3, 4, "a", 7.2 };
