diff --git a/luni/src/test/java/org/apache/harmony/xml/PullParserTest.java b/luni/src/test/java/org/apache/harmony/xml/PullParserTest.java
index 26573d8..fa6c54e 100644
--- a/luni/src/test/java/org/apache/harmony/xml/PullParserTest.java
+++ b/luni/src/test/java/org/apache/harmony/xml/PullParserTest.java
@@ -105,24 +105,16 @@
         parser.setInput(new StringReader(
                 "<foo>&#2147483648;</foo>"));
         assertEquals(XmlPullParser.START_TAG, parser.next());
-        try {
-            // TODO: this can't possibly be what the spec wants; it should throw another type
-            parser.next();
-            fail();
-        } catch (NumberFormatException expected) {
-        }
+        // TODO: this can't possibly be what the spec wants; it should throw another type
+        assertNextFails(parser);
     }
 
     public void testOmittedNumericEntities() throws Exception {
         XmlPullParser parser = newPullParser();
         parser.setInput(new StringReader("<foo>&#;</foo>"));
         assertEquals(XmlPullParser.START_TAG, parser.next());
-        try {
-            // TODO: this can't possibly be what the spec wants; it should throw another type
-            parser.next();
-            fail();
-        } catch (StringIndexOutOfBoundsException expected) {
-        }
+        // TODO: this can't possibly be what the spec wants; it should throw another type
+        assertNextFails(parser);
     }
 
     /**
@@ -225,21 +217,13 @@
         XmlPullParser parser = newPullParser();
         parser.setInput(new StringReader("<foo><</foo>"));
         assertEquals(XmlPullParser.START_TAG, parser.next());
-        try {
-            parser.next();
-            fail();
-        } catch (XmlPullParserException expected) {
-        }
+        assertNextFails(parser);
     }
 
     public void testLessThanInAttribute() throws Exception{
         XmlPullParser parser = newPullParser();
         parser.setInput(new StringReader("<foo a='<'></foo>"));
-        try {
-            parser.next();
-            fail();
-        } catch (XmlPullParserException expected) {
-        }
+        assertNextFails(parser);
     }
 
     public void testQuotesInAttribute() throws Exception{
@@ -269,11 +253,44 @@
         XmlPullParser parser = newPullParser();
         parser.setInput(new StringReader("<foo>]]></foo>"));
         assertEquals(XmlPullParser.START_TAG, parser.next());
-        try {
-            parser.next();
-            fail();
-        } catch (XmlPullParserException expected) {
-        }
+        assertNextFails(parser);
+    }
+
+    public void testUnexpectedEof() throws Exception {
+        XmlPullParser parser = newPullParser();
+        parser.setInput(new StringReader("<foo><![C"));
+        assertEquals(XmlPullParser.START_TAG, parser.next());
+        assertNextFails(parser);
+    }
+
+    public void testUnexpectedSequence() throws Exception {
+        XmlPullParser parser = newPullParser();
+        parser.setInput(new StringReader("<foo><![Cdata[bar]]></foo>"));
+        assertEquals(XmlPullParser.START_TAG, parser.next());
+        assertNextFails(parser);
+    }
+
+    public void testThreeDashCommentDelimiter() throws Exception {
+        XmlPullParser parser = newPullParser();
+        parser.setInput(new StringReader("<foo><!--a---></foo>"));
+        assertEquals(XmlPullParser.START_TAG, parser.next());
+        assertNextFails(parser);
+    }
+
+    public void testTwoDashesInComment() throws Exception {
+        XmlPullParser parser = newPullParser();
+        parser.setInput(new StringReader("<foo><!-- -- --></foo>"));
+        assertEquals(XmlPullParser.START_TAG, parser.next());
+        // TODO: confirm with the spec that this should fail
+        assertNextFails(parser);
+    }
+
+    public void testEmptyComment() throws Exception {
+        XmlPullParser parser = newPullParser();
+        parser.setInput(new StringReader("<foo><!----></foo>"));
+        assertEquals(XmlPullParser.START_TAG, parser.next());
+        assertEquals(XmlPullParser.COMMENT, parser.nextToken());
+        assertEquals("", parser.getText());
     }
 
     /**
@@ -392,6 +409,47 @@
         assertEquals(XmlPullParser.END_TAG, parser.next());
     }
 
+    public void testLinesAndColumns() throws Exception {
+        XmlPullParser parser = newPullParser();
+        parser.setInput(new StringReader("\n"
+                + "  <foo><bar a='\n"
+                + "' b='cde'></bar\n"
+                + "><!--\n"
+                + "\n"
+                + "--><baz/>fg\n"
+                + "</foo>"));
+        assertEquals("1,1", parser.getLineNumber() + "," + parser.getColumnNumber());
+        assertEquals(XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken());
+        assertEquals("2,3", parser.getLineNumber() + "," + parser.getColumnNumber());
+        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
+        assertEquals("2,8", parser.getLineNumber() + "," + parser.getColumnNumber());
+        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
+        assertEquals("3,11", parser.getLineNumber() + "," + parser.getColumnNumber());
+        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
+        assertEquals("4,2", parser.getLineNumber() + "," + parser.getColumnNumber());
+        assertEquals(XmlPullParser.COMMENT, parser.nextToken());
+        assertEquals("6,4", parser.getLineNumber() + "," + parser.getColumnNumber());
+        assertEquals(XmlPullParser.START_TAG, parser.nextToken());
+        assertEquals("6,10", parser.getLineNumber() + "," + parser.getColumnNumber());
+        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
+        assertEquals("6,10", parser.getLineNumber() + "," + parser.getColumnNumber());
+        assertEquals(XmlPullParser.TEXT, parser.nextToken());
+        assertEquals("7,1", parser.getLineNumber() + "," + parser.getColumnNumber());
+        assertEquals(XmlPullParser.END_TAG, parser.nextToken());
+        assertEquals("7,7", parser.getLineNumber() + "," + parser.getColumnNumber());
+        assertEquals(XmlPullParser.END_DOCUMENT, parser.nextToken());
+        assertEquals("7,7", parser.getLineNumber() + "," + parser.getColumnNumber());
+    }
+
+    public void testEmptyCdata() throws Exception {
+        XmlPullParser parser = newPullParser();
+        parser.setInput(new StringReader("<foo><![CDATA[]]></foo>"));
+        assertEquals(XmlPullParser.START_TAG, parser.next());
+        assertEquals(XmlPullParser.TEXT, parser.next()); // TODO: This should probably fail!
+        assertEquals("", parser.getText());
+        assertEquals(XmlPullParser.END_TAG, parser.next());
+    }
+
     public void testParseReader() throws Exception {
         String snippet = "<dagny dad=\"bob\">hello</dagny>";
         XmlPullParser parser = newPullParser();
@@ -523,6 +581,14 @@
         assertEquals("ns:default", parser.getNamespaceUri(0));
     }
 
+    private void assertNextFails(XmlPullParser parser) throws IOException {
+        try {
+            parser.next();
+            fail();
+        } catch (XmlPullParserException expected) {
+        }
+    }
+
     /**
      * Creates a new pull parser with namespace support.
      */
