diff --git a/code/extfmts.lisp b/code/extfmts.lisp
index 5936ca705951599299f8866750fef588a8ddc97e..43adbcc1fb5552f27d8f4aa2eecaa21f7339e50d 100644
--- a/code/extfmts.lisp
+++ b/code/extfmts.lisp
@@ -851,39 +851,66 @@ character and illegal outputs are replaced by a question mark.")
       (funcall f state))))
 
 (def-ef-macro ef-string-to-octets (extfmt lisp::lisp +ef-max+ +ef-so+)
-  `(lambda (string start end buffer error &aux (ptr 0) (state nil))
+  `(lambda (string start end buffer buffer-start buffer-end error bufferp
+	    &aux (ptr buffer-start) (state nil) (last-octet buffer-start))
      (declare #|(optimize (speed 3) (safety 0) (space 0) (debug 0))|#
 	      (type simple-string string)
 	      (type kernel:index start end ptr)
 	      (type (simple-array (unsigned-byte 8) (*)) buffer)
 	      (ignorable state))
-    (dotimes (i (- end start) (values buffer ptr))
-      (declare (type kernel:index i))
-      (char-to-octets ,extfmt (schar string (+ start i)) state
-		      (lambda (b)
-			(when (= ptr (length buffer))
-			  (setq buffer (adjust-array buffer (* 2 ptr))))
-			(setf (aref buffer (1- (incf ptr))) b))
-		      error))))
+     (if bufferp
+	 (block ef-string-done
+	   (dotimes (i (- end start) (values buffer ptr i))
+	     (declare (type kernel:index i))
+	     (char-to-octets ,extfmt (schar string (+ start i)) state
+			     (lambda (b)
+			       (when (= ptr buffer-end)
+				 (return-from ef-string-done
+				   (values buffer last-octet i)))
+			       (setf (aref buffer (1- (incf ptr))) b))
+			     error)
+	     (setf last-octet ptr)))
+	 (dotimes (i (- end start) (values buffer ptr i))
+	   (declare (type kernel:index i))
+	   (char-to-octets ,extfmt (schar string (+ start i)) state
+			   (lambda (b)
+			     (when (= ptr (length buffer))
+			       (setq buffer (adjust-array buffer (* 2 ptr))))
+			     (setf (aref buffer (1- (incf ptr))) b))
+			   error)))))
 
 (defun string-to-octets (string &key (start 0) end (external-format :default)
 				     (buffer nil bufferp)
+				     (buffer-start 0)
 			             error)
   "Convert String to octets using the specified External-format.  The
   string is bounded by Start (defaulting to 0) and End (defaulting to
   the end of the string.  If Buffer is given, the octets are stored
-  there.  If not, a new buffer is created."
+  there.  If not, a new buffer is created.  Buffer-start specifies
+  where in the buffer the first octet will be placed.
+
+  Three values are returned: The buffer, the number of valid octets
+  written, and the number of characters converted.  Note that the
+  actual number of octets written may be greater than the returned
+  value, These represent the partial octets of the next character to
+  be converted, but there was not enough room to hold the complete set
+  of octets."
   (declare (type string string)
 	   (type kernel:index start)
 	   (type (or kernel:index null) end)
-	   (type (or (simple-array (unsigned-byte 8) (*)) null) buffer))
+	   (type (or (array (unsigned-byte 8) (*)) null) buffer))
   (let* ((buffer (or buffer (make-array (length string)
 					:element-type '(unsigned-byte 8)))))
-    (multiple-value-bind (buffer ptr)
-	(lisp::with-array-data ((string string) (start start) (end end))
-	  (funcall (ef-string-to-octets external-format)
-		   string start end buffer error))
-      (values (if bufferp buffer (lisp::shrink-vector buffer ptr)) ptr))))
+    (lisp::with-array-data ((b buffer) (b-start)
+			    (b-end))
+      (multiple-value-bind (result ptr octets)
+	  (lisp::with-array-data ((string string) (start start) (end end))
+	    (funcall (ef-string-to-octets external-format)
+		     string start end b
+		     (+ b-start buffer-start) b-end
+		     error bufferp))
+	(values (if bufferp buffer (lisp::shrink-vector result ptr))
+		(- ptr b-start buffer-start) octets)))))
 
 (def-ef-macro ef-octets-to-string (extfmt lisp::lisp +ef-max+ +ef-os+)
   `(lambda (octets ptr end state string s-start s-end error
diff --git a/general-info/release-20d.txt b/general-info/release-20d.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0c926f7ee01d854babb4ec18d03a643f8622ed69
--- /dev/null
+++ b/general-info/release-20d.txt
@@ -0,0 +1,52 @@
+========================== C M U C L  20 d =============================
+
+[Not yet released]
+
+The CMUCL project is pleased to announce the release of CMUCL 20d.
+This is a major release which contains numerous enhancements and
+bug fixes from the 20c release.
+
+CMUCL is a free, high performance implementation of the Common Lisp
+programming language which runs on most major Unix platforms. It
+mainly conforms to the ANSI Common Lisp standard. CMUCL provides a
+sophisticated native code compiler; a powerful foreign function
+interface; an implementation of CLOS, the Common Lisp Object System,
+which includes multi-methods and a meta-object protocol; a source-level
+debugger and code profiler; and an Emacs-like editor implemented in
+Common Lisp. CMUCL is maintained by a team of volunteers collaborating
+over the Internet, and is mostly in the public domain.
+
+New in this release:
+
+  * Known issues:
+
+  * Feature enhancements
+
+  * Changes
+    * ASDF2 updated to version 2.018.
+    * Behavior of STRING-TO-OCTETS has changed.  This is an
+      incompatible change from the previous version but should be more
+      useful when a buffer is given which is not large enough to hold
+      all the octets for the given string.  See docstring for more
+      details.
+      
+  * ANSI compliance fixes:
+
+  * Bugfixes:
+
+  * Trac Tickets:
+
+  * Other changes:
+
+  * Improvements to the PCL implementation of CLOS:
+
+  * Changes to building procedure:
+
+This release is not binary compatible with code compiled using CMUCL
+20c; you will need to recompile FASL files. 
+
+See <URL:http://www.cons.org/cmucl/> for download information,
+guidelines on reporting bugs, and mailing list details.
+
+
+We hope you enjoy using this release of CMUCL!
diff --git a/tools/build.sh b/tools/build.sh
index 392637e3c2ce64305beae0925ba62ae842e6be58..830ec2d26325ea92db9f1797a6e5406a932fb5d6 100755
--- a/tools/build.sh
+++ b/tools/build.sh
@@ -39,7 +39,7 @@ ENABLE2="yes"
 ENABLE3="yes"
 ENABLE4="yes"
 
-version=20b
+version=20c
 SRCDIR=src
 TOOLDIR=$SRCDIR/tools
 VERSION="`date '+%Y-%m-%d %H:%M:%S'`"