More work on async parsing: now handles String values with escapes, utf-8 split codepoints.
diff --git a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParser.java
index 8899443..52e4740 100644
--- a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParser.java
+++ b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParser.java
@@ -4,6 +4,7 @@
 import java.io.OutputStream;
 
 import com.fasterxml.jackson.core.*;
+import com.fasterxml.jackson.core.JsonParser.Feature;
 import com.fasterxml.jackson.core.async.ByteArrayFeeder;
 import com.fasterxml.jackson.core.async.NonBlockingInputFeeder;
 import com.fasterxml.jackson.core.io.CharTypes;
@@ -17,7 +18,7 @@
     implements ByteArrayFeeder
 {
     // This is the main input-code lookup table, fetched eagerly
-//    private final static int[] _icUTF8 = CharTypes.getInputCodeUtf8();
+    private final static int[] _icUTF8 = CharTypes.getInputCodeUtf8();
 
     // Latin1 encoding is not supported, but we do use 8-bit subset for
     // pre-processing task, to simplify first pass, keep it fast.
@@ -63,14 +64,6 @@
 
     /*
     /**********************************************************************
-    /* Other state
-    /**********************************************************************
-     */
-
-    protected int _currentQuote;
-
-    /*
-    /**********************************************************************
     /* Life-cycle
     /**********************************************************************
      */
@@ -268,6 +261,32 @@
             return _finishFloatExponent(true, _inputBuffer[_inputPtr++] & 0xFF);
         case MINOR_NUMBER_EXPONENT_DIGITS:
             return _finishFloatExponent(false, _inputBuffer[_inputPtr++] & 0xFF);
+
+        case MINOR_VALUE_STRING:
+            return _finishRegularString();
+        case MINOR_VALUE_STRING_UTF8_2:
+            _textBuffer.append((char) _decodeUTF8_2(_pending32, _inputBuffer[_inputPtr++]));
+            return _finishRegularString();
+        case MINOR_VALUE_STRING_UTF8_3:
+            if (!_decodeSplitUTF8_3(_pending32, _pendingBytes, _inputBuffer[_inputPtr++])) {
+                return JsonToken.NOT_AVAILABLE;
+            }
+            return _finishRegularString();
+        case MINOR_VALUE_STRING_UTF8_4:
+            if (!_decodeSplitUTF8_3(_pending32, _pendingBytes, _inputBuffer[_inputPtr++])) {
+                return JsonToken.NOT_AVAILABLE;
+            }
+            return _finishRegularString();
+
+        case MINOR_VALUE_STRING_ESCAPE:
+            {
+                int c = _decodeSplitEscaped(_quoted32, _quotedDigits);
+                if (c < 0) {
+                    return JsonToken.NOT_AVAILABLE;
+                }
+                _textBuffer.append((char) c);
+            }
+            return _finishRegularString();
         }
         VersionUtil.throwInternal();
         return null;