diff --git a/xml/src/main/java/org/kxml2/io/KXmlParser.java b/xml/src/main/java/org/kxml2/io/KXmlParser.java
index 3ee5e43..9ca555b 100644
--- a/xml/src/main/java/org/kxml2/io/KXmlParser.java
+++ b/xml/src/main/java/org/kxml2/io/KXmlParser.java
@@ -36,13 +36,21 @@
  */
 public class KXmlParser implements XmlPullParser {
 
-    private Object location;
+    private static final char[] START_COMMENT = { '<', '!', '-', '-' };
+    private static final char[] END_COMMENT = { '-', '-', '>' };
+    private static final char[] START_CDATA = { '<', '!', '[', 'C', 'D', 'A', 'T', 'A', '[' };
+    private static final char[] END_CDATA = { ']', ']', '>' };
+    private static final char[] START_PROCESSING_INSTRUCTION = { '<', '?' };
+    private static final char[] END_PROCESSING_INSTRUCTION = { '?', '>' };
+    private static final char[] START_DOCTYPE = { '<', '!', 'D', 'O', 'C', 'T', 'Y', 'P', 'E' };
+    // no END_DOCTYPE because doctype must be parsed
+
     static final private String UNEXPECTED_EOF = "Unexpected EOF";
     static final private String ILLEGAL_TYPE = "Wrong event type";
-    static final private int LEGACY = 999;
-    static final private int XML_DECL = 998;
+    static final private int XML_DECLARATION = 998;
 
     // general
+    private String location;
 
     private String version;
     private Boolean standalone;
@@ -60,33 +68,31 @@
 
     private Reader reader;
     private String encoding;
-    private char[] srcBuf;
+    private final char[] buffer = new char[8192];
+    private int position = 0;
+    private int limit = 0;
 
-    private int srcPos;
-    private int srcCount;
+    /*
+     * Track the number of newlines and columns preceding the current buffer. To
+     * compute the line and column of a position in the buffer, compute the line
+     * and column in the buffer and add the preceding values.
+     */
+    private int bufferStartLine;
+    private int bufferStartColumn;
 
-    private int line;
-    private int column;
-
-    // txtbuffer
-
-    /** Target buffer for storing incoming text (including aggregated resolved entities) */
-    private char[] txtBuf = new char[128];
-    /** Write position */
-    private int txtPos;
-
-    // Event-related
+    // the current token
 
     private int type;
     private boolean isWhitespace;
     private String namespace;
     private String prefix;
     private String name;
+    private String text;
 
     private boolean degenerated;
     private int attributeCount;
 
-    /**
+    /*
      * The current element's attributes arranged in groups of 4:
      * i + 0 = attribute namespace URI
      * i + 1 = attribute namespace prefix
@@ -97,21 +103,9 @@
 
     private String error;
 
-    /**
-     * A separate peek buffer seems simpler than managing wrap around in the first level read
-     * buffer
-     */
-    private int[] peek = new int[2];
-    private int peekCount;
-    private boolean wasCR;
-
     private boolean unresolved;
     private boolean token;
 
-    public KXmlParser() {
-        srcBuf = new char[8192];
-    }
-
     /**
      * Retains namespace attributes like {@code xmlns="http://foo"} or {@code xmlns:foo="http:foo"}
      * in pulled elements. Most applications will only be interested in the effective namespaces of
@@ -161,7 +155,7 @@
                 nspStack[j + 1] = attributes[i + 3];
 
                 if (attrName != null && attributes[i + 3].isEmpty()) {
-                    error("illegal empty namespace");
+                    checkRelaxed("illegal empty namespace");
                 }
 
                 if (keepNamespaceAttributes) {
@@ -213,7 +207,7 @@
         int cut = name.indexOf(':');
 
         if (cut == 0) {
-            error("illegal tag name: " + name);
+            checkRelaxed("illegal tag name: " + name);
         }
 
         if (cut != -1) {
@@ -225,7 +219,7 @@
 
         if (this.namespace == null) {
             if (prefix != null) {
-                error("undefined prefix: " + prefix);
+                checkRelaxed("undefined prefix: " + prefix);
             }
             this.namespace = NO_NAMESPACE;
         }
@@ -242,21 +236,13 @@
         return bigger;
     }
 
-    private void error(String desc) throws XmlPullParserException {
-        if (relaxed) {
-            if (error == null) {
-                error = "ERR: " + desc;
-            }
-        } else {
-            exception(desc);
+    private void checkRelaxed(String errorMessage) throws XmlPullParserException {
+        if (!relaxed) {
+            throw new XmlPullParserException(errorMessage, this, null);
         }
-    }
-
-    private void exception(String desc) throws XmlPullParserException {
-        throw new XmlPullParserException(
-                desc.length() < 100 ? desc : desc.substring(0, 100) + "\n",
-                this,
-                null);
+        if (error == null) {
+            error = "Error: " + errorMessage;
+        }
     }
 
     /**
@@ -265,7 +251,7 @@
      */
     private void nextImpl() throws IOException, XmlPullParserException {
         if (reader == null) {
-            exception("No Input specified");
+            throw new XmlPullParserException("setInput() must be called first.", this, null);
         }
 
         if (type == END_TAG) {
@@ -285,9 +271,7 @@
             }
 
             if (error != null) {
-                for (int i = 0; i < error.length(); i++) {
-                    push(error.charAt(i));
-                }
+                text = error;
                 error = null;
                 type = COMMENT;
                 return;
@@ -301,229 +285,243 @@
 
             switch (type) {
 
-                case ENTITY_REF:
-                    pushEntity();
+            case ENTITY_REF:
+                if (token) {
+                    StringBuilder entityTextBuilder = new StringBuilder();
+                    readEntity(entityTextBuilder);
+                    text = entityTextBuilder.toString();
                     return;
+                }
+                // fall-through
+            case TEXT:
+                text = readValue('<', !token, false);
+                if (depth == 0 && isWhitespace) {
+                    type = IGNORABLE_WHITESPACE;
+                }
+                return;
 
-                case START_TAG:
-                    parseStartTag(false);
-                    return;
+            case START_TAG:
+                text = null; // TODO: fix next()/nextToken() so this is handled there
+                parseStartTag(false);
+                return;
 
-                case END_TAG:
-                    parseEndTag();
-                    return;
+            case END_TAG:
+                readEndTag();
+                return;
 
-                case END_DOCUMENT:
-                    return;
+            case END_DOCUMENT:
+                return;
 
-                case TEXT:
-                    pushText('<', !token, false);
-                    if (depth == 0) {
-                        if (isWhitespace) {
-                            type = IGNORABLE_WHITESPACE;
-                        }
-                    }
-                    return;
+            case XML_DECLARATION:
+                readXmlDeclaration();
+                continue;
 
-                default:
-                    type = parseLegacy(token);
-                    if (type != XML_DECL) {
-                        return;
-                    }
+            case PROCESSING_INSTRUCTION:
+                read(START_PROCESSING_INSTRUCTION);
+                if (token) {
+                    text = readUntil(END_PROCESSING_INSTRUCTION, true);
+                } else {
+                    readUntil(END_PROCESSING_INSTRUCTION, false);
+                }
+                return;
+
+            case DOCDECL:
+                readDoctype(token);
+                return;
+
+            case CDSECT:
+                String oldText = text;
+                read(START_CDATA);
+                text = readUntil(END_CDATA, true);
+                if (oldText != null) {
+                    text = oldText + text; // TODO: fix next()/nextToken() so this is handled there
+                }
+                return;
+
+            case COMMENT:
+                read(START_COMMENT);
+                if (token) {
+                    text = readUntil(END_COMMENT, true);
+                } else {
+                    readUntil(END_COMMENT, false);
+                }
+                return;
             }
         }
     }
 
-    private int parseLegacy(boolean push) throws IOException, XmlPullParserException {
-        String req = "";
-        int term;
-        int result;
-        int prev = 0;
-
-        read(); // <
-        int c = read();
-
-        if (c == '?') {
-            if ((peek(0) == 'x' || peek(0) == 'X')
-                    && (peek(1) == 'm' || peek(1) == 'M')) {
-
-                if (push) {
-                    push(peek(0));
-                    push(peek(1));
-                }
-                read();
-                read();
-
-                if ((peek(0) == 'l' || peek(0) == 'L') && peek(1) <= ' ') {
-
-                    if (line != 1 || column > 4) {
-                        error("PI must not start with xml");
-                    }
-
-                    parseStartTag(true);
-
-                    if (attributeCount < 1 || !"version".equals(attributes[2])) {
-                        error("version expected");
-                    }
-
-                    version = attributes[3];
-
-                    int pos = 1;
-
-                    if (pos < attributeCount
-                            && "encoding".equals(attributes[2 + 4])) {
-                        encoding = attributes[3 + 4];
-                        pos++;
-                    }
-
-                    if (pos < attributeCount
-                            && "standalone".equals(attributes[4 * pos + 2])) {
-                        String st = attributes[3 + 4 * pos];
-                        if ("yes".equals(st)) {
-                            standalone = new Boolean(true);
-                        } else if ("no".equals(st)) {
-                            standalone = new Boolean(false);
-                        } else {
-                            error("illegal standalone value: " + st);
-                        }
-                        pos++;
-                    }
-
-                    if (pos != attributeCount) {
-                        error("illegal xmldecl");
-                    }
-
-                    isWhitespace = true;
-                    txtPos = 0;
-
-                    return XML_DECL;
-                }
-            }
-
-            term = '?';
-            result = PROCESSING_INSTRUCTION;
-        } else if (c == '!') {
-            if (peek(0) == '-') {
-                result = COMMENT;
-                req = "--";
-                term = '-';
-            } else if (peek(0) == '[') {
-                result = CDSECT;
-                req = "[CDATA[";
-                term = ']';
-                push = true;
-            } else {
-                result = DOCDECL;
-                req = "DOCTYPE";
-                term = -1;
-            }
-        } else {
-            error("illegal: <" + c);
-            return COMMENT;
-        }
-
-        for (int i = 0; i < req.length(); i++) {
-            read(req.charAt(i));
-        }
-
-        if (result == DOCDECL) {
-            parseDoctype(push);
-        } else {
-            while (true) {
-                c = read();
-                if (c == -1) {
-                    error(UNEXPECTED_EOF);
-                    return COMMENT;
-                }
-
-                if (push) {
-                    push(c);
-                }
-
-                if ((term == '?' || c == term)
-                        && peek(0) == term
-                        && peek(1) == '>') {
-                    break;
-                }
-
-                prev = c;
-            }
-
-            if (term == '-' && prev == '-' && !relaxed) {
-                error("illegal comment delimiter: --->");
-            }
-
-            read();
-            read();
-
-            if (push && term != '?') {
-                txtPos--;
-            }
-
-        }
-        return result;
-    }
-
     /**
-     * precondition: &lt! consumed
+     * Reads text until the specified delimiter is encountered. Consumes the
+     * text and the delimiter.
+     *
+     * @param returnText true to return the read text excluding the delimiter;
+     *     false to return null.
      */
-    private void parseDoctype(boolean push) throws IOException, XmlPullParserException {
+    private String readUntil(char[] delimiter, boolean returnText)
+            throws IOException, XmlPullParserException {
+        int previous = -1;
+        int start = position;
+        StringBuilder result = null;
+
+        search:
+        while (true) {
+            if (position + delimiter.length >= limit) {
+                if (start < position && returnText) {
+                    if (result == null) {
+                        result = new StringBuilder();
+                    }
+                    result.append(buffer, start, position - start);
+                }
+                if (!fillBuffer(delimiter.length)) {
+                    checkRelaxed(UNEXPECTED_EOF);
+                    type = COMMENT;
+                    return null;
+                }
+                start = position;
+            }
+
+            // TODO: replace with Arrays.equals(buffer, position, delimiter, 0, delimiter.length)
+            // when the VM has better method inlining
+            for (int i = 0; i < delimiter.length; i++) {
+                if (buffer[position + i] != delimiter[i]) {
+                    previous = buffer[position];
+                    position++;
+                    continue search;
+                }
+            }
+
+            break;
+        }
+
+        if (delimiter == END_COMMENT && previous == '-') {
+            checkRelaxed("illegal comment delimiter: --->");
+        }
+
+        int end = position;
+        position += delimiter.length;
+
+        if (!returnText) {
+            return null;
+        } else if (result == null) {
+            return new String(buffer, start, end - start);
+        } else {
+            result.append(buffer, start, end - start);
+            return result.toString();
+        }
+    }
+
+    /**
+     * Returns true if an XML declaration was read.
+     */
+    private boolean readXmlDeclaration() throws IOException, XmlPullParserException {
+        if (bufferStartLine != 0 || bufferStartColumn != 0 || position != 0) {
+            checkRelaxed("processing instructions must not start with xml");
+        }
+
+        read(START_PROCESSING_INSTRUCTION);
+        parseStartTag(true);
+
+        if (attributeCount < 1 || !"version".equals(attributes[2])) {
+            checkRelaxed("version expected");
+        }
+
+        version = attributes[3];
+
+        int pos = 1;
+
+        if (pos < attributeCount && "encoding".equals(attributes[2 + 4])) {
+            encoding = attributes[3 + 4];
+            pos++;
+        }
+
+        if (pos < attributeCount && "standalone".equals(attributes[4 * pos + 2])) {
+            String st = attributes[3 + 4 * pos];
+            if ("yes".equals(st)) {
+                standalone = Boolean.TRUE;
+            } else if ("no".equals(st)) {
+                standalone = Boolean.FALSE;
+            } else {
+                checkRelaxed("illegal standalone value: " + st);
+            }
+            pos++;
+        }
+
+        if (pos != attributeCount) {
+            checkRelaxed("unexpected attributes in XML declaration");
+        }
+
+        isWhitespace = true;
+        text = null;
+        return true;
+    }
+
+    private void readDoctype(boolean assignText) throws IOException, XmlPullParserException {
+        read(START_DOCTYPE);
+
+        int start = position;
+        StringBuilder result = null;
         int nesting = 1;
         boolean quoted = false;
 
         while (true) {
-            int i = read();
-            switch (i) {
-
-                case -1:
-                    error(UNEXPECTED_EOF);
+            if (position >= limit) {
+                if (start < position && assignText) {
+                    if (result == null) {
+                        result = new StringBuilder();
+                    }
+                    result.append(buffer, start, position - start);
+                }
+                if (!fillBuffer(1)) {
+                    checkRelaxed(UNEXPECTED_EOF);
                     return;
-
-                case '\'':
-                    quoted = !quoted;
-                    break;
-
-                case '<':
-                    if (!quoted) {
-                        nesting++;
-                    }
-                    break;
-
-                case '>':
-                    if (!quoted) {
-                        if ((--nesting) == 0) {
-                            return;
-                        }
-                    }
-                    break;
+                }
+                start = position;
             }
-            if (push) {
-                push(i);
+
+            char i = buffer[position++];
+
+            if (i == '\'') {
+                quoted = !quoted; // TODO: should this include a double quote as well?
+            } else if (i == '<') {
+                if (!quoted) {
+                    nesting++;
+                }
+            } else if (i == '>') {
+                if (!quoted && --nesting == 0) {
+                    break;
+                }
+            }
+        }
+
+        if (assignText) {
+            if (result == null) {
+                text = new String(buffer, start, position - start - 1); // omit the '>'
+            } else {
+                result.append(buffer, start, position - start - 1); // omit the '>'
+                text = result.toString();
             }
         }
     }
 
-    /**
-     * precondition: &lt;/ consumed
-     */
-    private void parseEndTag() throws IOException, XmlPullParserException {
-        read(); // '<'
-        read(); // '/'
-        name = readName();
+    private void readEndTag() throws IOException, XmlPullParserException {
+        read('<');
+        read('/');
+        name = readName(); // TODO: pass the expected name in as a hint?
         skip();
         read('>');
 
-        int sp = (depth - 1) << 2;
+        int sp = (depth - 1) * 4;
 
         if (depth == 0) {
-            error("element stack empty");
+            checkRelaxed("read end tag " + name + " with no tags open");
             type = COMMENT;
             return;
         }
 
         if (!relaxed) {
             if (!name.equals(elementStack[sp + 3])) {
-                error("expected: /" + elementStack[sp + 3] + " read: " + name);
+                throw new XmlPullParserException(
+                        "expected: /" + elementStack[sp + 3] + " read: " + name, this, null);
             }
 
             namespace = elementStack[sp];
@@ -532,49 +530,59 @@
         }
     }
 
-    private int peekType() throws IOException {
-        switch (peek(0)) {
-            case -1:
-                return END_DOCUMENT;
-            case '&':
-                return ENTITY_REF;
-            case '<':
-                switch (peek(1)) {
-                    case '/':
-                        return END_TAG;
-                    case '?':
-                    case '!':
-                        return LEGACY;
-                    default:
-                        return START_TAG;
+    /**
+     * Returns the type of the next token.
+     */
+    private int peekType() throws IOException, XmlPullParserException {
+        if (position >= limit && !fillBuffer(1)) {
+            return END_DOCUMENT;
+        }
+
+        if (buffer[position] == '&') {
+            return ENTITY_REF;
+
+        } else if (buffer[position] == '<') {
+            if (position + 2 >= limit && !fillBuffer(3)) {
+                throw new XmlPullParserException("Dangling <", this, null);
+            }
+
+            if (buffer[position + 1] == '/') {
+                return END_TAG;
+            } else if (buffer[position + 1] == '?') {
+                // we're looking for "<?xml " with case insensitivity
+                if ((position + 5 < limit || fillBuffer(6))
+                        && (buffer[position + 2] == 'x' || buffer[position + 2] == 'X')
+                        && (buffer[position + 3] == 'm' || buffer[position + 3] == 'M')
+                        && (buffer[position + 4] == 'l' || buffer[position + 4] == 'L')
+                        && (buffer[position + 5] == ' ')) {
+                    return XML_DECLARATION;
+                } else {
+                    return PROCESSING_INSTRUCTION;
                 }
-            default:
-                return TEXT;
+            } else if (buffer[position + 1] == '!') {
+                if (buffer[position + 2] == START_DOCTYPE[2]) {
+                    return DOCDECL;
+                } else if (buffer[position + 2] == START_CDATA[2]) {
+                    return CDSECT;
+                } else if (buffer[position + 2] == START_COMMENT[2]) {
+                    return COMMENT;
+                } else {
+                    throw new XmlPullParserException("Unexpected <!", this, null);
+                }
+            } else {
+                return START_TAG;
+            }
+        } else {
+            return TEXT;
         }
     }
 
-    private String get(int pos) {
-        return new String(txtBuf, pos, txtPos - pos);
-    }
-
-    private void push(int c) {
-        isWhitespace &= c <= ' ';
-
-        if (txtPos == txtBuf.length) {
-            char[] bigger = new char[txtPos * 4 / 3 + 4];
-            System.arraycopy(txtBuf, 0, bigger, 0, txtPos);
-            txtBuf = bigger;
-        }
-
-        txtBuf[txtPos++] = (char) c;
-    }
-
     /**
      * Sets name and attributes
      */
     private void parseStartTag(boolean xmldecl) throws IOException, XmlPullParserException {
         if (!xmldecl) {
-            read();
+            read('<');
         }
         name = readName();
         attributeCount = 0;
@@ -582,84 +590,78 @@
         while (true) {
             skip();
 
-            int c = peek(0);
+            if (position >= limit && !fillBuffer(1)) {
+                checkRelaxed(UNEXPECTED_EOF);
+                return;
+            }
+
+            int c = buffer[position];
 
             if (xmldecl) {
                 if (c == '?') {
-                    read();
+                    position++;
                     read('>');
                     return;
                 }
             } else {
                 if (c == '/') {
                     degenerated = true;
-                    read();
+                    position++;
                     skip();
                     read('>');
                     break;
-                }
-
-                if (c == '>' && !xmldecl) {
-                    read();
+                } else if (c == '>') {
+                    position++;
                     break;
                 }
             }
 
-            if (c == -1) {
-                error(UNEXPECTED_EOF);
-                return;
-            }
-
             String attrName = readName();
 
-            if (attrName.length() == 0) {
-                error("attr name expected");
-                break;
-            }
-
-            int i = (attributeCount++) << 2;
-
+            int i = (attributeCount++) * 4;
             attributes = ensureCapacity(attributes, i + 4);
-
             attributes[i++] = "";
             attributes[i++] = null;
             attributes[i++] = attrName;
 
             skip();
+            if (position >= limit && !fillBuffer(1)) {
+                checkRelaxed(UNEXPECTED_EOF);
+                return;
+            }
 
-            if (peek(0) != '=') {
-                if (!relaxed) {
-                    error("Attr.value missing f. " + attrName);
-                }
-                attributes[i] = attrName;
-            } else {
-                read('=');
+            if (buffer[position] == '=') {
+                position++;
+
                 skip();
-                int delimiter = peek(0);
+                if (position >= limit && !fillBuffer(1)) {
+                    checkRelaxed(UNEXPECTED_EOF);
+                    return;
+                }
+                char delimiter = buffer[position];
 
-                if (delimiter != '\'' && delimiter != '"') {
-                    if (!relaxed) {
-                        error("attr value delimiter missing!");
-                    }
+                if (delimiter == '\'' || delimiter == '"') {
+                    position++;
+                } else if (relaxed) {
                     delimiter = ' ';
                 } else {
-                    read();
+                    throw new XmlPullParserException("attr value delimiter missing!", this, null);
                 }
 
-                int p = txtPos;
-                pushText(delimiter, true, true);
-
-                attributes[i] = get(p);
-                txtPos = p;
+                attributes[i] = readValue(delimiter, true, true);
 
                 if (delimiter != ' ') {
-                    read(); // skip endquote
+                    position++; // end quote
                 }
+            } else if (relaxed) {
+                attributes[i] = attrName;
+            } else {
+                checkRelaxed("Attr.value missing f. " + attrName);
+                attributes[i] = attrName;
             }
         }
 
-        int sp = depth++ << 2;
-
+        int sp = depth++ * 4;
         elementStack = ensureCapacity(elementStack, sp + 4);
         elementStack[sp + 3] = name;
 
@@ -683,217 +685,352 @@
     }
 
     /**
-     * result: isWhitespace; if the setName parameter is set, the name of the entity is stored in
-     * "name"
+     * Reads an entity reference from the buffer, resolves it, and writes the
+     * resolved entity to {@code out}. If the entity cannot be read or resolved,
+     * {@code out} will contain the partial entity reference.
      */
-    private void pushEntity() throws IOException, XmlPullParserException {
-        push(read()); // &
+    private void readEntity(StringBuilder out) throws IOException, XmlPullParserException {
+        int start = out.length();
 
-        int pos = txtPos;
-
-        while (true) {
-            int c = peek(0);
-            if (c == ';') {
-                read();
-                break;
-            }
-            if (c < 128 && (c < '0' || c > '9') && (c < 'a' || c > 'z') && (c < 'A' || c > 'Z')
-                    && c != '_' && c != '-' && c != '#') {
-                if (!relaxed) {
-                    error("unterminated entity ref");
-                }
-
-                return;
-            }
-
-            push(read());
+        if (buffer[position++] != '&') {
+            throw new AssertionError();
         }
 
-        String code = get(pos);
-        txtPos = pos - 1;
+        out.append('&');
+
+        while (true) {
+            int c = peekCharacter();
+
+            if (c == ';') {
+                position++;
+                break;
+
+            } else if (c >= 128
+                    || (c >= '0' && c <= '9')
+                    || (c >= 'a' && c <= 'z')
+                    || (c >= 'A' && c <= 'Z')
+                    || c == '_'
+                    || c == '-'
+                    || c == '#') {
+                position++;
+                out.append((char) c);
+
+            } else if (relaxed) {
+                // intentionally leave the partial reference in 'out'
+                return;
+
+            } else {
+                throw new XmlPullParserException("unterminated entity ref", this, null);
+            }
+        }
+
+        String code = out.substring(start + 1);
+        out.delete(start, out.length());
+
         if (token && type == ENTITY_REF) {
             name = code;
         }
 
         if (code.charAt(0) == '#') {
+            // TODO: check IndexOutOfBoundsException?
+            // TODO: save an intermediate string for 'code' if unneeded?
             int c = code.charAt(1) == 'x'
                     ? Integer.parseInt(code.substring(2), 16)
                     : Integer.parseInt(code.substring(1));
-            push(c);
+            // TODO: set unresolved to false?
+            out.append((char) c);
             return;
         }
 
-        String result = entityMap.get(code);
+        String resolved = entityMap.get(code);
+        if (resolved != null) {
+            unresolved = false;
+            out.append(resolved);
+            return;
+        }
 
-        unresolved = result == null;
-
-        if (unresolved) {
-            if (!token) {
-                error("unresolved: &" + code + ";");
-            }
-        } else {
-            for (int i = 0; i < result.length(); i++) {
-                push(result.charAt(i));
-            }
+        unresolved = true;
+        if (!token) {
+            checkRelaxed("unresolved: &" + code + ";");
+            // TODO: should the &code; show up in the text in relaxed mode?
         }
     }
 
     /**
-     * types: '<': parse to any token (for nextToken ()) '"': parse to quote ' ': parse to
-     * whitespace or '>'
+     * Returns the current text or attribute value. This also has the side
+     * effect of setting isWhitespace to false if a non-whitespace character is
+     * encountered.
+     *
+     * @param delimiter {@code >} for text, {@code "} and {@code '} for quoted
+     *     attributes, or a space for unquoted attributes.
      */
-    private void pushText(int delimiter, boolean resolveEntities, boolean inAttributeValue)
-            throws IOException, XmlPullParserException {
+    private String readValue(char delimiter, boolean resolveEntities,
+            boolean inAttributeValue) throws IOException, XmlPullParserException {
 
-        int next = peek(0);
-        int cbrCount = 0;
+        /*
+         * This method returns all of the characters from the current position
+         * through to an appropriate delimiter.
+         *
+         * If we're lucky (which we usually are), we'll return a single slice of
+         * the buffer. This fast path avoids allocating a string builder.
+         *
+         * There are 5 unlucky characters we could encounter:
+         *  - "&":  entities must be resolved.
+         *  - "<":  this isn't permitted in attributes unless relaxed.
+         *  - "]":  this requires a lookahead to defend against the forbidden
+         *          CDATA section delimiter "]]>".
+         *  - "\r": If a "\r" is followed by a "\n", we discard the "\r". If it
+         *          isn't followed by "\n", we replace "\r" with either a "\n"
+         *          in text nodes or a space in attribute values.
+         *  - "\n": In attribute values, "\n" must be replaced with a space.
+         *
+         * We could also get unlucky by needing to refill the buffer midway
+         * through the text.
+         */
 
-        while (next != -1 && next != delimiter) { // covers eof, '<', '"'
+        int start = position;
+        StringBuilder result = null;
 
-            if (delimiter == ' ' && (next <= ' ' || next == '>')) {
+        // if a text section was already started, prefix the start
+        if (text != null) {
+            result = new StringBuilder();
+            result.append(text);
+        }
+
+        while (true) {
+
+            /*
+             * Make sure we have at least a single character to read from the
+             * buffer. This mutates the buffer, so save the partial result
+             * to the slow path string builder first.
+             */
+            if (position >= limit) {
+                if (start < position) {
+                    if (result == null) {
+                        result = new StringBuilder();
+                    }
+                    result.append(buffer, start, position - start);
+                }
+                if (!fillBuffer(1)) {
+                    return result != null ? result.toString() : "";
+                }
+                start = position;
+            }
+
+            char c = buffer[position];
+
+            if (c == delimiter
+                    || (delimiter == ' ' && (c <= ' ' || c == '>'))
+                    || c == '&' && !resolveEntities) {
                 break;
             }
 
-            if (next == '&') {
-                if (!resolveEntities) {
-                    break;
-                }
-
-                pushEntity();
-            } else if (next == '<' && inAttributeValue) {
-                error("Illegal: \"<\" inside attribute value");
-            } else if (next == '\n' && type == START_TAG) {
-                read();
-                push(' ');
-            } else {
-                push(read());
+            if (c != '\r'
+                    && (c != '\n' || !inAttributeValue)
+                    && c != '&'
+                    && c != '<'
+                    && (c != ']' || inAttributeValue)) {
+                isWhitespace &= (c <= ' ');
+                position++;
+                continue;
             }
 
             /*
-             * "]]>" is allowed in attribute values, but is not allowed in
-             * regular text between markup.
+             * We've encountered an unlucky character! Convert from fast
+             * path to slow path if we haven't done so already.
              */
-            final boolean allowCloseCdata = inAttributeValue;
-            if (!allowCloseCdata && (next == '>' && cbrCount >= 2 && delimiter != ']')) {
-                error("Illegal: \"]]>\" outside CDATA section");
+            if (result == null) {
+                result = new StringBuilder();
             }
+            result.append(buffer, start, position - start);
 
-            if (next == ']') {
-                cbrCount++;
+            if (c == '\r') {
+                if ((position + 1 < limit || fillBuffer(2)) && buffer[position + 1] == '\n') {
+                    position++;
+                }
+                c = inAttributeValue ? ' ' : '\n';
+
+            } else if (c == '\n') {
+                c = ' ';
+
+            } else if (c == '&') {
+                isWhitespace = false; // TODO: what if the entity resolves to whitespace?
+                readEntity(result);
+                start = position;
+                continue;
+
+            } else if (c == '<') {
+                if (inAttributeValue) {
+                    checkRelaxed("Illegal: \"<\" inside attribute value");
+                }
+                isWhitespace = false;
+
+            } else if (c == ']') {
+                if ((position + 2 < limit || fillBuffer(3))
+                        && buffer[position + 1] == ']' && buffer[position + 2] == '>') {
+                    checkRelaxed("Illegal: \"]]>\" outside CDATA section");
+                }
+                isWhitespace = false;
+
             } else {
-                cbrCount = 0;
+                throw new AssertionError();
             }
 
-            next = peek(0);
+            position++;
+            result.append(c);
+            start = position;
         }
-    }
 
-    private void read(char c) throws IOException, XmlPullParserException {
-        int a = read();
-        if (a != c) {
-            error("expected: '" + c + "' actual: '" + ((char) a) + "'");
-        }
-    }
-
-    private int read() throws IOException {
-        int result;
-
-        if (peekCount == 0) {
-            result = peek(0);
+        if (result == null) {
+            return new String(buffer, start, position - start);
         } else {
-            result = peek[0];
-            peek[0] = peek[1];
+            result.append(buffer, start, position - start);
+            return result.toString();
         }
-        peekCount--;
+    }
 
-        column++;
+    private void read(char expected) throws IOException, XmlPullParserException {
+        int c = peekCharacter();
+        if (c != expected) {
+            checkRelaxed("expected: '" + expected + "' actual: '" + ((char) c) + "'");
+        }
+        position++;
+    }
 
-        if (result == '\n') {
-
-            line++;
-            column = 1;
+    private void read(char[] chars) throws IOException, XmlPullParserException {
+        if (position + chars.length >= limit && !fillBuffer(chars.length)) {
+            checkRelaxed("expected: '" + new String(chars) + "' but was EOF");
+            return;
         }
 
-        return result;
+        // TODO: replace with Arrays.equals(buffer, position, delimiter, 0, delimiter.length)
+        // when the VM has better method inlining
+        for (int i = 0; i < chars.length; i++) {
+            if (buffer[position + i] != chars[i]) {
+                checkRelaxed("expected: \"" + new String(chars) + "\" but was \""
+                        + new String(buffer, position, chars.length) + "...\"");
+            }
+        }
+
+        position += chars.length;
+    }
+
+    private int peekCharacter() throws IOException, XmlPullParserException {
+        if (position < limit || fillBuffer(1)) {
+            return buffer[position];
+        }
+        return -1;
     }
 
     /**
-     * Does never read more than needed
+     * Returns true once {@code limit - position >= minimum}. If the data is
+     * exhausted before that many characters are available, this returns
+     * false.
      */
-    private int peek(int pos) throws IOException {
-        while (pos >= peekCount) {
-            int nw;
-            if (srcBuf.length <= 1) {
-                nw = reader.read();
-            } else if (srcPos < srcCount) {
-                nw = srcBuf[srcPos++];
+    private boolean fillBuffer(int minimum) throws IOException {
+        // Before clobbering the old characters, update where buffer starts
+        for (int i = 0; i < position; i++) {
+            if (buffer[i] == '\n') {
+                bufferStartLine++;
+                bufferStartColumn = 0;
             } else {
-                srcCount = reader.read(srcBuf, 0, srcBuf.length);
-                if (srcCount <= 0) {
-                    nw = -1;
-                } else {
-                    nw = srcBuf[0];
-                }
-
-                srcPos = 1;
-            }
-
-            if (nw == '\r') {
-                wasCR = true;
-                peek[peekCount++] = '\n';
-            } else {
-                if (nw == '\n') {
-                    if (!wasCR) {
-                        peek[peekCount++] = '\n';
-                    }
-                } else {
-                    peek[peekCount++] = nw;
-                }
-
-                wasCR = false;
+                bufferStartColumn++;
             }
         }
 
-        return peek[pos];
+        if (limit != position) {
+            limit -= position;
+            System.arraycopy(buffer, position, buffer, 0, limit);
+        } else {
+            limit = 0;
+        }
+
+        position = 0;
+        int total;
+        while ((total = reader.read(buffer, limit, buffer.length - limit)) != -1) {
+            limit += total;
+            if (limit >= minimum) {
+                return true;
+            }
+        }
+        return false;
     }
 
+    /**
+     * Returns an element or attribute name. This is always non-empty for
+     * non-relaxed parsers.
+     */
     private String readName() throws IOException, XmlPullParserException {
-        int pos = txtPos;
-        int c = peek(0);
-        if ((c < 'a' || c > 'z')
-                && (c < 'A' || c > 'Z')
-                && c != '_'
-                && c != ':'
-                && c < 0x0c0
-                && !relaxed) {
-            error("name expected");
+        if (position >= limit && !fillBuffer(1)) {
+            checkRelaxed("name expected");
+            return "";
         }
 
-        do {
-            push(read());
-            c = peek(0);
-        }
-        while ((c >= 'a' && c <= 'z')
+        int start = position;
+        StringBuilder result = null;
+
+        // read the first character
+        char c = buffer[position];
+        if ((c >= 'a' && c <= 'z')
                 || (c >= 'A' && c <= 'Z')
-                || (c >= '0' && c <= '9')
                 || c == '_'
-                || c == '-'
                 || c == ':'
-                || c == '.'
-                || c >= 0x0b7);
+                || c >= '\u00c0' // TODO: check the XML spec
+                || relaxed) {
+            position++;
+        } else {
+            checkRelaxed("name expected");
+            return "";
+        }
 
-        String result = get(pos);
-        txtPos = pos;
-        return result;
+        while (true) {
+            /*
+             * Make sure we have at least a single character to read from the
+             * buffer. This mutates the buffer, so save the partial result
+             * to the slow path string builder first.
+             */
+            if (position >= limit) {
+                if (result == null) {
+                    result = new StringBuilder();
+                }
+                result.append(buffer, start, position - start);
+                if (!fillBuffer(1)) {
+                    return result.toString();
+                }
+                start = position;
+            }
+
+            // read another character
+            c = buffer[position];
+            if ((c >= 'a' && c <= 'z')
+                    || (c >= 'A' && c <= 'Z')
+                    || (c >= '0' && c <= '9')
+                    || c == '_'
+                    || c == '-'
+                    || c == ':'
+                    || c == '.'
+                    || c >= '\u00b7') {  // TODO: check the XML spec
+                position++;
+                continue;
+            }
+
+            // we encountered a non-name character. done!
+            if (result == null) {
+                return new String(buffer, start, position - start);
+            } else {
+                result.append(buffer, start, position - start);
+                return result.toString();
+            }
+        }
     }
 
     private void skip() throws IOException {
-        while (true) {
-            int c = peek(0);
-            if (c > ' ' || c == -1) {
+        while (position < limit || fillBuffer(1)) {
+            int c = buffer[position];
+            if (c > ' ') {
                 break;
             }
-            read();
+            position++;
         }
     }
 
@@ -902,8 +1039,6 @@
     public void setInput(Reader reader) throws XmlPullParserException {
         this.reader = reader;
 
-        line = 1;
-        column = 0;
         type = START_DOCUMENT;
         name = null;
         namespace = null;
@@ -917,9 +1052,10 @@
             return;
         }
 
-        srcPos = 0;
-        srcCount = 0;
-        peekCount = 0;
+        position = 0;
+        limit = 0;
+        bufferStartLine = 0;
+        bufferStartColumn = 0;
         depth = 0;
 
         entityMap = new HashMap<String, String>();
@@ -931,8 +1067,8 @@
     }
 
     public void setInput(InputStream is, String _enc) throws XmlPullParserException {
-        srcPos = 0;
-        srcCount = 0;
+        position = 0;
+        limit = 0;
         String enc = _enc;
 
         if (is == null) {
@@ -941,66 +1077,64 @@
 
         try {
             if (enc == null) {
-                // read four bytes
-
-                int chk = 0;
-
-                while (srcCount < 4) {
+                // read the four bytes looking for an indication of the encoding in use
+                int firstFourBytes = 0;
+                while (limit < 4) {
                     int i = is.read();
                     if (i == -1) {
                         break;
                     }
-                    chk = (chk << 8) | i;
-                    srcBuf[srcCount++] = (char) i;
+                    firstFourBytes = (firstFourBytes << 8) | i;
+                    buffer[limit++] = (char) i;
                 }
 
-                if (srcCount == 4) {
-                    switch (chk) {
-                        case 0x00000FEFF:
+                if (limit == 4) {
+                    switch (firstFourBytes) {
+                        case 0x00000FEFF: // UTF-32BE BOM
                             enc = "UTF-32BE";
-                            srcCount = 0;
+                            limit = 0;
                             break;
 
-                        case 0x0FFFE0000:
+                        case 0x0FFFE0000: // UTF-32LE BOM
                             enc = "UTF-32LE";
-                            srcCount = 0;
+                            limit = 0;
                             break;
 
-                        case 0x03c:
+                        case 0x0000003c: // '>' in UTF-32BE
                             enc = "UTF-32BE";
-                            srcBuf[0] = '<';
-                            srcCount = 1;
+                            buffer[0] = '<';
+                            limit = 1;
                             break;
 
-                        case 0x03c000000:
+                        case 0x03c000000: // '<' in UTF-32LE
                             enc = "UTF-32LE";
-                            srcBuf[0] = '<';
-                            srcCount = 1;
+                            buffer[0] = '<';
+                            limit = 1;
                             break;
 
-                        case 0x0003c003f:
+                        case 0x0003c003f: // "<?" in UTF-16BE
                             enc = "UTF-16BE";
-                            srcBuf[0] = '<';
-                            srcBuf[1] = '?';
-                            srcCount = 2;
+                            buffer[0] = '<';
+                            buffer[1] = '?';
+                            limit = 2;
                             break;
 
-                        case 0x03c003f00:
+                        case 0x03c003f00: // "<?" in UTF-16LE
                             enc = "UTF-16LE";
-                            srcBuf[0] = '<';
-                            srcBuf[1] = '?';
-                            srcCount = 2;
+                            buffer[0] = '<';
+                            buffer[1] = '?';
+                            limit = 2;
                             break;
 
-                        case 0x03c3f786d:
+                        case 0x03c3f786d: // "<?xm" in ASCII etc.
                             while (true) {
                                 int i = is.read();
                                 if (i == -1) {
                                     break;
                                 }
-                                srcBuf[srcCount++] = (char) i;
+                                buffer[limit++] = (char) i;
                                 if (i == '>') {
-                                    String s = new String(srcBuf, 0, srcCount);
+                                    String s = new String(buffer, 0, limit);
                                     int i0 = s.indexOf("encoding");
                                     if (i0 != -1) {
                                         while (s.charAt(i0) != '"'
@@ -1016,20 +1150,19 @@
                             }
 
                         default:
-                            if ((chk & 0x0ffff0000) == 0x0FEFF0000) {
+                            // handle a byte order mark followed by something other than <?
+                            if ((firstFourBytes & 0x0ffff0000) == 0x0FEFF0000) {
                                 enc = "UTF-16BE";
-                                srcBuf[0] =
-                                        (char) ((srcBuf[2] << 8) | srcBuf[3]);
-                                srcCount = 1;
-                            } else if ((chk & 0x0ffff0000) == 0x0fffe0000) {
+                                buffer[0] = (char) ((buffer[2] << 8) | buffer[3]);
+                                limit = 1;
+                            } else if ((firstFourBytes & 0x0ffff0000) == 0x0fffe0000) {
                                 enc = "UTF-16LE";
-                                srcBuf[0] =
-                                        (char) ((srcBuf[3] << 8) | srcBuf[2]);
-                                srcCount = 1;
-                            } else if ((chk & 0x0ffffff00) == 0x0EFBBBF00) {
+                                buffer[0] = (char) ((buffer[3] << 8) | buffer[2]);
+                                limit = 1;
+                            } else if ((firstFourBytes & 0x0ffffff00) == 0x0EFBBBF00) {
                                 enc = "UTF-8";
-                                srcBuf[0] = srcBuf[3];
-                                srcCount = 1;
+                                buffer[0] = buffer[3];
+                                limit = 1;
                             }
                     }
                 }
@@ -1039,15 +1172,12 @@
                 enc = "UTF-8";
             }
 
-            int sc = srcCount;
+            int sc = limit;
             setInput(new InputStreamReader(is, enc));
             encoding = _enc;
-            srcCount = sc;
+            limit = sc;
         } catch (Exception e) {
-            throw new XmlPullParserException(
-                    "Invalid stream or encoding: " + e.toString(),
-                    this,
-                    e);
+            throw new XmlPullParserException("Invalid stream or encoding: " + e, this, e);
         }
     }
 
@@ -1094,11 +1224,11 @@
     }
 
     public String getNamespacePrefix(int pos) {
-        return nspStack[pos << 1];
+        return nspStack[pos * 2];
     }
 
     public String getNamespaceUri(int pos) {
-        return nspStack[(pos << 1) + 1];
+        return nspStack[(pos * 2) + 1];
     }
 
     public String getNamespace(String prefix) {
@@ -1144,12 +1274,11 @@
             }
             buf.append(name);
 
-            int cnt = attributeCount << 2;
+            int cnt = attributeCount * 4;
             for (int i = 0; i < cnt; i += 4) {
                 buf.append(' ');
                 if (attributes[i + 1] != null) {
-                    buf.append(
-                            "{" + attributes[i] + "}" + attributes[i + 1] + ":");
+                    buf.append("{" + attributes[i] + "}" + attributes[i + 1] + ":");
                 }
                 buf.append(attributes[i + 2] + "='" + attributes[i + 3] + "'");
             }
@@ -1169,7 +1298,7 @@
             buf.append(text);
         }
 
-        buf.append("@" + line + ":" + column);
+        buf.append("@" + getLineNumber() + ":" + getColumnNumber());
         if (location != null) {
             buf.append(" in ");
             buf.append(location);
@@ -1181,40 +1310,55 @@
     }
 
     public int getLineNumber() {
-        return line;
+        int result = bufferStartLine;
+        for (int i = 0; i < position; i++) {
+            if (buffer[i] == '\n') {
+                result++;
+            }
+        }
+        return result + 1; // the first line is '1'
     }
 
     public int getColumnNumber() {
-        return column;
+        int result = bufferStartColumn;
+        for (int i = 0; i < position; i++) {
+            if (buffer[i] == '\n') {
+                result = 0;
+            } else {
+                result++;
+            }
+        }
+        return result + 1; // the first column is '1'
     }
 
     public boolean isWhitespace() throws XmlPullParserException {
         if (type != TEXT && type != IGNORABLE_WHITESPACE && type != CDSECT) {
-            exception(ILLEGAL_TYPE);
+            throw new XmlPullParserException(ILLEGAL_TYPE, this, null);
         }
         return isWhitespace;
     }
 
     public String getText() {
-        return type < TEXT
-                || (type == ENTITY_REF && unresolved) ? null : get(0);
+        if (type < TEXT || (type == ENTITY_REF && unresolved)) {
+            return null;
+        } else if (text == null) {
+            return "";
+        } else {
+            return text;
+        }
     }
 
     public char[] getTextCharacters(int[] poslen) {
-        if (type >= TEXT) {
-            if (type == ENTITY_REF) {
-                poslen[0] = 0;
-                poslen[1] = name.length();
-                return name.toCharArray();
-            }
-            poslen[0] = 0;
-            poslen[1] = txtPos;
-            return txtBuf;
+        String text = getText();
+        if (text == null) {
+            poslen[0] = -1;
+            poslen[1] = -1;
+            return null;
         }
-
-        poslen[0] = -1;
-        poslen[1] = -1;
-        return null;
+        char[] result = text.toCharArray();
+        poslen[0] = 0;
+        poslen[1] = result.length;
+        return result;
     }
 
     public String getNamespace() {
@@ -1231,7 +1375,7 @@
 
     public boolean isEmptyElementTag() throws XmlPullParserException {
         if (type != START_TAG) {
-            exception(ILLEGAL_TYPE);
+            throw new XmlPullParserException(ILLEGAL_TYPE, this, null);
         }
         return degenerated;
     }
@@ -1252,33 +1396,32 @@
         if (index >= attributeCount) {
             throw new IndexOutOfBoundsException();
         }
-        return attributes[index << 2];
+        return attributes[index * 4];
     }
 
     public String getAttributeName(int index) {
         if (index >= attributeCount) {
             throw new IndexOutOfBoundsException();
         }
-        return attributes[(index << 2) + 2];
+        return attributes[(index * 4) + 2];
     }
 
     public String getAttributePrefix(int index) {
         if (index >= attributeCount) {
             throw new IndexOutOfBoundsException();
         }
-        return attributes[(index << 2) + 1];
+        return attributes[(index * 4) + 1];
     }
 
     public String getAttributeValue(int index) {
         if (index >= attributeCount) {
             throw new IndexOutOfBoundsException();
         }
-        return attributes[(index << 2) + 3];
+        return attributes[(index * 4) + 3];
     }
 
     public String getAttributeValue(String namespace, String name) {
-
-        for (int i = (attributeCount << 2) - 4; i >= 0; i -= 4) {
+        for (int i = (attributeCount * 4) - 4; i >= 0; i -= 4) {
             if (attributes[i + 2].equals(name)
                     && (namespace == null || attributes[i].equals(namespace))) {
                 return attributes[i + 3];
@@ -1293,8 +1436,7 @@
     }
 
     public int next() throws XmlPullParserException, IOException {
-
-        txtPos = 0;
+        text = null;
         isWhitespace = true;
         int minType = 9999;
         token = false;
@@ -1304,9 +1446,7 @@
             if (type < minType) {
                 minType = type;
             }
-            //    if (curr <= TEXT) type = curr;
-        }
-        while (minType > ENTITY_REF // ignorable
+        } while (minType > ENTITY_REF // ignorable
                 || (minType >= TEXT && peekType() >= TEXT));
 
         type = minType;
@@ -1319,7 +1459,7 @@
 
     public int nextToken() throws XmlPullParserException, IOException {
         isWhitespace = true;
-        txtPos = 0;
+        text = null;
 
         token = true;
         nextImpl();
@@ -1335,7 +1475,7 @@
         }
 
         if (type != END_TAG && type != START_TAG) {
-            exception("unexpected type");
+            throw new XmlPullParserException("unexpected type", this, null);
         }
 
         return type;
@@ -1347,14 +1487,14 @@
         if (type != this.type
                 || (namespace != null && !namespace.equals(getNamespace()))
                 || (name != null && !name.equals(getName()))) {
-            exception(
-                    "expected: " + TYPES[type] + " {" + namespace + "}" + name);
+            throw new XmlPullParserException(
+                    "expected: " + TYPES[type] + " {" + namespace + "}" + name, this, null);
         }
     }
 
     public String nextText() throws XmlPullParserException, IOException {
         if (type != START_TAG) {
-            exception("precondition: START_TAG");
+            throw new XmlPullParserException("precondition: START_TAG", this, null);
         }
 
         next();
@@ -1368,7 +1508,7 @@
         }
 
         if (type != END_TAG) {
-            exception("END_TAG expected");
+            throw new XmlPullParserException("END_TAG expected", this, null);
         }
 
         return result;
@@ -1378,15 +1518,16 @@
         if (XmlPullParser.FEATURE_PROCESS_NAMESPACES.equals(feature)) {
             processNsp = value;
         } else if (isProp(feature, false, "relaxed")) {
+            // "http://xmlpull.org/v1/doc/features.html#relaxed"
             relaxed = value;
         } else {
-            exception("unsupported feature: " + feature);
+            throw new XmlPullParserException("unsupported feature: " + feature, this, null);
         }
     }
 
     public void setProperty(String property, Object value) throws XmlPullParserException {
         if (isProp(property, true, "location")) {
-            location = value;
+            location = String.valueOf(value);
         } else {
             throw new XmlPullParserException("unsupported property: " + property);
         }
diff --git a/xml/src/main/java/org/xmlpull/v1/XmlPullParser.java b/xml/src/main/java/org/xmlpull/v1/XmlPullParser.java
index b2f5e39..48c95a9 100644
--- a/xml/src/main/java/org/xmlpull/v1/XmlPullParser.java
+++ b/xml/src/main/java/org/xmlpull/v1/XmlPullParser.java
@@ -59,7 +59,7 @@
  *  getProperty(&quot;<a href="http://xmlpull.org/v1/doc/properties.html#xmldecl-version">http://xmlpull.org/v1/doc/properties.html#xmldecl-version</a>&quot;)
  *       returns String ("1.0") or null if XMLDecl was not read or if property is not supported
  * <li><b>standalone</b>:
- *  getProperty(&quot;<a href="http://xmlpull.org/v1/doc/features.html#xmldecl-standalone">http://xmlpull.org/v1/doc/features.html#xmldecl-standalone</a>&quot;)
+ *  getProperty(&quot;<a href="http://xmlpull.org/v1/doc/properties.html#xmldecl-standalone">http://xmlpull.org/v1/doc/properties.html#xmldecl-standalone</a>&quot;)
  *       returns Boolean: null if there was no standalone declaration
  *  or if property is not supported
  *         otherwise returns Boolean(true) if standalone="yes" and Boolean(false) when standalone="no"
