Index: libcfa/src/collections/string.cfa
===================================================================
--- libcfa/src/collections/string.cfa	(revision e8b3717356ccae5e6e9b884e3b31caa47d950414)
+++ libcfa/src/collections/string.cfa	(revision b1eefe50ac43e1e276c3a39c9794d6b218c9a71f)
@@ -91,12 +91,9 @@
 // Assignment
 
-void ?=?( string & s, const char * val ) {
-    (*s.inner) = val;
-}
-
-// with and without const on "other" argument helps keep prevent autogen ?=? calls
-void ?=?(string & s, const string & c) {
+string & ?=?(string & s, const string & c) {
     (*s.inner) = (*c.inner);
-}
+    return s;
+}
+
 string & ?=?(string & s, string & c) {
     (*s.inner) = (*c.inner);
@@ -104,13 +101,22 @@
 }
 
-void ?=?( string & s, char val ) {
+string & ?=?( string & s, const char * val ) {
     (*s.inner) = val;
-}
-
-void assign(string & s, const string & c, size_t n) {
+    return s;
+}
+
+string & ?=?( string & s, char val ) {
+    (*s.inner) = val;
+    return s;
+}
+
+string & assign(string & s, const string & c, size_t n) {
     assign(*s.inner, *c.inner, n);
-}
-void assign(string & s, const char * c, size_t n) {
+    return s;
+}
+
+string & assign(string & s, const char * c, size_t n) {
     assign(*s.inner, c, n);
+    return s;
 }
 
Index: libcfa/src/collections/string.hfa
===================================================================
--- libcfa/src/collections/string.hfa	(revision e8b3717356ccae5e6e9b884e3b31caa47d950414)
+++ libcfa/src/collections/string.hfa	(revision b1eefe50ac43e1e276c3a39c9794d6b218c9a71f)
@@ -41,11 +41,10 @@
 void ?{}(string & s, const char * c, size_t size); // copy specific length from buffer
 
-void ?=?(string & s, const char * c); // copy assignment from literal
-void ?=?(string & s, const string & c);
-void ?=?(string & s, char c);
-string & ?=?(string & s, string & c);  // surprising ret seems to help avoid calls to autogen
-void assign(string & s, const string & c, size_t n);
-void assign(string & s, const char * c, size_t n);
-//string ?=?( string &, string ) = void;
+string & ?=?(string & s, const string & c);
+string & ?=?(string & s, string & c);
+string & ?=?(string & s, const char * c); // copy from "literal"
+string & ?=?(string & s, char c);  // copy from 'l'
+string & assign(string & s, const string & c, size_t n);
+string & assign(string & s, const char * c, size_t n);
 
 static inline string & strcpy(string & s, const char * c) { s = c; return s; }