@@ -397,7 +416,7 @@
         }
 
         if (ch == INT_QUOTE) {
-            return _startString(ch);
+            return _startString();
         }
         switch (ch) {
         case '-':
@@ -475,7 +494,7 @@
             }
         }
         if (ch == INT_QUOTE) {
-            return _startString(ch);
+            return _startString();
         }
         switch (ch) {
         case '-':
@@ -552,7 +571,7 @@
             }
         }
         if (ch == INT_QUOTE) {
-            return _startString(ch);
+            return _startString();
         }
         switch (ch) {
         case '-':
@@ -601,8 +620,10 @@
 
         switch (ch) {
         case '\'':
-            return _startString(ch);
-            
+            if (isEnabled(Feature.ALLOW_SINGLE_QUOTES)) {
+                return _startAposString();
+            }
+            break;
         case ',':
             // If Feature.ALLOW_MISSING_VALUES is enabled we may allow "missing values",
             // that is, encountering a trailing comma or closing marker where value would be expected
@@ -1835,13 +1856,17 @@
         return _parseEscapedName(_quadLength, currQuad, currQuadBytes);
     }
     
-    protected int _decodeCharEscape() throws IOException
+    private final int _decodeCharEscape() throws IOException
     {
         int left = _inputEnd - _inputPtr;
-
         if (left < 5) { // offline boundary-checking case:
             return _decodeSplitEscaped(0, -1);
         }
+        return _decodeFastCharEscape();
+    }
+    
+    private final int _decodeFastCharEscape() throws IOException
+    {
         int c = (int) _inputBuffer[_inputPtr++];
         switch (c) {
             // First, ones that are mapped
@@ -1906,7 +1931,6 @@
             _quotedDigits = bytesRead;
             return -1;
         }
-
         int c = _inputBuffer[_inputPtr++];
         if (bytesRead == -1) { // expecting first char after backslash
             switch (c) {
@@ -1926,7 +1950,7 @@
             case '"':
             case '/':
             case '\\':
-                return (char) c;
+                return c;
     
             case 'u': // and finally hex-escaped
                 break;
@@ -1972,16 +1996,305 @@
     /**********************************************************************
      */
 
-    protected JsonToken _startString(int q) throws IOException
+    protected JsonToken _startAposString() throws IOException
     {
-        _currentQuote = q;
+        VersionUtil.throwInternal();
         return null;
     }
 
+    protected JsonToken _startString() throws IOException
+    {
+        int ptr = _inputPtr;
+        int outPtr = 0;
+        char[] outBuf = _textBuffer.emptyAndGetCurrentSegment();
+        final int[] codes = _icUTF8;
+
+        final int max = Math.min(_inputEnd, (ptr + outBuf.length));
+        final byte[] inputBuffer = _inputBuffer;
+        while (ptr < max) {
+            int c = (int) inputBuffer[ptr] & 0xFF;
+            if (codes[c] != 0) {
+                if (c == INT_QUOTE) {
+                    _inputPtr = ptr+1;
+                    _textBuffer.setCurrentLength(outPtr);
+                    return _valueComplete(JsonToken.VALUE_STRING);
+                }
+                break;
+            }
+            ++ptr;
+            outBuf[outPtr++] = (char) c;
+        }
+        _textBuffer.setCurrentLength(outPtr);
+        _inputPtr = ptr;
+        return _finishRegularString();
+    }
+
+    private final JsonToken _finishRegularString() throws IOException
+    {
+        int c;
+
+        // Here we do want to do full decoding, hence:
+        final int[] codes = _icUTF8;
+        final byte[] inputBuffer = _inputBuffer;
+
+        char[] outBuf = _textBuffer.getBufferWithoutReset();
+        int outPtr = _textBuffer.getCurrentSegmentSize();
+        int ptr = _inputPtr;
+        final int safeEnd = _inputEnd - 5; // longest escape is 6 chars
+        
+        main_loop:
+        while (true) {
+            // Then the tight ASCII non-funny-char loop:
+            ascii_loop:
+            while (true) {
+                if (ptr >= _inputEnd) {
+                    _inputPtr = ptr;
+                    _minorState = MINOR_VALUE_STRING;
+                    _textBuffer.setCurrentLength(outPtr);
+                    return (_currToken = JsonToken.NOT_AVAILABLE);
+                }
+                if (outPtr >= outBuf.length) {
+                    outBuf = _textBuffer.finishCurrentSegment();
+                    outPtr = 0;
+                }
+                final int max = Math.min(_inputEnd, (ptr + (outBuf.length - outPtr)));
+                while (ptr < max) {
+                    c = inputBuffer[ptr++] & 0xFF;
+                    if (codes[c] != 0) {
+                        break ascii_loop;
+                    }
+                    outBuf[outPtr++] = (char) c;
+                }
+            }
+            // Ok: end marker, escape or multi-byte?
+            if (c == INT_QUOTE) {
+                _inputPtr = ptr;
+                _textBuffer.setCurrentLength(outPtr);
+                return _valueComplete(JsonToken.VALUE_STRING);
+            }
+            // If possibly split, use off-lined longer version
+            if (ptr >= safeEnd) {
+                _inputPtr = ptr;
+                _textBuffer.setCurrentLength(outPtr);
+                if (!_decodeSplitMultiByte(c, codes[c], ptr < _inputEnd)) {
+                    return (_currToken = JsonToken.NOT_AVAILABLE);
+                }
+                outBuf = _textBuffer.getBufferWithoutReset();
+                outPtr = _textBuffer.getCurrentSegmentSize();
+                ptr = _inputPtr;
+                continue main_loop;
+            }
+            // otherwise use inlined
+            switch (codes[c]) {
+            case 1: // backslash
+                c = _decodeFastCharEscape(); // since we know it's not split
+                break;
+            case 2: // 2-byte UTF
+                c = _decodeUTF8_2(c, _inputBuffer[ptr++]);
+                break;
+            case 3: // 3-byte UTF
+                c = _decodeUTF8_3(c, _inputBuffer[ptr++], _inputBuffer[ptr++]);
+                break;
+            case 4: // 4-byte UTF
+                c = _decodeUTF8_4(c, _inputBuffer[ptr++], _inputBuffer[ptr++],
+                        _inputBuffer[ptr++]);
+                // Let's add first part right away:
+                outBuf[outPtr++] = (char) (0xD800 | (c >> 10));
+                if (outPtr >= outBuf.length) {
+                    outBuf = _textBuffer.finishCurrentSegment();
+                    outPtr = 0;
+                }
+                c = 0xDC00 | (c & 0x3FF);
+                // And let the other char output down below
+                break;
+            default:
+                if (c < INT_SPACE) {
+                    // Note: call can now actually return (to allow unquoted linefeeds)
+                    _throwUnquotedSpace(c, "string value");
+                } else {
+                    // Is this good enough error message?
+                    _reportInvalidChar(c);
+                }
+            }
+            // Need more room?
+            if (outPtr >= outBuf.length) {
+                outBuf = _textBuffer.finishCurrentSegment();
+                outPtr = 0;
+            }
+            // Ok, let's add char to output:
+            outBuf[outPtr++] = (char) c;
+        }
+    }
+
+    private final boolean _decodeSplitMultiByte(int c, int type, boolean gotNext)
+            throws IOException
+    {
+        switch (type) {
+        case 1:
+            c = _decodeSplitEscaped(0, -1);
+            if (c < 0) {
+                _minorState = MINOR_VALUE_STRING_ESCAPE;
+                return false;
+            }
+            _textBuffer.append((char) c);
+            return true;
+        case 2: // 2-byte UTF; easy, either got both, or just miss one
+            if (gotNext) {
+                // NOTE: always succeeds, no need to check
+                c = _decodeUTF8_2(c, _inputBuffer[_inputPtr++]);
+                _textBuffer.append((char) c);
+                return true;
+            }
+            _minorState = MINOR_VALUE_STRING_UTF8_2;
+            _pending32 = c;
+            return false;
+        case 3: // 3-byte UTF
+            c &= 0x0F;
+            if (gotNext) {
+                return _decodeSplitUTF8_3(c, 1, _inputBuffer[_inputPtr++]);
+            }
+            _minorState = MINOR_VALUE_STRING_UTF8_3;
+            _pending32 = c;
+            _pendingBytes = 1;
+            return false;
+        case 4: // 4-byte UTF
+            c &= 0x07;
+            if (gotNext) {
+                return _decodeSplitUTF8_4(c, 1, _inputBuffer[_inputPtr++]);
+            }
+            _pending32 = c;
+            _pendingBytes = 1;
+            _minorState = MINOR_VALUE_STRING_UTF8_4;
+            return false;
+        default:
+            if (c < INT_SPACE) {
+                // Note: call can now actually return (to allow unquoted linefeeds)
+                _throwUnquotedSpace(c, "string value");
+            } else {
+                // Is this good enough error message?
+                _reportInvalidChar(c);
+            }
+            _textBuffer.append((char) c);
+            return true;
+        }
+    }
+
+    private final boolean _decodeSplitUTF8_3(int prev, int prevCount, int next)
+        throws IOException
+    {
+        if (prevCount == 1) {
+            if ((next & 0xC0) != 0x080) {
+                _reportInvalidOther(next & 0xFF, _inputPtr);
+            }
+            prev = (prev << 6) | (next & 0x3F);
+            if (_inputPtr >= _inputEnd) {
+                _minorState = MINOR_VALUE_STRING_UTF8_3;
+                _pending32 = prev;
+                _pendingBytes = 2;
+                return false;
+            }
+            next = _inputBuffer[_inputPtr++];
+        }
+        if ((next & 0xC0) != 0x080) {
+            _reportInvalidOther(next & 0xFF, _inputPtr);
+        }
+        _textBuffer.append((char) ((prev << 6) | (next & 0x3F)));
+        return true;
+    }
+
+    // @return Character value <b>minus 0x10000</c>; this so that caller
+    //    can readily expand it to actual surrogates
+    private final boolean _decodeSplitUTF8_4(int prev, int prevCount, int next)
+        throws IOException
+    {
+        if (prevCount == 1) {
+            if ((next & 0xC0) != 0x080) {
+                _reportInvalidOther(next & 0xFF, _inputPtr);
+            }
+            prev = (prev << 6) | (next & 0x3F);
+            if (_inputPtr >= _inputEnd) {
+                _minorState = MINOR_VALUE_STRING_UTF8_4;
+                _pending32 = prev;
+                _pendingBytes = 2;
+                return false;
+            }
+            prevCount = 2;
+            next = _inputBuffer[_inputPtr++];
+        }
+        if (prevCount == 2) {
+            if ((next & 0xC0) != 0x080) {
+                _reportInvalidOther(next & 0xFF, _inputPtr);
+            }
+            if (_inputPtr >= _inputEnd) {
+                _minorState = MINOR_VALUE_STRING_UTF8_4;
+                _pending32 = prev;
+                _pendingBytes = 3;
+                return false;
+            }
+            next = _inputBuffer[_inputPtr++];
+        }
+        if ((next & 0xC0) != 0x080) {
+            _reportInvalidOther(next & 0xFF, _inputPtr);
+        }
+        int c = ((prev << 6) | (next & 0x3F)) - 0x10000;
+
+        // Let's add first part right away:
+        _textBuffer.append((char) (0xD800 | (c >> 10)));
+        c = 0xDC00 | (c & 0x3FF);
+        // And let the other char output down below
+        _textBuffer.append((char) c);
+        return true;
+    }
+
     // !!! TODO: only temporarily here
 
     private final boolean _loadMore() {
         VersionUtil.throwInternal();
         return false;
     }
+
+    /*
+    /**********************************************************************
+    /* Internal methods, UTF8 decoding
+    /**********************************************************************
+     */
+
+    private final int _decodeUTF8_2(int c, int d) throws IOException
+    {
+        if ((d & 0xC0) != 0x080) {
+            _reportInvalidOther(d & 0xFF, _inputPtr);
+        }
+        return ((c & 0x1F) << 6) | (d & 0x3F);
+    }
+
+    private final int _decodeUTF8_3(int c, int d, int e) throws IOException
+    {
+        c &= 0x0F;
+        if ((d & 0xC0) != 0x080) {
+            _reportInvalidOther(d & 0xFF, _inputPtr);
+        }
+        c = (c << 6) | (d & 0x3F);
+        if ((e & 0xC0) != 0x080) {
+            _reportInvalidOther(e & 0xFF, _inputPtr);
+        }
+        return (c << 6) | (e & 0x3F);
+    }
+
+    // @return Character value <b>minus 0x10000</c>; this so that caller
+    //    can readily expand it to actual surrogates
+    private final int _decodeUTF8_4(int c, int d, int e, int f) throws IOException
+    {
+        if ((d & 0xC0) != 0x080) {
+            _reportInvalidOther(d & 0xFF, _inputPtr);
+        }
+        c = ((c & 0x07) << 6) | (d & 0x3F);
+        if ((e & 0xC0) != 0x080) {
+            _reportInvalidOther(e & 0xFF, _inputPtr);
+        }
+        c = (c << 6) | (e & 0x3F);
+        if ((f & 0xC0) != 0x080) {
+            _reportInvalidOther(f & 0xFF, _inputPtr);
+        }
+        return ((c << 6) | (f & 0x3F)) - 0x10000;
+    }
 }
diff --git a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParserBase.java b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParserBase.java
index 464771a..b718b09 100644
--- a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParserBase.java
+++ b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParserBase.java
@@ -94,8 +94,11 @@
     protected final static int MINOR_NUMBER_EXPONENT_MARKER = 25;
     protected final static int MINOR_NUMBER_EXPONENT_DIGITS = 27;
 
-    protected final static int MINOR_VALUE_STRING = 45;
-
+    protected final static int MINOR_VALUE_STRING = 30;
+    protected final static int MINOR_VALUE_STRING_ESCAPE = 31;
+    protected final static int MINOR_VALUE_STRING_UTF8_2 = 32;
+    protected final static int MINOR_VALUE_STRING_UTF8_3 = 33;
+    protected final static int MINOR_VALUE_STRING_UTF8_4 = 34;
 
     /**
      * Special state at which point decoding of a non-quoted token has encountered
@@ -748,6 +751,14 @@
         _tokenInputCol = ptr - _currInputRowStart;
     }
 
+    protected void _reportInvalidChar(int c) throws JsonParseException {
+        // Either invalid WS or illegal UTF-8 start char
+        if (c < INT_SPACE) {
+            _throwInvalidSpace(c);
+        }
+        _reportInvalidInitial(c);
+    }
+    
     protected void _reportInvalidInitial(int mask) throws JsonParseException {
         _reportError("Invalid UTF-8 start byte 0x"+Integer.toHexString(mask));
     }
diff --git a/src/test/java/com/fasterxml/jackson/core/async/AsyncFieldNamesTest.java b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncFieldNamesTest.java
similarity index 95%
rename from src/test/java/com/fasterxml/jackson/core/async/AsyncFieldNamesTest.java
rename to src/test/java/com/fasterxml/jackson/core/json/async/AsyncFieldNamesTest.java
index 76aee0e..641bc88 100644
--- a/src/test/java/com/fasterxml/jackson/core/async/AsyncFieldNamesTest.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncFieldNamesTest.java
@@ -1,8 +1,9 @@
-package com.fasterxml.jackson.core.async;
+package com.fasterxml.jackson.core.json.async;
 
 import java.io.*;
 
 import com.fasterxml.jackson.core.*;
+import com.fasterxml.jackson.core.async.AsyncTestBase;
 import com.fasterxml.jackson.core.testsupport.AsyncReaderWrapper;
 
 public class AsyncFieldNamesTest extends AsyncTestBase
diff --git a/src/test/java/com/fasterxml/jackson/core/async/AsyncNumberCoercionTest.java b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncNumberCoercionTest.java
similarity index 98%
rename from src/test/java/com/fasterxml/jackson/core/async/AsyncNumberCoercionTest.java
rename to src/test/java/com/fasterxml/jackson/core/json/async/AsyncNumberCoercionTest.java
index 042a503..cc92576 100644
--- a/src/test/java/com/fasterxml/jackson/core/async/AsyncNumberCoercionTest.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncNumberCoercionTest.java
@@ -1,4 +1,4 @@
-package com.fasterxml.jackson.core.async;
+package com.fasterxml.jackson.core.json.async;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -7,6 +7,7 @@
 import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.core.JsonParser.NumberType;
+import com.fasterxml.jackson.core.async.AsyncTestBase;
 import com.fasterxml.jackson.core.testsupport.AsyncReaderWrapper;
 import com.fasterxml.jackson.core.JsonToken;
 
diff --git a/src/test/java/com/fasterxml/jackson/core/async/AsyncRootValuesTest.java b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncRootValuesTest.java
similarity index 98%
rename from src/test/java/com/fasterxml/jackson/core/async/AsyncRootValuesTest.java
rename to src/test/java/com/fasterxml/jackson/core/json/async/AsyncRootValuesTest.java
index 344315d..eae4a44 100644
--- a/src/test/java/com/fasterxml/jackson/core/async/AsyncRootValuesTest.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncRootValuesTest.java
@@ -1,9 +1,10 @@
-package com.fasterxml.jackson.core.async;
+package com.fasterxml.jackson.core.json.async;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
 import com.fasterxml.jackson.core.*;
+import com.fasterxml.jackson.core.async.AsyncTestBase;
 import com.fasterxml.jackson.core.testsupport.AsyncReaderWrapper;
 
 public class AsyncRootValuesTest extends AsyncTestBase
diff --git a/src/test/java/com/fasterxml/jackson/core/async/AsyncScalarArrayTest.java b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncScalarArrayTest.java
similarity index 98%
rename from src/test/java/com/fasterxml/jackson/core/async/AsyncScalarArrayTest.java
rename to src/test/java/com/fasterxml/jackson/core/json/async/AsyncScalarArrayTest.java
index bfcb914..8541d8f 100644
--- a/src/test/java/com/fasterxml/jackson/core/async/AsyncScalarArrayTest.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncScalarArrayTest.java
@@ -1,9 +1,10 @@
-package com.fasterxml.jackson.core.async;
+package com.fasterxml.jackson.core.json.async;
 
 import java.io.*;
 
 import com.fasterxml.jackson.core.*;
 import com.fasterxml.jackson.core.JsonParser.NumberType;
+import com.fasterxml.jackson.core.async.AsyncTestBase;
 import com.fasterxml.jackson.core.testsupport.AsyncReaderWrapper;
 
 public class AsyncScalarArrayTest extends AsyncTestBase
diff --git a/src/test/java/com/fasterxml/jackson/core/async/AsyncSimpleNestedTest.java b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncSimpleNestedTest.java
similarity index 98%
rename from src/test/java/com/fasterxml/jackson/core/async/AsyncSimpleNestedTest.java
rename to src/test/java/com/fasterxml/jackson/core/json/async/AsyncSimpleNestedTest.java
index a8fe84f..5922db0 100644
--- a/src/test/java/com/fasterxml/jackson/core/async/AsyncSimpleNestedTest.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncSimpleNestedTest.java
@@ -1,8 +1,9 @@
-package com.fasterxml.jackson.core.async;
+package com.fasterxml.jackson.core.json.async;
 
 import java.io.IOException;
 
 import com.fasterxml.jackson.core.*;
+import com.fasterxml.jackson.core.async.AsyncTestBase;
 import com.fasterxml.jackson.core.testsupport.AsyncReaderWrapper;
 
 public class AsyncSimpleNestedTest extends AsyncTestBase
diff --git a/src/test/java/com/fasterxml/jackson/core/async/AsyncSimpleObjectTest.java b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncSimpleObjectTest.java
similarity index 99%
rename from src/test/java/com/fasterxml/jackson/core/async/AsyncSimpleObjectTest.java
rename to src/test/java/com/fasterxml/jackson/core/json/async/AsyncSimpleObjectTest.java
index 907c954..9e29475 100644
--- a/src/test/java/com/fasterxml/jackson/core/async/AsyncSimpleObjectTest.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncSimpleObjectTest.java
@@ -1,4 +1,4 @@
-package com.fasterxml.jackson.core.async;
+package com.fasterxml.jackson.core.json.async;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
diff --git a/src/test/java/com/fasterxml/jackson/failing/async/AsyncStringObjectTest.java b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncStringObjectTest.java
similarity index 92%
rename from src/test/java/com/fasterxml/jackson/failing/async/AsyncStringObjectTest.java
rename to src/test/java/com/fasterxml/jackson/core/json/async/AsyncStringObjectTest.java
index cd4a370..e9dd38b 100644
--- a/src/test/java/com/fasterxml/jackson/failing/async/AsyncStringObjectTest.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncStringObjectTest.java
@@ -1,4 +1,4 @@
-package com.fasterxml.jackson.failing.async;
+package com.fasterxml.jackson.core.json.async;
 
 import java.io.IOException;
 
@@ -17,15 +17,7 @@
 
     private final JsonFactory JSON_F = new JsonFactory();
 
-    public void testBasicFieldsNamesSharedNames() throws IOException {
-        _testBasicFieldsNames(true);
-    }
-
-    public void testBasicFieldsNamesNonShared() throws IOException {
-        _testBasicFieldsNames(false);
-    }
-
-    private void _testBasicFieldsNames(boolean sharedNames) throws IOException
+    public void testBasicFieldsNames() throws IOException
     {
         final String json = aposToQuotes(String.format("{'%s':'%s','%s':'%s','%s':'%s'}",
             UNICODE_SHORT_NAME, UNICODE_LONG_NAME,
diff --git a/src/test/java/com/fasterxml/jackson/core/async/ConfigTest.java b/src/test/java/com/fasterxml/jackson/core/json/async/ConfigTest.java
similarity index 90%
rename from src/test/java/com/fasterxml/jackson/core/async/ConfigTest.java
rename to src/test/java/com/fasterxml/jackson/core/json/async/ConfigTest.java
index 664432e..83c959b 100644
--- a/src/test/java/com/fasterxml/jackson/core/async/ConfigTest.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/async/ConfigTest.java
@@ -1,8 +1,9 @@
-package com.fasterxml.jackson.core.async;
+package com.fasterxml.jackson.core.json.async;
 
 import java.io.*;
 
 import com.fasterxml.jackson.core.*;
+import com.fasterxml.jackson.core.async.AsyncTestBase;
 import com.fasterxml.jackson.core.testsupport.AsyncReaderWrapper;
 
 public class ConfigTest extends AsyncTestBase
diff --git a/src/test/java/com/fasterxml/jackson/failing/async/AsyncStringArrayTest.java b/src/test/java/com/fasterxml/jackson/failing/async/AsyncStringArrayTest.java
index f01667f..49636cf 100644
--- a/src/test/java/com/fasterxml/jackson/failing/async/AsyncStringArrayTest.java
+++ b/src/test/java/com/fasterxml/jackson/failing/async/AsyncStringArrayTest.java
@@ -90,9 +90,9 @@
         byte[] data = _stringDoc(f, input);
 
         // first: require headers, no offsets
+        _testStrings(f, input, data, 0, 9000);
         _testStrings(f, input, data, 0, 1);
         _testStrings(f, input, data, 0, 3);
-        _testStrings(f, input, data, 0, 9000);
 
         // then with some offsets:
         _testStrings(f, input, data, 1, 9000);