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;
