...

diff --git a/build.xml b/build.xml
index 05f9ffc..a62dcaf 100644
--- a/build.xml
+++ b/build.xml
@@ -50,7 +50,7 @@
     <property name="IMPL_TITLE_SMILE" value="Jackson Binary format (aka Smile) handling functionality" />
     <property name="IMPL_TITLE_MRBEAN" value="Jackson Bean Materializer (aka Mr. Bean)" />
 
-    <property name="IMPL_VERSION" value="1.9.12" />
+    <property name="IMPL_VERSION" value="1.9.13" />
     <property name="IMPL_VENDOR" value="http://fasterxml.com" />
 
     <patternset id="dist-all-source-files">
diff --git a/release-notes/VERSION b/release-notes/VERSION
index f7f5ea6..e356c85 100644
--- a/release-notes/VERSION
+++ b/release-notes/VERSION
@@ -12,6 +12,8 @@
 * [JACKSON-875]: Enums are not properly serialized when
   Feature.USE_ANNOTATIONS is disabled
  (reported by Laurent P)
+* [JACKSON-884]: JsonStringEncoder.quoteAsStringValue() fails to encode
+  ctrl chars correctly.
 * [Issue#38]: Infinite loop in `JsonParser.nextFieldName()` with trailing
  space after field name
  (reported by matjazs@github)
diff --git a/src/java/org/codehaus/jackson/io/JsonStringEncoder.java b/src/java/org/codehaus/jackson/io/JsonStringEncoder.java
index b0798d0..ac201d2 100644
--- a/src/java/org/codehaus/jackson/io/JsonStringEncoder.java
+++ b/src/java/org/codehaus/jackson/io/JsonStringEncoder.java
@@ -129,8 +129,12 @@
                 }
             }
             // something to escape; 2 or 6-char variant? 
-            int escCode = escCodes[input.charAt(inPtr++)];
-            int length = _appendSingleEscape(escCode, _quoteBuffer);
+            char d = input.charAt(inPtr++);
+            int escCode = escCodes[d];
+            int length = (escCode < 0)
+                    ? _appendNumericEscape(d, _quoteBuffer)
+                    : _appendNamedEscape(escCode, _quoteBuffer);
+                    ;
             if ((outPtr + length) > outputBuffer.length) {
                 int first = outputBuffer.length - outPtr;
                 if (first > 0) {
@@ -144,7 +148,6 @@
                 System.arraycopy(_quoteBuffer, 0, outputBuffer, outPtr, length);
                 outPtr += length;
             }
-            
         }
         textBuffer.setCurrentLength(outPtr);
         return textBuffer.contentsAsArray();
@@ -249,6 +252,7 @@
      * Will encode given String as UTF-8 (without any quoting), return
      * resulting byte array.
      */
+    @SuppressWarnings("resource")
     public byte[] encodeAsUTF8(String text)
     {
         ByteArrayBuilder byteBuilder = _byteBuilder;
@@ -341,16 +345,17 @@
     /**********************************************************
      */
 
-    private int _appendSingleEscape(int escCode, char[] quoteBuffer)
+    private int _appendNumericEscape(int value, char[] quoteBuffer)
     {
-        if (escCode < 0) { // control char, value -(char + 1)
-            int value = -(escCode + 1);
-            quoteBuffer[1] = 'u';
-            // We know it's a control char, so only the last 2 chars are non-0
-            quoteBuffer[4] = HEX_CHARS[value >> 4];
-            quoteBuffer[5] = HEX_CHARS[value & 0xF];
-            return 6;
-        }
+        quoteBuffer[1] = 'u';
+        // We know it's a control char, so only the last 2 chars are non-0
+        quoteBuffer[4] = HEX_CHARS[value >> 4];
+        quoteBuffer[5] = HEX_CHARS[value & 0xF];
+        return 6;
+    }
+
+    private int _appendNamedEscape(int escCode, char[] quoteBuffer)
+    {
         quoteBuffer[1] = (char) escCode;
         return 2;
     }
diff --git a/src/test/org/codehaus/jackson/io/TestJsonStringEncoder.java b/src/test/org/codehaus/jackson/io/TestJsonStringEncoder.java
index 14670d3..cc8a850 100644
--- a/src/test/org/codehaus/jackson/io/TestJsonStringEncoder.java
+++ b/src/test/org/codehaus/jackson/io/TestJsonStringEncoder.java
@@ -74,6 +74,14 @@
         }
     }
 
+    // [JACKSON-884]
+    public void testCtrlChars() throws Exception
+    {
+        char[] input = new char[] { 0, 1, 2, 3, 4 };
+        char[] quoted = JsonStringEncoder.getInstance().quoteAsString(new String(input));
+        assertEquals("\\u0000\\u0001\\u0002\\u0003\\u0004", new String(quoted));
+    }
+    
     /*
     /**********************************************************
     /* Helper methods