Index: libcfa/src/containers/string_res.cfa
===================================================================
--- libcfa/src/containers/string_res.cfa	(revision 0ca15b74a1af1d7ecea0babdf66b02787cff7715)
+++ libcfa/src/containers/string_res.cfa	(revision 2b303702c0215c73cc25f072af9d55d8ca0991a0)
@@ -209,11 +209,14 @@
     // Store auto-newline state so it can be restored
     bool anl = getANL$(out);
-    nlOff(out);
-    for (size_t i = 0; i < s.Handle.lnth; i++) {
-        // Need to re-apply on the last output operator, for whole-statement version
-        if (anl && i == s.Handle.lnth-1) nlOn(out);
-        out | s[i];
-    }
-    return out;
+    if( s.Handle.lnth == 0 ) {
+        sout | "";
+    } else {
+        nlOff(out);
+        for (size_t i = 0; i < s.Handle.lnth; i++) {
+            // Need to re-apply on the last output operator, for whole-statement version
+            if (anl && i == s.Handle.lnth-1) nlOn(out);
+            out | s[i];
+        }
+    }
 }
 
@@ -223,7 +226,10 @@
         (Handle){ * ambient_string_sharectx->activeHeap };
         (shareEditSet_owns_ulink){ false };
+        verify( Handle.s == 0p && Handle.lnth == 0 );
     } else {
         (Handle){ * new( (size_t) 10 ) };  // TODO: can I lazily avoid allocating for empty string
         (shareEditSet_owns_ulink){ true };
+        Handle.s = Handle.ulink->StartVbyte;
+        verify( Handle.lnth == 0 );
     }
     s.shareEditSet_prev = &s;
Index: tests/collections/.expect/string-api-coverage.txt
===================================================================
--- tests/collections/.expect/string-api-coverage.txt	(revision 0ca15b74a1af1d7ecea0babdf66b02787cff7715)
+++ tests/collections/.expect/string-api-coverage.txt	(revision 2b303702c0215c73cc25f072af9d55d8ca0991a0)
@@ -1,3 +1,5 @@
 hello hello hello
+
+hello
 true false
 true false
Index: tests/collections/string-api-coverage.cfa
===================================================================
--- tests/collections/string-api-coverage.cfa	(revision 0ca15b74a1af1d7ecea0babdf66b02787cff7715)
+++ tests/collections/string-api-coverage.cfa	(revision 2b303702c0215c73cc25f072af9d55d8ca0991a0)
@@ -37,5 +37,11 @@
 
     // IO operator, x2
-    sout | s | s | s;
+    sout | s | s | s;  // hello hello hello
+
+    // empty ctor then assign
+    string sxx;
+    sout | sxx;  // (blank line)
+    sxx = s;
+    sout | sxx;  // hello
 
     // Comparisons
