diff --git a/Text/XML/Expat/Annotated.hs b/Text/XML/Expat/Annotated.hs
--- a/Text/XML/Expat/Annotated.hs
+++ b/Text/XML/Expat/Annotated.hs
@@ -49,24 +49,10 @@
   saxToTreeG,
 
   -- * Abstraction of string types
-  GenericXMLString(..),
-
-  -- * Deprecated
-  eAttrs,
-  parseSAX,
-  parseSAXThrowing,
-  parseSAXLocations,
-  parseSAXLocationsThrowing,
-  parseTree,
-  parseTree',
-  parseTreeThrowing,
-  unannotate,
-  ParserOptions,
-  defaultParserOptions
+  GenericXMLString(..)
   ) where
 
-import Control.Arrow
-import qualified Text.XML.Expat.Tree as Tree
+import Control.Arrow (first)
 import Text.XML.Expat.SAX ( Encoding(..)
                           , GenericXMLString(..)
                           , ParseOptions(..)
@@ -74,13 +60,7 @@
                           , SAXEvent(..)
                           , XMLParseError(..)
                           , XMLParseException(..)
-                          , XMLParseLocation(..)
-                          , parseSAX
-                          , parseSAXThrowing
-                          , parseSAXLocations
-                          , parseSAXLocationsThrowing
-                          , ParserOptions
-                          , defaultParserOptions )
+                          , XMLParseLocation(..) )
 import qualified Text.XML.Expat.SAX as SAX
 import Text.XML.Expat.Internal.Namespaced
 import Text.XML.Expat.Internal.NodeClass
@@ -99,8 +79,8 @@
 -- that it has an extra piece of information of your choice attached to each
 -- Element.
 --
--- @c@ is the container type for the element's children, which is [] in the
--- @hexpat@ package, and a monadic list type for @hexpat-iteratee@.
+-- @c@ is the container type for the element's children, which would normally be [],
+-- but could potentially be a monadic list type to allow for chunked I/O.
 --
 -- @tag@ is the tag type, which can either be one of several string types,
 -- or a special type from the @Text.XML.Expat.Namespaced@ or
@@ -153,10 +133,6 @@
     Text t1 == Text t2 = t1 == t2
     _ == _ = False
 
-eAttrs :: Node a tag text -> [(tag, text)]
-{-# DEPRECATED eAttrs "use eAttributes instead" #-}
-eAttrs = eAttributes
-
 instance (NFData tag, NFData text, NFData a) => NFData (NodeG a [] tag text) where
     rnf (Element nam att chi ann) = rnf (nam, att, chi, ann)
     rnf (Text txt) = rnf txt
@@ -223,13 +199,6 @@
 instance (Functor c, List c) => MkElementClass (NodeG ()) c where
     mkElement name attrs children = Element name attrs children ()
 
--- | Convert an annotated tree (/Annotated/ module) into a non-annotated
--- tree (/Tree/ module).  DEPRECATED in favour of 'fromElement'.
-unannotate :: Functor c => NodeG a c tag text -> Tree.NodeG c tag text
-{-# DEPRECATED unannotate "use fromElement instead" #-}
-unannotate (Element na at ch _) = (Tree.Element na at (fmap unannotate ch))
-unannotate (Text t) = Tree.Text t
-
 -- | Type alias for an annotated node with unqualified tag names where
 -- tag and text are the same string type
 type UNode a text = Node a text text
@@ -339,18 +308,6 @@
        -> ItemM l (NodeG XMLParseLocation l tag text)
 parseG opts = saxToTreeG . SAX.parseLocationsG opts
 
--- | DEPRECATED: Use 'parse' instead.
---
--- Lazily parse XML to tree. Note that forcing the XMLParseError return value
--- will force the entire parse.  Therefore, to ensure lazy operation, don't
--- check the error status until you have processed the tree.
-parseTree :: (GenericXMLString tag, GenericXMLString text) =>
-             Maybe Encoding      -- ^ Optional encoding override
-          -> L.ByteString        -- ^ Input text (a lazy ByteString)
-          -> (LNode tag text, Maybe XMLParseError)
-{-# DEPRECATED parseTree "use Text.XML.Annotated.parse instead" #-}
-parseTree mEnc = parse (ParseOptions mEnc Nothing)
-
 -- | Lazily parse XML to tree. In the event of an error, throw 'XMLParseException'.
 --
 -- @parseThrowing@ can throw an exception from pure code, which is generally a bad
@@ -364,32 +321,12 @@
               -> LNode tag text
 parseThrowing opts bs = fst $ saxToTree $ SAX.parseLocationsThrowing opts bs
 
--- | DEPRECATED: use 'parseThrowing' instead
---
--- Lazily parse XML to tree. In the event of an error, throw 'XMLParseException'.
-parseTreeThrowing :: (GenericXMLString tag, GenericXMLString text) =>
-             Maybe Encoding      -- ^ Optional encoding override
-          -> L.ByteString        -- ^ Input text (a lazy ByteString)
-          -> LNode tag text
-{-# DEPRECATED parseTreeThrowing "use Text.XML.Annotated.parseThrowing instead" #-}
-parseTreeThrowing mEnc = parseThrowing (ParseOptions mEnc Nothing)
-
 -- | Strictly parse XML to tree. Returns error message or valid parsed tree.
 parse' :: (GenericXMLString tag, GenericXMLString text) =>
           ParseOptions tag text   -- ^ Parse options
        -> B.ByteString            -- ^ Input text (a strict ByteString)
        -> Either XMLParseError (LNode tag text)
-parse' opts bs = case parse opts (L.fromChunks [bs]) of
-    (_, Just err)   -> Left err
-    (root, Nothing) -> Right root 
-
--- | DEPRECATED: use 'parse' instead.
---
--- Strictly parse XML to tree. Returns error message or valid parsed tree.
-parseTree' :: (GenericXMLString tag, GenericXMLString text) =>
-              Maybe Encoding      -- ^ Optional encoding override
-           -> B.ByteString        -- ^ Input text (a strict ByteString)
-           -> Either XMLParseError (LNode tag text)
-{-# DEPRECATED parseTree' "use Text.XML.Expat.parse' instead" #-}
-parseTree' mEnc = parse' (ParseOptions mEnc Nothing)
+parse' opts doc = case parse opts (L.fromChunks [doc]) of
+    (xml, Nothing) -> Right xml
+    (_, Just err)  -> Left err
 
diff --git a/Text/XML/Expat/Format.hs b/Text/XML/Expat/Format.hs
--- a/Text/XML/Expat/Format.hs
+++ b/Text/XML/Expat/Format.hs
@@ -28,9 +28,6 @@
         formatDocument,
         formatDocument',
         formatDocumentG,
-        -- * Deprecated names
-        formatTree,
-        formatTree',
         -- * Low level
         xmlHeader,
         treeToSAX,
@@ -58,12 +55,6 @@
 import Data.Text (Text)
 import Text.XML.Expat.Tree (UNode)
 
--- | DEPRECATED: Renamed to 'format'.
-formatTree :: (NodeClass n [], GenericXMLString tag, GenericXMLString text) =>
-              n [] tag text
-           -> L.ByteString
-formatTree = format
-
 -- | Format document with <?xml.. header - lazy variant that returns lazy ByteString.
 format :: (NodeClass n [], GenericXMLString tag, GenericXMLString text) =>
           n [] tag text
@@ -77,12 +68,6 @@
           n c tag text
        -> c B.ByteString
 formatG node = cons xmlHeader $ formatNodeG node
-
--- | DEPRECATED: Renamed to 'format''.
-formatTree' :: (NodeClass n [], GenericXMLString tag, GenericXMLString text) =>
-               n [] tag text
-            -> B.ByteString
-formatTree' = B.concat . L.toChunks . formatTree
 
 -- | Format document with <?xml.. header - strict variant that returns strict ByteString.
 format' :: (NodeClass n [], GenericXMLString tag, GenericXMLString text) =>
diff --git a/Text/XML/Expat/IO.hs b/Text/XML/Expat/IO.hs
deleted file mode 100644
--- a/Text/XML/Expat/IO.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-{-# OPTIONS_HADDOCK hide #-}
-module Text.XML.Expat.IO
-       {-# DEPRECATED "Renamed to Text.XML.Expat.Internal.IO" #-}
-    (
-        module Text.XML.Expat.Internal.IO
-    ) where
-
-import Text.XML.Expat.Internal.IO
-
diff --git a/Text/XML/Expat/Internal/Glue.c b/Text/XML/Expat/Internal/Glue.c
new file mode 100644
--- /dev/null
+++ b/Text/XML/Expat/Internal/Glue.c
@@ -0,0 +1,245 @@
+#include <expat.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <string.h>
+
+typedef struct {
+    XML_Parser parser;
+    XML_Char* (*decoder)(const XML_Char*);
+    int locations;
+} MyParser;
+
+typedef struct {
+    size_t offset;
+    size_t capacity;
+    uint8_t* block;
+    MyParser* mp;
+} Block;
+
+/*!
+ * Allocate the specified amount of room in the buffer.
+ */
+static void* alloc(Block* blk, size_t room)
+{
+    size_t minCapacity = blk->offset + room;
+    size_t start = blk->offset;
+    {
+        int changed = 0;
+        size_t capacity = blk->capacity;
+        while (capacity < minCapacity) {
+            capacity = capacity * 2;
+            changed = 1;
+        }
+        if (changed) {
+            blk->capacity = capacity;
+            blk->block = realloc(blk->block, capacity);
+        }
+    }
+    blk->offset += room;
+    return blk->block + start;
+}
+
+static void pushType(Block* blk, uint32_t type)
+{
+    *(uint32_t*)alloc(blk, 4) = type;
+    if (blk->mp->locations) {
+        int64_t* loc = alloc(blk, 32);
+        loc[0] = (int64_t)XML_GetCurrentLineNumber(blk->mp->parser);
+        loc[1] = (int64_t)XML_GetCurrentColumnNumber(blk->mp->parser);
+        loc[2] = (int64_t)XML_GetCurrentByteIndex(blk->mp->parser);
+        loc[3] = (int64_t)XML_GetCurrentByteCount(blk->mp->parser);
+    }
+}
+
+#define ROUND_UP_32(x) (((x) + 3) & ~3)
+
+static void startElement(
+    void *userData,
+    const XML_Char *name,
+    const XML_Char **atts)
+{
+    Block* blk = userData;
+    size_t nameLen = strlen(name) + 1;
+    size_t nAtts, i;
+    for (nAtts = 0; atts[nAtts] != NULL; nAtts += 2) ;
+    pushType(blk, 1);
+    *(uint32_t*)alloc(blk, 4) = nAtts;
+    memcpy(alloc(blk, nameLen), name, nameLen);
+    for (i = 0; i < nAtts; i++) {
+        size_t attLen = strlen(atts[i]) + 1;
+        memcpy(alloc(blk, attLen), atts[i], attLen);
+    }
+    blk->offset = ROUND_UP_32(blk->offset);
+}
+
+static void endElement(void *userData, const XML_Char *name)
+{
+    Block* blk = userData;
+    size_t nameLen = strlen(name) + 1;
+    pushType(blk, 2);
+    memcpy(alloc(blk, nameLen), name, nameLen);
+    blk->offset = ROUND_UP_32(blk->offset);
+}
+
+static void characterData(
+    void *userData,
+    const XML_Char *s,
+    int len)
+{
+    Block* blk = userData;
+    pushType(blk, 3);
+    *(uint32_t*)alloc(blk, 4) = len;
+    memcpy(alloc(blk, (size_t)len), s, (size_t)len);
+    blk->offset = ROUND_UP_32(blk->offset);
+}
+
+static void xmlDeclHandler(void           *userData,
+                            const XML_Char *version,
+                            const XML_Char *encoding,
+                            int             standalone)
+{
+    Block* blk = userData;
+    int verLen = strlen(version) + 1;
+    pushType(blk, 4);
+    memcpy(alloc(blk, verLen), version, verLen);
+    if (encoding != NULL) {
+        int encLen = strlen(encoding)+1;
+        uint8_t* pEnc = alloc(blk, encLen+1);
+        pEnc[0] = 1;
+        memcpy(pEnc+1, encoding, encLen);
+    }
+    else
+        *(uint8_t*)alloc(blk, 1) = 0;
+    *(int8_t*)alloc(blk, 1) = (int8_t)standalone;
+    blk->offset = ROUND_UP_32(blk->offset);
+}
+
+static void startCData(void* userData)
+{
+    Block* blk = userData;
+    pushType(blk, 5);
+}
+
+static void endCData(void* userData)
+{
+    Block* blk = userData;
+    pushType(blk, 6);
+}
+
+static void processingInstruction(void *userData, const XML_Char *target, const XML_Char *data)
+{
+    Block* blk = userData;
+    int targetLen = strlen(target) + 1;
+    int dataLen = strlen(data) + 1;
+    pushType(blk, 7);
+    memcpy(alloc(blk, targetLen), target, targetLen);
+    memcpy(alloc(blk, dataLen), data, dataLen);
+    blk->offset = ROUND_UP_32(blk->offset);
+}
+
+static void comment(void* userData, const XML_Char *text)
+{
+    Block* blk = userData;
+    int textLen = strlen(text) + 1;
+    pushType(blk, 8);
+    memcpy(alloc(blk, textLen), text, textLen);
+    blk->offset = ROUND_UP_32(blk->offset);
+}
+
+MyParser* hexpatNewParser(const XML_Char* encoding, int locations)
+{
+    MyParser* mp = malloc(sizeof(MyParser));
+    XML_Parser p = XML_ParserCreate(encoding);
+    XML_SetStartElementHandler(p, startElement);
+    XML_SetEndElementHandler(p, endElement);
+    XML_SetCharacterDataHandler(p, characterData);
+    XML_SetXmlDeclHandler(p, xmlDeclHandler);
+    XML_SetCdataSectionHandler(p, startCData, endCData);
+    XML_SetProcessingInstructionHandler(p, processingInstruction);
+    XML_SetCommentHandler(p, comment);
+    mp->parser = p;
+    mp->locations = locations;
+    return mp;
+}
+
+void hexpatFreeParser(MyParser* mp)
+{
+    XML_ParserFree(mp->parser);
+    free(mp);
+}
+
+static int externalEntityRef(XML_Parser parser,
+                                const XML_Char *context,
+                                const XML_Char *base,
+                                const XML_Char *systemId,
+                                const XML_Char *publicId)
+{
+    if (systemId == NULL && publicId == NULL) {
+        XML_Parser eep = XML_ExternalEntityParserCreate(parser, context, NULL);
+        enum XML_Status ret = XML_Parse(eep, "", 0, XML_TRUE);
+        if (ret == XML_STATUS_OK) {
+            XML_ParserFree(eep);
+        }
+        else {
+            XML_ParserFree(eep);
+            XML_StopParser(parser, 0);
+        }
+    }
+    else
+        XML_StopParser(parser, 0);
+}
+
+static void skippedEntity(void *userData,
+                           const XML_Char *entityName,
+                           int is_parameter_entity)
+{
+    Block* blk = userData;
+    if (is_parameter_entity)
+        XML_StopParser(blk->mp->parser, 0);
+    else {
+        XML_Char* out = blk->mp->decoder(entityName);
+        if (out != NULL) {
+            characterData(blk, out, strlen(out));
+            free(out);
+        }
+        else
+            XML_StopParser(blk->mp->parser, 0);
+    }
+}
+
+enum XML_Status hexpatParse(
+    MyParser* mp,
+    const char* s,
+    int len,
+    int isFinal,
+    uint8_t** buffer,
+    int* length)
+{
+    enum XML_Status ret;
+    Block blk;
+    blk.offset = 0;
+    blk.capacity = 256;
+    blk.block = malloc(blk.capacity);
+    blk.mp = mp;
+    XML_SetUserData(mp->parser, &blk);
+    ret = XML_Parse(mp->parser, s, len, isFinal);
+    *(uint32_t*)alloc(&blk, 4) = 0;
+    *buffer = blk.block;
+    *length = (int)blk.offset;
+    return ret;
+}
+
+void hexpatSetEntityHandler(
+    MyParser* mp,
+    XML_Char* (*decoder)(const XML_Char*))
+{
+    mp->decoder = decoder;
+    XML_UseForeignDTD(mp->parser, XML_TRUE);
+    XML_SetExternalEntityRefHandler(mp->parser, externalEntityRef);
+    XML_SetSkippedEntityHandler(mp->parser, skippedEntity);
+}
+
+XML_Parser hexpatGetParser(MyParser* mp)
+{
+    return mp->parser;
+}
diff --git a/Text/XML/Expat/Internal/IO.hs b/Text/XML/Expat/Internal/IO.hs
--- a/Text/XML/Expat/Internal/IO.hs
+++ b/Text/XML/Expat/Internal/IO.hs
@@ -1,94 +1,32 @@
 {-# LANGUAGE ForeignFunctionInterface, EmptyDataDecls #-}
+{-# OPTIONS_GHC -fno-cse -fno-full-laziness #-}
 
+
 -- | Low-level interface to Expat. Unless speed is paramount, this should
 -- normally be avoided in favour of the interfaces provided by
--- 'Text.XML.Expat.SAX' and 'Text.XML.Expat.Tree', etc.  Basic usage is:
---
--- (1) Make a new parser: 'newParser'.
---
--- (2) Set up callbacks on the parser: 'setStartElementHandler', etc.
---
--- (3) Feed data into the parser: 'parse', 'parse'' or 'parseChunk'.  Some of
---     these functions must be wrapped in 'withParser'.
-
+-- 'Text.XML.Expat.SAX' and 'Text.XML.Expat.Tree', etc.
 module Text.XML.Expat.Internal.IO (
-  -- ** Parser Setup
-  Parser, newParser,
-
-  -- ** Parsing
-  parse, parse',
-  withParser,
-  ParserPtr, Parser_struct,
-  parseChunk,
+  HParser,
+  hexpatNewParser,
+  encodingToString,
   Encoding(..),
   XMLParseError(..),
-  getParseLocation,
-  XMLParseLocation(..),
-
-  -- ** Parser Callbacks
-  XMLDeclarationHandler,
-  StartElementHandler,
-  EndElementHandler,
-  CharacterDataHandler,
-  ExternalEntityRefHandler,
-  SkippedEntityHandler,
-  StartCDataHandler,
-  EndCDataHandler,
-  CommentHandler,
-  ProcessingInstructionHandler,
-  setXMLDeclarationHandler,
-  setStartElementHandler,
-  setEndElementHandler,
-  setCharacterDataHandler,
-  setStartCDataHandler,
-  setEndCDataHandler,
-  setProcessingInstructionHandler,
-  setCommentHandler,
-  setExternalEntityRefHandler,
-  setSkippedEntityHandler,
-  setUseForeignDTD,
-
-  -- ** Lower-level interface
-  parseExternalEntityReference,
-  ExpatHandlers,
-
-  -- ** Helpers
-  encodingToString
+  XMLParseLocation(..)
   ) where
 
-import Control.Concurrent
-import Control.Exception (bracket)
+import Control.Applicative
 import Control.DeepSeq
-import Control.Monad
-import qualified Data.ByteString as BS
-import qualified Data.ByteString.Lazy as BSL
-import Data.IORef
-import Foreign hiding (unsafePerformIO)
+import qualified Data.ByteString as B
+import qualified Data.ByteString.Internal as I
+import Data.Int
+import Data.Word
+import Foreign
 import Foreign.C
-import System.IO.Unsafe (unsafePerformIO)
 
 
--- |Opaque parser type.
 data Parser_struct
 type ParserPtr = Ptr Parser_struct
-data Parser = Parser
-    { _parserObj                    :: ForeignPtr Parser_struct
-    , _xmlDeclarationHandler        :: IORef CXMLDeclarationHandler
-    , _startElementHandler          :: IORef CStartElementHandler
-    , _endElementHandler            :: IORef CEndElementHandler
-    , _cdataHandler                 :: IORef CCharacterDataHandler
-    , _externalEntityRefHandler     :: IORef (Maybe CExternalEntityRefHandler)
-    , _skippedEntityHandler         :: IORef (Maybe CSkippedEntityHandler)
-    , _startCDataHandler            :: IORef CStartCDataHandler
-    , _endCDataHandler              :: IORef CEndCDataHandler
-    , _processingInstructionHandler :: IORef CProcessingInstructionHandler
-    , _commentHandler               :: IORef CCommentHandler
-    }
 
-instance Show Parser where
-    showsPrec _ (Parser fp _ _ _ _ _ _ _ _ _ _) = showsPrec 0 fp
-
--- |Encoding types available for the document encoding.
 data Encoding = ASCII | UTF8 | UTF16 | ISO88591
 encodingToString :: Encoding -> String
 encodingToString ASCII    = "US-ASCII"
@@ -100,99 +38,16 @@
 withOptEncoding Nothing    f = f nullPtr
 withOptEncoding (Just enc) f = withCString (encodingToString enc) f
 
-
-parserCreate :: Maybe Encoding -> IO (ParserPtr)
-parserCreate a1 =
-  withOptEncoding a1 $ \a1' -> do
-      pp <- parserCreate'_ a1'
-      xmlSetUserData pp pp
-      return pp
-
--- | Create a 'Parser'.
-newParser :: Maybe Encoding -> IO Parser
-newParser enc = do
-  ptr          <- parserCreate enc
-  fptr         <- newForeignPtr parserFree ptr
-  nullXMLDeclH <- newIORef nullCXMLDeclarationHandler
-  nullStartH   <- newIORef nullCStartElementHandler
-  nullEndH     <- newIORef nullCEndElementHandler
-  nullCharH    <- newIORef nullCCharacterDataHandler
-  extH         <- newIORef Nothing
-  skipH        <- newIORef Nothing
-  nullSCDataH  <- newIORef nullCStartCDataHandler
-  nullECDataH  <- newIORef nullCEndCDataHandler
-  nullPIH      <- newIORef nullCProcessingInstructionHandler
-  nullCommentH <- newIORef nullCCommentHandler
-
-  return $ Parser fptr nullXMLDeclH nullStartH nullEndH nullCharH extH skipH 
-    nullSCDataH nullECDataH nullPIH nullCommentH
-  
-setUseForeignDTD :: Parser -> Bool -> IO ()
-setUseForeignDTD p b = withParser p $ \p' -> xmlUseForeignDTD p' b'
-  where
-    b' = if b then 1 else 0
-
 -- ByteString.useAsCStringLen is almost what we need, but C2HS wants a CInt
 -- instead of an Int.
-withBStringLen :: BS.ByteString -> ((CString, CInt) -> IO a) -> IO a
+withBStringLen :: B.ByteString -> ((CString, CInt) -> IO a) -> IO a
 withBStringLen bs f = do
-  BS.useAsCStringLen bs $ \(str, len) -> f (str, fromIntegral len)
+  B.useAsCStringLen bs $ \(str, len) -> f (str, fromIntegral len)
 
 unStatus :: CInt -> Bool
 unStatus 0 = False
 unStatus _ = True
 
--- |@parse data@ feeds /lazy/ ByteString data into a 'Parser'. It returns
--- Nothing on success, or Just the parse error.
-parse :: Parser -> BSL.ByteString -> IO (Maybe XMLParseError)
-parse parser bs = withParser parser $ \pp -> do
-    let
-        doParseChunks [] = doParseChunk pp BS.empty True
-        doParseChunks (c:cs) = do
-            ok <- doParseChunk pp c False
-            if ok
-                then doParseChunks cs
-                else return False
-    ok <- doParseChunks (BSL.toChunks bs)
-    if ok
-        then return Nothing
-        else Just `fmap` getError pp
-
--- |@parse data@ feeds /strict/ ByteString data into a 'Parser'. It returns
--- Nothing on success, or Just the parse error.
-parse' :: Parser -> BS.ByteString -> IO (Maybe XMLParseError)
-parse' parser bs = withParser parser $ \pp -> do
-    ok <- doParseChunk pp bs True
-    if ok
-        then return Nothing
-        else Just `fmap` getError pp
-
-parseExternalEntityReference :: Parser
-                             -> CString         -- ^ context
-                             -> Maybe Encoding  -- ^ encoding
-                             -> CStringLen      -- ^ text
-                             -> IO Bool
-parseExternalEntityReference parser context encoding (text,sz) =
-    withParser parser $ \pp -> do
-        extp <- withOptEncoding encoding $
-                xmlExternalEntityParserCreate pp context
-        e <- doParseChunk'_ extp text (fromIntegral sz) 1
-        parserFree' extp
-        return $ e == 1
-
--- |@parseChunk data False@ feeds /strict/ ByteString data into a
--- 'Parser'.  The end of the data is indicated by passing @True@ for the
--- final parameter.   It returns Nothing on success, or Just the parse error.
-parseChunk :: ParserPtr
-           -> BS.ByteString
-           -> Bool
-           -> IO (Maybe XMLParseError)
-parseChunk pp xml final = do
-    ok <- doParseChunk pp xml final
-    if ok
-        then return Nothing
-        else Just `fmap` getError pp
-
 getError :: ParserPtr -> IO XMLParseError
 getError pp = do
     code <- xmlGetErrorCode pp
@@ -201,146 +56,10 @@
     loc <- getParseLocation pp
     return $ XMLParseError err loc
 
-data ExpatHandlers = ExpatHandlers
-    (FunPtr CXMLDeclarationHandler)
-    (FunPtr CStartElementHandler)
-    (FunPtr CEndElementHandler)
-    (FunPtr CCharacterDataHandler)
-    (Maybe (FunPtr CExternalEntityRefHandler))
-    (Maybe (FunPtr CSkippedEntityHandler))
-    (FunPtr CStartCDataHandler)
-    (FunPtr CEndCDataHandler)
-    (FunPtr CProcessingInstructionHandler)
-    (FunPtr CCommentHandler)
-
--- | Most of the low-level functions take a ParserPtr so are required to be
--- called inside @withParser@.
-withParser :: Parser
-           -> (ParserPtr -> IO a)  -- ^ Computation where parseChunk and other low-level functions may be used
-           -> IO a
-withParser parser@(Parser fp _ _ _ _ _ _ _ _ _ _) code = withForeignPtr fp $ \pp -> do
-    bracket
-        (unsafeSetHandlers parser pp)
-        unsafeReleaseHandlers
-        (\_ -> code pp)
-  where
-    unsafeSetHandlers :: Parser -> ParserPtr -> IO ExpatHandlers
-    unsafeSetHandlers (Parser _ xmlDeclRef startRef endRef charRef extRef skipRef 
-        startCDataRef endCDataRef processingInstructionRef commentRef) pp =
-      do
-        cXMLDeclH <- mkCXMLDeclarationHandler =<< readIORef xmlDeclRef
-        cStartH <- mkCStartElementHandler =<< readIORef startRef
-        cEndH   <- mkCEndElementHandler =<< readIORef endRef
-        cCharH  <- mkCCharacterDataHandler =<< readIORef charRef
-        mExtH   <- readIORef extRef >>=
-                       maybe (return Nothing)
-                             (\h -> liftM Just $ mkCExternalEntityRefHandler h)
-    
-        mSkipH  <- readIORef skipRef >>=
-                       maybe (return Nothing)
-                             (\h -> liftM Just $ mkCSkippedEntityHandler h)
-                             
-        cStartCDataH <- mkCStartCDataHandler =<< readIORef startCDataRef
-        cEndCDataH   <- mkCEndCDataHandler =<< readIORef endCDataRef
-        
-        cProcessingInstructionH   <- mkCProcessingInstructionHandler =<< readIORef processingInstructionRef
-        cCommentH   <- mkCCommentHandler =<< readIORef commentRef
-    
-        xmlSetxmldeclhandler       pp cXMLDeclH
-        xmlSetstartelementhandler  pp cStartH
-        xmlSetendelementhandler    pp cEndH
-        xmlSetcharacterdatahandler pp cCharH
-        xmlSetstartcdatahandler  pp cStartCDataH
-        xmlSetendcdatahandler    pp cEndCDataH
-        xmlSetprocessinginstructionhandler pp cProcessingInstructionH
-        xmlSetcommenthandler pp cCommentH
-        maybe (return ())
-              (xmlSetExternalEntityRefHandler pp)
-              mExtH
-        maybe (return ())
-              (xmlSetSkippedEntityHandler pp)
-              mSkipH
-    
-        return $ ExpatHandlers cXMLDeclH cStartH cEndH cCharH mExtH mSkipH 
-            cStartCDataH cEndCDataH cProcessingInstructionH cCommentH
-    
-    unsafeReleaseHandlers :: ExpatHandlers -> IO ()
-    unsafeReleaseHandlers (ExpatHandlers cXMLDeclH cStartH cEndH cCharH mcExtH mcSkipH 
-            cStartCDataH cEndCDataH cProcessingInstructionH cCommentH) = do
-        freeHaskellFunPtr cXMLDeclH
-        freeHaskellFunPtr cStartH
-        freeHaskellFunPtr cEndH
-        freeHaskellFunPtr cCharH
-        maybe (return ()) freeHaskellFunPtr mcExtH
-        maybe (return ()) freeHaskellFunPtr mcSkipH
-        freeHaskellFunPtr cStartCDataH
-        freeHaskellFunPtr cEndCDataH
-        freeHaskellFunPtr cProcessingInstructionH
-        freeHaskellFunPtr cCommentH
-
 -- |Obtain C value from Haskell 'Bool'.
 --
 cFromBool :: Num a => Bool -> a
-cFromBool  = fromBool
-
-doParseChunk :: ParserPtr -> BS.ByteString -> Bool -> IO (Bool)
-doParseChunk = ensureBoundThread $ \a1 a2 a3 ->
-  withBStringLen a2 $ \(a2'1, a2'2) ->
-  let {a3' = cFromBool a3} in
-  doParseChunk'_ a1 a2'1  a2'2 a3' >>= \res ->
-  let {res' = unStatus res} in
-  return (res')
-
-data WorkerIface = WorkerIface (MVar (ParserPtr, BS.ByteString, Bool)) (MVar Bool)
-
-workerIfaceRef :: IORef (Maybe WorkerIface)
-{-# NOINLINE workerIfaceRef #-}
-workerIfaceRef = unsafePerformIO $ newIORef Nothing
-
--- If the calling thread is not bound, we delegate to a bound thread, because
--- otherwise we get a thread explosion (this is true in ghc-6.12.X).
--- See test/thread-leak/ directory for a test case.
-ensureBoundThread :: (ParserPtr -> BS.ByteString -> Bool -> IO Bool)
-                  -> ParserPtr
-                  -> BS.ByteString
-                  -> Bool
-                  -> IO Bool
-ensureBoundThread doit p bs last = do
-    bound <- isCurrentThreadBound
-    if rtsSupportsBoundThreads && not bound
-        then delegate
-        else doit p bs last
-  where
-    delegate = do
-        mIface <- readIORef workerIfaceRef
-        case mIface of
-            Just iface -> pipeTo iface
-            Nothing -> do
-                inV <- newEmptyMVar
-                outV <- newEmptyMVar
-                let iface = WorkerIface inV outV
-                justSetItGlobally <- atomicModifyIORef workerIfaceRef $ \mIface ->
-                    case mIface of
-                        Just _  -> (mIface, False)
-                        Nothing -> (Just iface, True) 
-                if justSetItGlobally
-                    then do
-                        _ <- forkOS $ worker iface
-                        pipeTo iface
-                    else
-                        -- If it wasn't changed, then this is because we got a race
-                        -- condition with another thread.  We resolve this by trying
-                        -- again.  We'll succeed on the second attempt.  The mvars
-                        -- we allocated here will be GC'd.
-                        delegate
-
-    pipeTo (WorkerIface inV outV) =
-        putMVar inV (p, bs, last) >> takeMVar outV
-
-    worker (WorkerIface inV outV) = forever $
-        putMVar outV =<< uncurry3 doit =<< takeMVar inV
-      where
-        uncurry3 f (a, b, c) = f a b c 
+cFromBool = fromBool
 
 -- | Parse error, consisting of message text and error location
 data XMLParseError = XMLParseError String XMLParseLocation deriving (Eq, Show)
@@ -373,373 +92,6 @@
             xmlByteCount = fromIntegral count
         }
 
--- | The type of the \"XML declaration\" callback.  Parameters are version,
--- encoding (which can be nullPtr), and standalone declaration, where -1 = no
--- declaration, 0 = "no" and 1 = "yes". Return True to continue parsing as
--- normal, or False to terminate the parse.
-type XMLDeclarationHandler = ParserPtr -> CString -> CString -> CInt -> IO Bool
-
--- | The type of the \"element started\" callback.  The first parameter is the
--- element name; the second are the (attribute, value) pairs. Return True to
--- continue parsing as normal, or False to terminate the parse.
-type StartElementHandler  = ParserPtr -> CString -> [(CString, CString)] -> IO Bool
-
--- | The type of the \"element ended\" callback.  The parameter is the element
--- name. Return True to continue parsing as normal, or False to terminate the
--- parse.
-type EndElementHandler    = ParserPtr -> CString -> IO Bool
-
--- | The type of the \"character data\" callback.  The parameter is the
--- character data processed.  This callback may be called more than once while
--- processing a single conceptual block of text. Return True to continue
--- parsing as normal, or False to terminate the parse.
-type CharacterDataHandler = ParserPtr -> CStringLen -> IO Bool
-
--- | The type of the \"start cdata\" callback.   Return True to continue
--- parsing as normal, or False to terminate the parse.
-type StartCDataHandler = ParserPtr -> IO Bool
-
--- | The type of the \"end cdata\" callback.   Return True to continue
--- parsing as normal, or False to terminate the parse.
-type EndCDataHandler = ParserPtr -> IO Bool
-
--- | The type of the \"processing instruction\" callback.  The first parameter
--- is the first word in the processing instruction.  The second parameter is
--- the rest of the characters in the processing instruction after skipping all
--- whitespace after the initial word. Return True to continue parsing as normal,
--- or False to terminate the parse.
-type ProcessingInstructionHandler = ParserPtr -> CString -> CString -> IO Bool
-
--- | The type of the \"comment\" callback.  The parameter is the comment text.
--- Return True to continue parsing as normal, or False to terminate the parse.
-type CommentHandler = ParserPtr -> CString -> IO Bool
-
--- | The type of the \"external entity reference\" callback. See the expat
--- documentation.
-type ExternalEntityRefHandler =  Parser
-                              -> CString   -- context
-                              -> CString   -- base
-                              -> CString   -- systemID
-                              -> CString   -- publicID
-                              -> IO Bool
-
--- | Set a skipped entity handler. This is called in two situations:
---
--- 1. An entity reference is encountered for which no declaration has been read
--- and this is not an error.
---
--- 2. An internal entity reference is read, but not expanded, because
--- @XML_SetDefaultHandler@ has been called.
-type SkippedEntityHandler =  ParserPtr
-                          -> CString   -- entityName
-                          -> Int       -- is a parameter entity?
-                          -> IO Bool
-
-
-type CXMLDeclarationHandler = ParserPtr -> CString -> CString -> CInt -> IO ()
-
-nullCXMLDeclarationHandler :: CXMLDeclarationHandler
-nullCXMLDeclarationHandler _ _ _ _ = return ()
-
-foreign import ccall safe "wrapper"
-  mkCXMLDeclarationHandler :: CXMLDeclarationHandler
-                           -> IO (FunPtr CXMLDeclarationHandler)
-
-wrapXMLDeclarationHandler :: Parser -> XMLDeclarationHandler -> CXMLDeclarationHandler
-wrapXMLDeclarationHandler parser handler = h
-  where
-    h pp ver enc sd | ver /= nullPtr = do
-        stillRunning <- handler pp ver enc sd
-        unless stillRunning $ stopp parser
-    {- From expat.h:
-       The XML declaration handler is called for *both* XML declarations
-       and text declarations. The way to distinguish is that the version
-       parameter will be NULL for text declarations.
-     -}
-    h _ _ _ _ = return ()  -- text declaration (ignore)
-
--- | Attach a XMLDeclarationHandler to a Parser.
-setXMLDeclarationHandler :: Parser -> XMLDeclarationHandler -> IO ()
-setXMLDeclarationHandler parser@(Parser _ xmlDeclRef _ _ _ _ _ _ _ _ _) handler =
-    writeIORef xmlDeclRef $ wrapXMLDeclarationHandler parser handler
-
-
-type CStartElementHandler = ParserPtr -> CString -> Ptr CString -> IO ()
-
-nullCStartElementHandler :: CStartElementHandler
-nullCStartElementHandler _ _ _ = return ()
-
-foreign import ccall safe "wrapper"
-  mkCStartElementHandler :: CStartElementHandler
-                         -> IO (FunPtr CStartElementHandler)
-
-wrapStartElementHandler :: Parser -> StartElementHandler -> CStartElementHandler
-wrapStartElementHandler parser handler = h
-  where
-    h pp cname cattrs = do
-        cattrlist <- peekArray0 nullPtr cattrs
-        stillRunning <- handler pp cname (pairwise cattrlist)
-        unless stillRunning $ stopp parser
-
--- | Attach a StartElementHandler to a Parser.
-setStartElementHandler :: Parser -> StartElementHandler -> IO ()
-setStartElementHandler parser@(Parser _ _ startRef _ _ _ _ _ _ _ _) handler =
-    writeIORef startRef $ wrapStartElementHandler parser handler
-
-
-type CEndElementHandler = ParserPtr -> CString -> IO ()
-
-nullCEndElementHandler :: CEndElementHandler
-nullCEndElementHandler _ _ = return ()
-
-foreign import ccall safe "wrapper"
-  mkCEndElementHandler :: CEndElementHandler
-                       -> IO (FunPtr CEndElementHandler)
-wrapEndElementHandler :: Parser -> EndElementHandler -> CEndElementHandler
-wrapEndElementHandler parser handler = h
-  where
-    h pp cname = do
-        stillRunning <- handler pp cname
-        unless stillRunning $ stopp parser
-
--- | Attach an EndElementHandler to a Parser.
-setEndElementHandler :: Parser -> EndElementHandler -> IO ()
-setEndElementHandler parser@(Parser _ _ _ endRef _ _ _ _ _ _ _) handler =
-    writeIORef endRef $ wrapEndElementHandler parser handler
-
-
-type CCharacterDataHandler = ParserPtr -> CString -> CInt -> IO ()
-
-nullCCharacterDataHandler :: CCharacterDataHandler
-nullCCharacterDataHandler _ _ _ = return ()
-
-foreign import ccall safe "wrapper"
-  mkCCharacterDataHandler :: CCharacterDataHandler
-                          -> IO (FunPtr CCharacterDataHandler)
-wrapCharacterDataHandler :: Parser -> CharacterDataHandler -> CCharacterDataHandler
-wrapCharacterDataHandler parser handler = h
-  where
-    h pp cdata len = do
-        stillRunning <- handler pp (cdata, fromIntegral len)
-        unless stillRunning $ stopp parser
-
--- | Attach an CharacterDataHandler to a Parser.
-setCharacterDataHandler :: Parser -> CharacterDataHandler -> IO ()
-setCharacterDataHandler parser@(Parser _ _ _ _ charRef _ _ _ _ _ _) handler =
-    writeIORef charRef $ wrapCharacterDataHandler parser handler
-
-
-type CStartCDataHandler = ParserPtr -> IO ()
-
-nullCStartCDataHandler :: CStartCDataHandler
-nullCStartCDataHandler _ = return ()
-
-foreign import ccall safe "wrapper"
-  mkCStartCDataHandler :: CStartCDataHandler
-                         -> IO (FunPtr CStartCDataHandler)
-
-wrapStartCDataHandler :: Parser -> StartCDataHandler -> CStartCDataHandler
-wrapStartCDataHandler parser handler = h
-  where
-    h pp = do
-        stillRunning <- handler pp
-        unless stillRunning $ stopp parser
-
--- | Attach a StartCDataHandler to a Parser.
-setStartCDataHandler :: Parser -> StartCDataHandler -> IO ()
-setStartCDataHandler parser@(Parser _ _ _ _ _ _ _ startCData _ _ _) handler =
-    writeIORef startCData $ wrapStartCDataHandler parser handler
-
-
-type CEndCDataHandler = ParserPtr -> IO ()
-
-nullCEndCDataHandler :: CEndCDataHandler
-nullCEndCDataHandler _ = return ()
-
-foreign import ccall safe "wrapper"
-  mkCEndCDataHandler :: CEndCDataHandler
-                         -> IO (FunPtr CEndCDataHandler)
-
-wrapEndCDataHandler :: Parser -> EndCDataHandler -> CEndCDataHandler
-wrapEndCDataHandler parser handler = h
-  where
-    h pp = do
-        stillRunning <- handler pp
-        unless stillRunning $ stopp parser
-
--- | Attach a EndCDataHandler to a Parser.
-setEndCDataHandler :: Parser -> EndCDataHandler -> IO ()
-setEndCDataHandler parser@(Parser _ _ _ _ _ _ _ _ endCData _ _) handler =
-    writeIORef endCData $ wrapEndCDataHandler parser handler
-
-
-type CProcessingInstructionHandler = ParserPtr -> CString -> CString -> IO ()
-
-nullCProcessingInstructionHandler :: CProcessingInstructionHandler
-nullCProcessingInstructionHandler _ _ _ = return ()
-
-foreign import ccall safe "wrapper"
-  mkCProcessingInstructionHandler :: CProcessingInstructionHandler
-                          -> IO (FunPtr CProcessingInstructionHandler)
-                          
-wrapProcessingInstructionHandler :: Parser -> ProcessingInstructionHandler -> CProcessingInstructionHandler
-wrapProcessingInstructionHandler parser handler = h
-  where
-    h pp ctarget cdata = do
-        stillRunning <- handler pp ctarget cdata
-        unless stillRunning $ stopp parser
-
--- | Attach a ProcessingInstructionHandler to a Parser.
-setProcessingInstructionHandler :: Parser -> ProcessingInstructionHandler -> IO ()
-setProcessingInstructionHandler parser@(Parser _ _ _ _ _ _ _ _ _ piRef _) handler =
-    writeIORef piRef $ wrapProcessingInstructionHandler parser handler
-
-
-type CCommentHandler = ParserPtr -> CString -> IO ()
-
-nullCCommentHandler :: CCommentHandler
-nullCCommentHandler _ _ = return ()
-
-foreign import ccall safe "wrapper"
-  mkCCommentHandler :: CCommentHandler
-                          -> IO (FunPtr CCommentHandler)
-                          
-wrapCommentHandler :: Parser -> CommentHandler -> CCommentHandler
-wrapCommentHandler parser handler = h
-  where
-    h pp cdata = do
-        stillRunning <- handler pp cdata
-        unless stillRunning $ stopp parser
-
--- | Attach a CommentHandler to a Parser.
-setCommentHandler :: Parser -> CommentHandler -> IO ()
-setCommentHandler parser@(Parser _ _ _ _ _ _ _ _ _ _ commentRef) handler =
-    writeIORef commentRef $ wrapCommentHandler parser handler
-
-
-pairwise :: [a] -> [(a,a)]
-pairwise (x1:x2:xs) = (x1,x2) : pairwise xs
-pairwise _          = []
-
-stopp :: Parser -> IO ()
-stopp parser = withParser parser $ \p -> xmlStopParser p 0
-
-------------------------------------------------------------------------------
--- C imports
-
-foreign import ccall unsafe "XML_ParserCreate"
-  parserCreate'_ :: Ptr CChar -> IO ParserPtr
-  
-foreign import ccall unsafe "XML_SetUserData"
-  xmlSetUserData :: ParserPtr -> ParserPtr -> IO ()
-
-foreign import ccall unsafe "XML_SetXmlDeclHandler"
-  xmlSetxmldeclhandler :: ParserPtr -> FunPtr CXMLDeclarationHandler -> IO ()
-
-foreign import ccall unsafe "XML_SetStartElementHandler"
-  xmlSetstartelementhandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> ((Ptr (Ptr CChar)) -> (IO ())))) -> (IO ())))
-
-foreign import ccall unsafe "XML_SetEndElementHandler"
-  xmlSetendelementhandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> (IO ()))) -> (IO ())))
-  
-foreign import ccall unsafe "XML_SetCharacterDataHandler"
-  xmlSetcharacterdatahandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> (CInt -> (IO ())))) -> (IO ())))
-  
-foreign import ccall unsafe "XML_SetStartCdataSectionHandler"
-  xmlSetstartcdatahandler :: ParserPtr -> FunPtr CStartCDataHandler -> IO ()
-
-foreign import ccall unsafe "XML_SetEndCdataSectionHandler"
-  xmlSetendcdatahandler :: ParserPtr -> FunPtr CStartCDataHandler -> IO ()
-  
-foreign import ccall unsafe "XML_SetCommentHandler"
-  xmlSetcommenthandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> (IO ()))) -> (IO ())))
-  
-foreign import ccall unsafe "XML_SetProcessingInstructionHandler"
-  xmlSetprocessinginstructionhandler :: ParserPtr -> ((FunPtr (ParserPtr -> ((Ptr CChar) -> ((Ptr CChar) -> (IO ())))) -> (IO ())))
-
-foreign import ccall safe "XML_Parse"
-  doParseChunk'_ :: ParserPtr -> ((Ptr CChar) -> (CInt -> (CInt -> (IO CInt))))
-
-foreign import ccall unsafe "XML_UseForeignDTD"
-  xmlUseForeignDTD :: ParserPtr     -- ^ parser
-                   -> CChar         -- ^ use foreign DTD? (external entity ref
-                                    -- handler will be called with publicID &
-                                    -- systemID set to null
-                   -> IO ()
-
-foreign import ccall "&XML_ParserFree" parserFree :: FunPtr (ParserPtr -> IO ())
-foreign import ccall "XML_ParserFree" parserFree' :: ParserPtr -> IO ()
-
-type CExternalEntityRefHandler = ParserPtr   -- parser
-                              -> Ptr CChar   -- context
-                              -> Ptr CChar   -- base
-                              -> Ptr CChar   -- systemID
-                              -> Ptr CChar   -- publicID
-                              -> IO ()
-
-foreign import ccall unsafe "wrapper"
-  mkCExternalEntityRefHandler :: CExternalEntityRefHandler
-                              -> IO (FunPtr CExternalEntityRefHandler)
-
-
-foreign import ccall unsafe "XML_SetExternalEntityRefHandler"
-  xmlSetExternalEntityRefHandler :: ParserPtr
-                                 -> FunPtr CExternalEntityRefHandler
-                                 -> IO ()
-
-foreign import ccall unsafe "XML_SetSkippedEntityHandler"
-  xmlSetSkippedEntityHandler :: ParserPtr
-                             -> FunPtr CSkippedEntityHandler
-                             -> IO ()
-
-foreign import ccall unsafe "XML_ExternalEntityParserCreate"
-  xmlExternalEntityParserCreate :: ParserPtr
-                                -> CString   -- ^ context
-                                -> CString   -- ^ encoding
-                                -> IO ParserPtr
-
-type CSkippedEntityHandler =  ParserPtr -- user data pointer
-                           -> CString   -- entity name
-                           -> CInt      -- is a parameter entity?
-                           -> IO ()
-
-foreign import ccall safe "wrapper"
-  mkCSkippedEntityHandler :: CSkippedEntityHandler
-                          -> IO (FunPtr CSkippedEntityHandler)
-
-
-wrapExternalEntityRefHandler :: Parser
-                             -> ExternalEntityRefHandler
-                             -> CExternalEntityRefHandler
-wrapExternalEntityRefHandler parser handler = h
-  where
-    h _ context base systemID publicID = do
-        stillRunning <- handler parser context base systemID publicID
-        unless stillRunning $ stopp parser
-
-
-wrapSkippedEntityHandler :: Parser
-                         -> SkippedEntityHandler
-                         -> CSkippedEntityHandler
-wrapSkippedEntityHandler parser handler = h
-  where
-    h pp entityName i = do
-        stillRunning <- handler pp entityName (fromIntegral i)
-        unless stillRunning $ stopp parser
-
-
-setExternalEntityRefHandler :: Parser -> ExternalEntityRefHandler -> IO ()
-setExternalEntityRefHandler parser h =
-    writeIORef ref $ Just $ wrapExternalEntityRefHandler parser h
-  where
-    ref = _externalEntityRefHandler parser
-
-setSkippedEntityHandler :: Parser -> SkippedEntityHandler -> IO ()
-setSkippedEntityHandler parser h =
-    writeIORef ref $ Just $ wrapSkippedEntityHandler parser h
-  where
-    ref = _skippedEntityHandler parser
-
 -- Note on word sizes:
 --
 -- on expat 2.0:
@@ -774,6 +126,96 @@
     :: ParserPtr -> IO CInt
 foreign import ccall unsafe "expat.h XML_ErrorString" xmlErrorString
     :: CInt -> IO CString
-foreign import ccall unsafe "expat.h XML_StopParser" xmlStopParser
-    :: ParserPtr -> CInt -> IO ()
+
+type HParser = B.ByteString -> Bool -> IO (ForeignPtr Word8, CInt, Maybe XMLParseError)
+
+foreign import ccall unsafe "hexpatNewParser"
+  _hexpatNewParser :: Ptr CChar -> CInt -> IO MyParserPtr
+
+foreign import ccall unsafe "hexpatGetParser"
+  _hexpatGetParser :: MyParserPtr -> ParserPtr
+
+data MyParser_struct
+type MyParserPtr = Ptr MyParser_struct
+
+foreign import ccall "&hexpatFreeParser" hexpatFreeParser :: FunPtr (MyParserPtr -> IO ())
+
+hexpatNewParser :: Maybe Encoding
+                -> Maybe (B.ByteString -> Maybe B.ByteString)  -- ^ Entity decoder
+                -> Bool        -- ^ Whether to include input locations
+                -> IO (HParser, IO XMLParseLocation)
+hexpatNewParser enc mDecoder locations =
+    withOptEncoding enc $ \cEnc -> do
+        parser <- newForeignPtr hexpatFreeParser =<< _hexpatNewParser cEnc (cFromBool locations)
+        return (parse parser, withForeignPtr parser $ \mp -> getParseLocation $ _hexpatGetParser mp)
+  where
+    parse parser = case mDecoder of
+        Nothing -> \text final ->
+            alloca $ \ppData ->
+            alloca $ \pLen ->
+            withBStringLen text $ \(textBuf, textLen) ->
+            withForeignPtr parser $ \pp -> do
+                ok <- unStatus <$> _hexpatParseUnsafe pp textBuf textLen (cFromBool final) ppData pLen
+                pData <- peek ppData
+                len <- peek pLen
+                err <- if ok
+                    then return Nothing
+                    else Just <$> getError (_hexpatGetParser pp)
+                fpData <- newForeignPtr funPtrFree pData
+                return (fpData, len, err)
+        Just decoder -> \text final ->
+            alloca $ \ppData ->
+            alloca $ \pLen ->
+            withBStringLen text $ \(textBuf, textLen) ->
+            withForeignPtr parser $ \pp -> do
+                eh <- mkCEntityHandler . wrapCEntityHandler $ decoder
+                _hexpatSetEntityHandler pp eh
+                ok <- unStatus <$> _hexpatParseSafe pp textBuf textLen (cFromBool final) ppData pLen
+                freeHaskellFunPtr eh
+                pData <- peek ppData
+                len <- peek pLen
+                err <- if ok
+                    then return Nothing
+                    else Just <$> getError (_hexpatGetParser pp)
+                fpData <- newForeignPtr funPtrFree pData
+                return (fpData, len, err)
+
+foreign import ccall unsafe "hexpatParse"
+  _hexpatParseUnsafe :: MyParserPtr -> Ptr CChar -> CInt -> CInt -> Ptr (Ptr Word8) -> Ptr CInt -> IO CInt
+
+foreign import ccall safe "hexpatParse"
+  _hexpatParseSafe :: MyParserPtr -> Ptr CChar -> CInt -> CInt -> Ptr (Ptr Word8) -> Ptr CInt -> IO CInt
+
+type CEntityHandler = Ptr CChar -> IO (Ptr CChar)
+
+foreign import ccall safe "wrapper"
+  mkCEntityHandler :: CEntityHandler
+                   -> IO (FunPtr CEntityHandler)
+
+peekByteStringLen :: CStringLen -> IO B.ByteString
+{-# INLINE peekByteStringLen #-}
+peekByteStringLen (cstr, len) =
+    I.create (fromIntegral len) $ \ptr ->
+        I.memcpy ptr (castPtr cstr) (fromIntegral len)
+
+wrapCEntityHandler :: (B.ByteString -> Maybe B.ByteString) -> CEntityHandler
+wrapCEntityHandler handler = h
+  where
+    h cname = do
+        sz <- fromIntegral <$> I.c_strlen cname
+        name <- peekByteStringLen (cname, sz)
+        case handler name of
+            Just text -> do
+                let (fp, offset, len) = I.toForeignPtr text
+                withForeignPtr fp $ \ctextBS -> do
+                    ctext <- mallocBytes (len + 1) :: IO CString
+                    I.memcpy (castPtr ctext) (ctextBS `plusPtr` offset) (fromIntegral len)
+                    poke (ctext `plusPtr` len) (0 :: CChar)
+                    return ctext
+            Nothing -> return nullPtr
+
+foreign import ccall unsafe "hexpatSetEntityHandler"
+  _hexpatSetEntityHandler :: MyParserPtr -> FunPtr CEntityHandler -> IO ()
+
+foreign import ccall "&free" funPtrFree :: FunPtr (Ptr Word8 -> IO ())
 
diff --git a/Text/XML/Expat/Namespaced.hs b/Text/XML/Expat/Namespaced.hs
deleted file mode 100644
--- a/Text/XML/Expat/Namespaced.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-{-# OPTIONS_HADDOCK hide #-}
-module Text.XML.Expat.Namespaced
-        {-# DEPRECATED "Use Text.XML.Expat.Text or Text.XML.Expat.Annotated instead" #-}
-    (
-        module Text.XML.Expat.Internal.Namespaced
-    ) where
-
-import Text.XML.Expat.Internal.Namespaced
-
diff --git a/Text/XML/Expat/NodeClass.hs b/Text/XML/Expat/NodeClass.hs
deleted file mode 100644
--- a/Text/XML/Expat/NodeClass.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-{-# OPTIONS_HADDOCK hide #-}
-module Text.XML.Expat.NodeClass
-       {-# DEPRECATED "Use Text.XML.Expat.Text or Text.XML.Expat.Annotated instead" #-}
-    (
-        module Text.XML.Expat.Internal.NodeClass
-    ) where
-
-import Text.XML.Expat.Internal.NodeClass
-
diff --git a/Text/XML/Expat/Qualified.hs b/Text/XML/Expat/Qualified.hs
deleted file mode 100644
--- a/Text/XML/Expat/Qualified.hs
+++ /dev/null
@@ -1,9 +0,0 @@
-{-# OPTIONS_HADDOCK hide #-}
-module Text.XML.Expat.Qualified
-       {-# DEPRECATED "Use Text.XML.Expat.Text or Text.XML.Expat.Annotated instead" #-}
-    (
-        module Text.XML.Expat.Internal.Qualified
-    ) where
-
-import Text.XML.Expat.Internal.Qualified
-
diff --git a/Text/XML/Expat/SAX.hs b/Text/XML/Expat/SAX.hs
--- a/Text/XML/Expat/SAX.hs
+++ b/Text/XML/Expat/SAX.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE DeriveDataTypeable, TypeSynonymInstances, CPP, ScopedTypeVariables, FlexibleInstances #-}
+{-# OPTIONS_GHC -fno-cse -fno-full-laziness #-}
 
 -- hexpat, a Haskell wrapper for expat
 -- Copyright (C) 2008 Evan Martin <martine@danga.com>
@@ -16,7 +17,6 @@
   ParseOptions(..),
   SAXEvent(..),
 
-  textFromCString,
   parse,
   parseG,
   parseLocations,
@@ -28,41 +28,36 @@
   -- * Variants that throw exceptions
   XMLParseException(..),
 
-  -- * Helpers
-  setEntityDecoder,
-
   -- * Abstraction of string types
-  GenericXMLString(..),
-
-  -- * Deprecated parse functions
-  parseSAX,
-  parseSAXLocations,
-  parseSAXLocationsThrowing,
-  parseSAXThrowing,
-  ParserOptions,
-  defaultParserOptions
+  GenericXMLString(..)
   ) where
 
-import Text.XML.Expat.Internal.IO hiding (parse)
+import Control.Concurrent.MVar
+import Text.XML.Expat.Internal.IO
+import Data.Bits
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy as L
 import qualified Data.ByteString.Internal as I
-import Data.IORef
+import Data.Int
 import Data.ByteString.Internal (c2w, w2c, c_strlen)
 import qualified Data.Monoid as M
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as TE
 import qualified Codec.Binary.UTF8.String as U8
-import Data.Typeable
 import Data.List.Class hiding (tail)
+import Data.Typeable
+import Data.Word
 import Control.Exception.Extensible as Exc
 import Control.Applicative
 import Control.DeepSeq
 import Control.Monad
 import System.IO.Unsafe
-import Foreign.C.String
+import Foreign.C
+import Foreign.ForeignPtr
+import Foreign.Marshal.Array
 import Foreign.Ptr
+import Foreign.Storable
 
 
 data ParseOptions tag text = ParseOptions
@@ -74,18 +69,10 @@
           -- be decoded into text using the supplied lookup function
     }
 
-{-# DEPRECATED ParserOptions "renamed to ParseOptions" #-}
-type ParserOptions tag text = ParseOptions tag text
-
 defaultParseOptions :: ParseOptions tag text
 defaultParseOptions = ParseOptions Nothing Nothing
 
--- | DEPRECATED. Renamed to defaultParseOptions.
-defaultParserOptions :: ParseOptions tag text
-{-# DEPRECATED defaultParserOptions "renamed to defaultParseOptions" #-}
-defaultParserOptions = defaultParseOptions
 
-
 -- | An abstraction for any string type you want to use as xml text (that is,
 -- attribute values or element text content). If you want to use a
 -- new string type with /hexpat/, you must make it an instance of
@@ -98,7 +85,7 @@
     gxHead :: s -> Char
     gxTail :: s -> s
     gxBreakOn :: Char -> s -> (s, s)
-    gxFromCStringLen :: CStringLen -> IO s
+    gxFromByteString :: B.ByteString -> s
     gxToByteString :: s -> B.ByteString
 
 instance GenericXMLString String where
@@ -109,7 +96,7 @@
     gxHead = head
     gxTail = tail
     gxBreakOn c = break (==c)
-    gxFromCStringLen cstr = U8.decode . B.unpack <$> peekByteStringLen cstr
+    gxFromByteString = U8.decode . B.unpack
     gxToByteString = B.pack . map c2w . U8.encodeString
 
 instance GenericXMLString B.ByteString where
@@ -120,7 +107,7 @@
     gxHead = w2c . B.head
     gxTail = B.tail
     gxBreakOn c = B.break (== c2w c)
-    gxFromCStringLen = peekByteStringLen
+    gxFromByteString = id
     gxToByteString = id
 
 instance GenericXMLString T.Text where
@@ -140,16 +127,9 @@
 #else
     gxBreakOn c = T.breakBy (==c)
 #endif
-    gxFromCStringLen cstr = TE.decodeUtf8 <$> peekByteStringLen cstr
+    gxFromByteString = TE.decodeUtf8
     gxToByteString = TE.encodeUtf8
 
-peekByteStringLen :: CStringLen -> IO B.ByteString
-{-# INLINE peekByteStringLen #-}
-peekByteStringLen (cstr, len) =
-    I.create (fromIntegral len) $ \ptr ->
-        I.memcpy ptr (castPtr cstr) (fromIntegral len)
-
-
 data SAXEvent tag text =
     XMLDeclaration text (Maybe text) (Maybe Bool) |
     StartElement tag [(tag, text)] |
@@ -173,139 +153,150 @@
     rnf (Comment text) = rnf text
     rnf (FailDocument err) = rnf err
 
--- | Converts a 'CString' to a 'GenericXMLString' type.
-textFromCString :: GenericXMLString text => CString -> IO text
-{-# INLINE textFromCString #-}
-textFromCString cstr = do
-    len <- c_strlen cstr
-    gxFromCStringLen (cstr, fromIntegral len)
-
--- | A helper for configuring the hexpat parser to use the specified entity
--- decoder.
-setEntityDecoder :: (GenericXMLString tag, GenericXMLString text)
-                 => Parser
-                 -> (tag -> Maybe text)   -- ^ Entity decoder
-                 -> (ParserPtr -> text -> IO ())       -- ^ Code to insert character data into the document
-                 -> IO ()
-setEntityDecoder parser decoder insertText = do
-    setUseForeignDTD parser True
-    setExternalEntityRefHandler parser eh
-    setSkippedEntityHandler parser skip
-
-  where
-    skip _  _ 1 = return False
-    skip pp entityName 0 = do
-        en <- textFromCString entityName
-        let mbt = decoder en
-        maybe (return False)
-              (\t -> do
-                   insertText pp t
-                   return True)
-              mbt
-    skip _ _ _ = undefined
-
-    eh pp ctx _ systemID publicID =
-        if systemID == nullPtr && publicID == nullPtr
-           then withCStringLen "" $ \c -> do
-               parseExternalEntityReference pp ctx Nothing c
-           else return False
-
 -- | Parse a generalized list of ByteStrings containing XML to SAX events.
 -- In the event of an error, FailDocument is the last element of the output list.
 parseG :: forall tag text l . (GenericXMLString tag, GenericXMLString text, List l) =>
           ParseOptions tag text -- ^ Parse options
        -> l ByteString          -- ^ Input text (a lazy ByteString)
        -> l (SAXEvent tag text)
-parseG opts inputBlocks = runParser inputBlocks parser queueRef cacheRef
-  where
-    (parser, queueRef, cacheRef) = unsafePerformIO $ do
-        let enc = overrideEncoding opts
-        let mEntityDecoder = entityDecoder opts
-
-        parser <- newParser enc
-        queueRef <- newIORef []
-
-        case mEntityDecoder of
-            Just deco -> setEntityDecoder parser deco $ \_ txt -> do
-                modifyIORef queueRef (CharacterData txt:)
-            Nothing -> return ()
-
-        setXMLDeclarationHandler parser $ \_ cVer cEnc cSd -> do
-            ver <- textFromCString cVer
-            mEnc <- if cEnc == nullPtr
-                then return Nothing
-                else Just <$> textFromCString cEnc
-            let sd = if cSd < 0
-                    then Nothing
-                    else Just $ if cSd /= 0 then True else False
-            modifyIORef queueRef (XMLDeclaration ver mEnc sd:)
-            return True
-
-        setStartElementHandler parser $ \_ cName cAttrs -> do
-            name <- textFromCString cName
-            attrs <- forM cAttrs $ \(cAttrName,cAttrValue) -> do
-                attrName <- textFromCString cAttrName
-                attrValue <- textFromCString cAttrValue
-                return (attrName, attrValue)
-            modifyIORef queueRef (StartElement name attrs:)
-            return True
+{-# NOINLINE parseG #-}
+parseG opts inputBlocks = mapL (return . fst) $ parseImpl opts inputBlocks False noExtra failureA
+  where noExtra _ offset = return ((), offset)
+        failureA _ = return ()
 
-        setEndElementHandler parser $ \_ cName -> do
-            name <- textFromCString cName
-            modifyIORef queueRef (EndElement name:)
-            return True
+-- | Parse a generalized list of ByteStrings containing XML to SAX events.
+-- In the event of an error, FailDocument is the last element of the output list.
+parseLocationsG :: forall tag text l . (GenericXMLString tag, GenericXMLString text, List l) =>
+                   ParseOptions tag text -- ^ Parse options
+                -> l ByteString          -- ^ Input text (a lazy ByteString)
+                -> l (SAXEvent tag text, XMLParseLocation)
+{-# NOINLINE parseLocationsG #-}
+parseLocationsG opts inputBlocks = parseImpl opts inputBlocks True fetchLocation id
+  where
+    fetchLocation pBuf offset = do
+        [a, b, c, d] <- peekArray 4 (pBuf `plusPtr` offset :: Ptr Int64)
+        return (XMLParseLocation a b c d, offset + 32)
 
-        setCharacterDataHandler parser $ \_ cText -> do
-            txt <- gxFromCStringLen cText
-            modifyIORef queueRef (CharacterData txt:)
-            return True
-            
-        setStartCDataHandler parser $ \_  -> do
-            modifyIORef queueRef (StartCData :)
-            return True
-            
-        setEndCDataHandler parser $ \_  -> do
-            modifyIORef queueRef (EndCData :)
-            return True
-            
-        setProcessingInstructionHandler parser $ \_ cTarget cText -> do
-            target <- textFromCString cTarget
-            txt <- textFromCString cText
-            modifyIORef queueRef (ProcessingInstruction target txt :)
-            return True
-            
-        setCommentHandler parser $ \_ cText -> do
-            txt <- textFromCString cText
-            modifyIORef queueRef (Comment txt :)
-            return True
+parseImpl :: forall a tag text l . (GenericXMLString tag, GenericXMLString text, List l) =>
+             ParseOptions tag text -- ^ Parse options
+          -> l ByteString          -- ^ Input text (a lazy ByteString)
+          -> Bool                  -- ^ True to add locations to binary output
+          -> (Ptr Word8 -> Int -> IO (a, Int)) -- ^ Fetch extra data
+          -> (IO XMLParseLocation -> IO a)     -- ^ Fetch a value for failure case 
+          -> l (SAXEvent tag text, a)
+parseImpl opts inputBlocks addLocations extra failureA = runParser inputBlocks parse cacheRef
+  where
+    (parse, getLocation, cacheRef) = unsafePerformIO $ do
+        (parse, getLocation) <- hexpatNewParser
+            (overrideEncoding opts)
+            ((\decode -> fmap gxToByteString . decode . gxFromByteString) <$> entityDecoder opts)
+            addLocations
 
-        cacheRef <- newIORef Nothing
-        return (parser, queueRef, cacheRef)
+        cacheRef <- newMVar Nothing
+        return (parse, getLocation, cacheRef)
 
-    runParser iblks parser queueRef cacheRef = joinL $ do
+    runParser iblks parse cacheRef = joinL $ do
         li <- runList iblks
         return $ unsafePerformIO $ do
-            mCached <- readIORef cacheRef
+            mCached <- takeMVar cacheRef
             case mCached of
-                Just l -> return l
+                Just l -> do
+                    putMVar cacheRef mCached
+                    return l
                 Nothing -> do
-                    rema <- case li of
-                            Nil         -> do
-                                mError <- withParser parser $ \pp -> parseChunk pp B.empty True
-                                return $ handleFailure mError mzero
-                            Cons blk t -> unsafeInterleaveIO $ do
-                                mError <- withParser parser $ \pp -> parseChunk pp blk False
-                                cacheRef' <- newIORef Nothing
-                                return $ handleFailure mError (runParser t parser queueRef cacheRef')
-                    queue <- readIORef queueRef
-                    writeIORef queueRef []
-                    let l = fromList (reverse queue) `mplus` rema
-                    writeIORef cacheRef (Just l)
+                    (saxen, rema) <- case li of
+                        Nil         -> do
+                            (buf, len, mError) <- parse B.empty True
+                            saxen <- parseBuf buf len extra
+                            rema <- handleFailure mError mzero
+                            return (saxen, rema)
+                        Cons blk t -> {-unsafeInterleaveIO $-} do
+                            (buf, len, mError) <- parse blk False
+                            saxen <- parseBuf buf len extra
+                            cacheRef' <- newMVar Nothing
+                            rema <- handleFailure mError (runParser t parse cacheRef')
+                            return (saxen, rema)
+                    let l = fromList saxen `mplus` rema
+                    putMVar cacheRef (Just l)
                     return l
       where
-        handleFailure (Just err) _ = FailDocument err `cons` mzero
-        handleFailure Nothing    l = l
+        handleFailure (Just err) _ = do a <- failureA getLocation
+                                        return $ (FailDocument err, a) `cons` mzero
+        handleFailure Nothing    l = return l
 
+parseBuf :: (GenericXMLString tag, GenericXMLString text) =>
+            ForeignPtr Word8 -> CInt -> (Ptr Word8 -> Int -> IO (a, Int)) -> IO [(SAXEvent tag text, a)]
+parseBuf buf _ processExtra = withForeignPtr buf $ \pBuf -> doit [] pBuf 0
+  where
+    roundUp32 offset = (offset + 3) .&. complement 3
+    doit acc pBuf offset0 = offset0 `seq` do
+        typ <- peek (pBuf `plusPtr` offset0 :: Ptr Word32)
+        (a, offset) <- processExtra pBuf (offset0 + 4)
+        case typ of
+            0 -> return (reverse acc)
+            1 -> do
+                nAtts <- peek (pBuf `plusPtr` offset :: Ptr Word32)
+                let pName = pBuf `plusPtr` (offset + 4)
+                lName <- fromIntegral <$> c_strlen pName
+                let name = gxFromByteString $ I.fromForeignPtr buf (offset + 4) lName
+                (atts, offset') <- foldM (\(atts, offset) _ -> do
+                        let pAtt = pBuf `plusPtr` offset
+                        lAtt <- fromIntegral <$> c_strlen pAtt
+                        let att = gxFromByteString $ I.fromForeignPtr buf offset lAtt
+                            offset' = offset + lAtt + 1
+                            pValue = pBuf `plusPtr` offset'
+                        lValue <- fromIntegral <$> c_strlen pValue
+                        let value = gxFromByteString $ I.fromForeignPtr buf offset' lValue
+                        return ((att, value):atts, offset' + lValue + 1)
+                    ) ([], offset + 4 + lName + 1) [1,3..nAtts]
+                doit ((StartElement name (reverse atts), a) : acc) pBuf (roundUp32 offset')
+            2 -> do
+                let pName = pBuf `plusPtr` offset
+                lName <- fromIntegral <$> c_strlen pName
+                let name = gxFromByteString $ I.fromForeignPtr buf offset lName
+                    offset' = offset + lName + 1
+                doit ((EndElement name, a) : acc) pBuf (roundUp32 offset')
+            3 -> do
+                len <- fromIntegral <$> peek (pBuf `plusPtr` offset :: Ptr Word32)
+                let text = gxFromByteString $ I.fromForeignPtr buf (offset + 4) len
+                    offset' = offset + 4 + len
+                doit ((CharacterData text, a) : acc) pBuf (roundUp32 offset')
+            4 -> do
+                let pEnc = pBuf `plusPtr` offset
+                lEnc <- fromIntegral <$> c_strlen pEnc
+                let enc = gxFromByteString $ I.fromForeignPtr buf offset lEnc
+                    offset' = offset + lEnc + 1
+                    pVer = pBuf `plusPtr` offset'
+                pVerFirst <- peek (castPtr pVer :: Ptr Word8)
+                (mVer, offset'') <- case pVerFirst of
+                    0 -> return (Nothing, offset' + 1)
+                    1 -> do
+                        lVer <- fromIntegral <$> c_strlen (pVer `plusPtr` 1)
+                        return (Just $ gxFromByteString $ I.fromForeignPtr buf (offset' + 1) lVer, offset' + 1 + lVer + 1)
+                    _ -> error "hexpat: bad data from C land"
+                cSta <- peek (pBuf `plusPtr` offset'' :: Ptr Int8)
+                let sta = if cSta < 0  then Nothing else
+                          if cSta == 0 then Just False else
+                                            Just True
+                doit ((XMLDeclaration enc mVer sta, a) : acc) pBuf (roundUp32 (offset'' + 1))
+            5 -> doit ((StartCData, a) : acc) pBuf offset
+            6 -> doit ((EndCData, a) : acc) pBuf offset
+            7 -> do
+                let pTarget = pBuf `plusPtr` offset
+                lTarget <- fromIntegral <$> c_strlen pTarget
+                let target = gxFromByteString $ I.fromForeignPtr buf offset lTarget
+                    offset' = offset + lTarget + 1
+                    pData = pBuf `plusPtr` offset'
+                lData <- fromIntegral <$> c_strlen pData
+                let dat = gxFromByteString $ I.fromForeignPtr buf offset' lData
+                doit ((ProcessingInstruction target dat, a) : acc) pBuf (roundUp32 (offset' + lData + 1))
+            8 -> do
+                let pText = pBuf `plusPtr` offset
+                lText <- fromIntegral <$> c_strlen pText
+                let text = gxFromByteString $ I.fromForeignPtr buf offset lText
+                doit ((Comment text, a) : acc) pBuf (roundUp32 (offset + lText + 1))
+            _ -> error "hexpat: bad data from C land"
+
 -- | Lazily parse XML to SAX events. In the event of an error, FailDocument is
 -- the last element of the output list.
 parse :: (GenericXMLString tag, GenericXMLString text) =>
@@ -315,132 +306,12 @@
 parse opts input = parseG opts (L.toChunks input)
 
 
--- | DEPRECATED: Use 'parse' instead.
---
--- Lazily parse XML to SAX events. In the event of an error, FailDocument is
--- the last element of the output list. Deprecated in favour of new
--- 'Text.XML.Expat.SAX.parse'
-parseSAX :: (GenericXMLString tag, GenericXMLString text) =>
-            Maybe Encoding      -- ^ Optional encoding override
-         -> L.ByteString        -- ^ Input text (a lazy ByteString)
-         -> [SAXEvent tag text]
-{-# DEPRECATED parseSAX "use Text.XML.Expat.SAX.parse instead" #-}
-parseSAX enc = parse (ParseOptions enc Nothing)
-
-
 -- | An exception indicating an XML parse error, used by the /..Throwing/ variants.
 data XMLParseException = XMLParseException XMLParseError
     deriving (Eq, Show, Typeable)
 
 instance Exception XMLParseException where
 
-
--- | Parse a generalized list of ByteStrings containing XML to SAX events.
--- In the event of an error, FailDocument is the last element of the output list.
-parseLocationsG :: forall tag text l . (GenericXMLString tag, GenericXMLString text, List l) =>
-                   ParseOptions tag text -- ^ Parse options
-                -> l ByteString          -- ^ Input text (a lazy ByteString)
-                -> l (SAXEvent tag text, XMLParseLocation)
-parseLocationsG opts inputBlocks = runParser inputBlocks parser queueRef cacheRef
-  where
-    (parser, queueRef, cacheRef) = unsafePerformIO $ do
-        let enc = overrideEncoding opts
-        let mEntityDecoder = entityDecoder opts
-
-        parser <- newParser enc
-        queueRef <- newIORef []
-
-        case mEntityDecoder of
-            Just deco -> setEntityDecoder parser deco $ \pp txt -> do
-                loc <- getParseLocation pp
-                modifyIORef queueRef ((CharacterData txt, loc):)
-            Nothing -> return ()
-
-        setXMLDeclarationHandler parser $ \pp cVer cEnc cSd -> do
-            ver <- textFromCString cVer
-            mEnc <- if cEnc == nullPtr
-                then return Nothing
-                else Just <$> textFromCString cEnc
-            let sd = if cSd < 0
-                    then Nothing
-                    else Just $ if cSd /= 0 then True else False
-            loc <- getParseLocation pp
-            modifyIORef queueRef ((XMLDeclaration ver mEnc sd, loc):)
-            return True
-
-        setStartElementHandler parser $ \pp cName cAttrs -> do
-            name <- textFromCString cName
-            attrs <- forM cAttrs $ \(cAttrName,cAttrValue) -> do
-                attrName <- textFromCString cAttrName
-                attrValue <- textFromCString cAttrValue
-                return (attrName, attrValue)
-            loc <- getParseLocation pp
-            modifyIORef queueRef ((StartElement name attrs,loc):)
-            return True
-
-        setEndElementHandler parser $ \pp cName -> do
-            name <- textFromCString cName
-            loc <- getParseLocation pp
-            modifyIORef queueRef ((EndElement name, loc):)
-            return True
-
-        setCharacterDataHandler parser $ \pp cText -> do
-            txt <- gxFromCStringLen cText
-            loc <- getParseLocation pp
-            modifyIORef queueRef ((CharacterData txt, loc):)
-            return True
-            
-        setStartCDataHandler parser $ \pp -> do
-            loc <- getParseLocation pp
-            modifyIORef queueRef ((StartCData, loc):)
-            return True
-            
-        setEndCDataHandler parser $ \pp -> do
-            loc <- getParseLocation pp
-            modifyIORef queueRef ((EndCData,loc):)
-            return True
-            
-        setProcessingInstructionHandler parser $ \pp cTarget cText -> do
-            target <- textFromCString cTarget
-            txt <- textFromCString cText
-            loc <- getParseLocation pp
-            modifyIORef queueRef ((ProcessingInstruction target txt, loc):)
-            return True
-            
-        setCommentHandler parser $ \pp cText -> do
-            txt <- textFromCString cText
-            loc <- getParseLocation pp
-            modifyIORef queueRef ((Comment txt, loc):)
-            return True
-
-        cacheRef <- newIORef Nothing
-        return (parser, queueRef, cacheRef)
-
-    runParser iblks parser queueRef cacheRef = joinL $ do
-        li <- runList iblks
-        return $ unsafePerformIO $ do
-            mCached <- readIORef cacheRef
-            case mCached of
-                Just l -> return l
-                Nothing -> do
-                    rema <- case li of
-                            Nil         -> do
-                                mError <- withParser parser $ \pp -> parseChunk pp B.empty True
-                                handleFailure mError mzero
-                            Cons blk t -> unsafeInterleaveIO $ do
-                                mError <- withParser parser $ \pp -> parseChunk pp blk False
-                                cacheRef' <- newIORef Nothing
-                                handleFailure mError (runParser t parser queueRef cacheRef')
-                    queue <- readIORef queueRef
-                    writeIORef queueRef []
-                    let l = fromList (reverse queue) `mplus` rema
-                    writeIORef cacheRef (Just l)
-                    return l
-      where
-        handleFailure (Just err) _ = do loc <- withParser parser getParseLocation
-                                        return $ (FailDocument err, loc) `cons` mzero
-        handleFailure Nothing    l = return l
-
 -- | A variant of parseSAX that gives a document location with each SAX event.
 parseLocations :: (GenericXMLString tag, GenericXMLString text) =>
                   ParseOptions tag text  -- ^ Parse options
@@ -448,17 +319,7 @@
                -> [(SAXEvent tag text, XMLParseLocation)]
 parseLocations opts input = parseLocationsG opts (L.toChunks input)
 
--- | DEPRECATED: Use 'parseLocations' instead.
---
--- A variant of parseSAX that gives a document location with each SAX event.
-parseSAXLocations :: (GenericXMLString tag, GenericXMLString text) =>
-            Maybe Encoding      -- ^ Optional encoding override
-         -> L.ByteString        -- ^ Input text (a lazy ByteString)
-         -> [(SAXEvent tag text, XMLParseLocation)]
-{-# DEPRECATED parseSAXLocations "use Text.XML.Expat.SAX.parseLocations instead" #-}
-parseSAXLocations enc = parseLocations (ParseOptions enc Nothing)
 
-
 -- | Lazily parse XML to SAX events. In the event of an error, throw
 -- 'XMLParseException'.
 --
@@ -477,18 +338,6 @@
     freakOut other = other
 
 
--- | DEPRECATED: Use 'parseThrowing' instead.
---
--- Lazily parse XML to SAX events. In the event of an error, throw
--- 'XMLParseException'.
-parseSAXThrowing :: (GenericXMLString tag, GenericXMLString text) =>
-                    Maybe Encoding      -- ^ Optional encoding override
-                 -> L.ByteString        -- ^ Input text (a lazy ByteString)
-                 -> [SAXEvent tag text]
-{-# DEPRECATED parseSAXThrowing "use Text.XML.Expat.SAX.parseThrowing instead" #-}
-parseSAXThrowing mEnc = parseThrowing (ParseOptions mEnc Nothing)
-
-
 -- | A variant of parseSAX that gives a document location with each SAX event.
 -- In the event of an error, throw 'XMLParseException'.
 --
@@ -505,16 +354,3 @@
   where
     freakOut (FailDocument err, _) = Exc.throw $ XMLParseException err
     freakOut other = other
-
-
--- | DEPRECATED: Used 'parseLocationsThrowing' instead.
---
--- A variant of parseSAX that gives a document location with each SAX event.
--- In the event of an error, throw 'XMLParseException'.
-parseSAXLocationsThrowing :: (GenericXMLString tag, GenericXMLString text) =>
-                             Maybe Encoding      -- ^ Optional encoding override
-                          -> L.ByteString        -- ^ Input text (a lazy ByteString)
-                          -> [(SAXEvent tag text, XMLParseLocation)]
-{-# DEPRECATED parseSAXLocationsThrowing "use Text.XML.Expat.SAX.parseLocationsThrowing instead" #-}
-parseSAXLocationsThrowing mEnc =
-    parseLocationsThrowing (ParseOptions mEnc Nothing)
diff --git a/Text/XML/Expat/Tree.hs b/Text/XML/Expat/Tree.hs
--- a/Text/XML/Expat/Tree.hs
+++ b/Text/XML/Expat/Tree.hs
@@ -128,60 +128,35 @@
   saxToTreeG,
 
   -- * Abstraction of string types
-  GenericXMLString(..),
-
-  -- * Deprecated
-  eAttrs,
-  Nodes,
-  UNodes,
-  QNodes,
-  NNodes,
-  parseTree,
-  parseTree',
-  parseSAX,
-  parseSAXLocations,
-  parseTreeThrowing,
-  parseSAXThrowing,
-  parseSAXLocationsThrowing,
-  ParserOptions,
-  defaultParserOptions
+  GenericXMLString(..)
   ) where
 
-import Text.XML.Expat.Internal.IO hiding (parse,parse')
-import qualified Text.XML.Expat.Internal.IO as IO
-import Text.XML.Expat.SAX ( ParseOptions(..)
-                          , XMLParseException(..)
-                          , SAXEvent(..)
-                          , defaultParseOptions
-                          , textFromCString
-                          , parseSAX
-                          , parseSAXLocations
-                          , parseSAXLocationsThrowing
-                          , parseSAXThrowing
+import Text.XML.Expat.SAX ( Encoding(..)
                           , GenericXMLString(..)
-                          , setEntityDecoder
-                          , ParserOptions
-                          , defaultParserOptions )
+                          , ParseOptions(..)
+                          , defaultParseOptions
+                          , SAXEvent(..)
+                          , XMLParseError(..)
+                          , XMLParseException(..)
+                          , XMLParseLocation(..) )
 import qualified Text.XML.Expat.SAX as SAX
 import Text.XML.Expat.Internal.Namespaced
 import Text.XML.Expat.Internal.NodeClass
 import Text.XML.Expat.Internal.Qualified
 
 import Control.Arrow
-import Control.Monad (forM, mplus, mzero)
+import Control.Monad (mplus, mzero)
 import Data.ByteString (ByteString)
 import qualified Data.ByteString.Lazy as L
-import Data.IORef
 import Data.List.Class
 import Data.Monoid (Monoid,mempty,mappend)
 import Control.DeepSeq
-import System.IO.Unsafe
 
 
 -- | The tree representation of the XML document.
 --
--- @c@ is the container type for the element's children, which is [] in the
--- @hexpat@ package, and a monadic list type for @hexpat-iteratee@.
+-- @c@ is the container type for the element's children, which would normally be [],
+-- but could potentially be a monadic list type to allow for chunked I/O.
 --
 -- @tag@ is the tag type, which can either be one of several string types,
 -- or a special type from the @Text.XML.Expat.Namespaced@ or
@@ -221,46 +196,17 @@
 -- @ListOf (UNode Text)@.
 type Node tag text = NodeG [] tag text
 
-eAttrs :: Node tag text -> [(tag, text)]
-{-# DEPRECATED eAttrs "use eAttributes instead" #-}
-eAttrs = eAttributes
-
 instance (NFData tag, NFData text) => NFData (NodeG [] tag text) where
     rnf (Element nam att chi) = rnf (nam, att, chi)
     rnf (Text txt) = rnf txt
 
--- | DEPRECATED: Use [Node tag text] instead.
---
--- Type alias for nodes.
-type Nodes tag text = [Node tag text]
-{-# DEPRECATED Nodes "use [Node tag text] instead" #-}
-
--- | DEPRECATED: Use [UNode text] instead.
---
--- Type alias for nodes with unqualified tag names where tag and
--- text are the same string type. DEPRECATED.
-type UNodes text = Nodes text text
-{-# DEPRECATED UNodes "use [UNode text] instead" #-}
-
 -- | Type alias for a node with unqualified tag names where tag and
 -- text are the same string type.
 type UNode text = Node text text
 
--- | DEPRECATED: Use [QNode text] instead.
---
--- Type alias for nodes where qualified names are used for tags
-{-# DEPRECATED QNodes "use [QNode text] instead" #-}
-type QNodes text = [Node (QName text) text]
-
 -- | Type alias for a node where qualified names are used for tags
 type QNode text = Node (QName text) text
 
--- | DEPRECATED: Use [NNode text] instead.
---
--- Type alias for nodes where namespaced names are used for tags.
-{-# DEPRECATED NNodes "use [NNode text] instead" #-}
-type NNodes text = [Node (NName text) text]
-
 -- | Type alias for a node where namespaced names are used for tags
 type NNode text = Node (NName text) text
 
@@ -328,65 +274,9 @@
           ParseOptions tag text  -- ^ Parse options
        -> ByteString              -- ^ Input text (a strict ByteString)
        -> Either XMLParseError (Node tag text)
-parse' opts doc = unsafePerformIO $ runParse where
-  runParse = do
-    let enc = overrideEncoding opts
-    let mEntityDecoder = entityDecoder opts
-
-    parser <- newParser enc
-
-    -- We maintain the invariant that the stack always has one element,
-    -- whose only child at the end of parsing is the root of the actual tree.
-    let emptyString = gxFromString ""
-    stack <- newIORef [Element emptyString [] []]
-
-    case mEntityDecoder of
-        Just deco -> setEntityDecoder parser deco $ \_ txt -> do
-            modifyIORef stack (text txt)
-        Nothing -> return ()
-
-    setStartElementHandler parser $ \_ cName cAttrs -> do
-        name <- textFromCString cName
-        attrs <- forM cAttrs $ \(cAttrName,cAttrValue) -> do
-            attrName <- textFromCString cAttrName
-            attrValue <- textFromCString cAttrValue
-            return (attrName, attrValue)
-        modifyIORef stack (start name attrs)
-        return True
-    setEndElementHandler parser $ \_ _ -> do
-        modifyIORef stack end
-        return True
-    setCharacterDataHandler parser $ \_ cText -> do
-        txt <- gxFromCStringLen cText
-        modifyIORef stack (text txt)
-        return True
-    mError <- IO.parse' parser doc
-    case mError of
-        Just err -> return $ Left err
-        Nothing -> do
-            [Element _ _ [root]] <- readIORef stack
-            return $ Right root
-
-  start name attrs stack = Element name attrs [] : stack
-  text str (cur:rest) = modifyChildren (Text str:) cur : rest
-  text _ [] = impossible
-  end (cur:parent:rest) =
-    let node = modifyChildren reverse cur in
-    modifyChildren (node:) parent : rest
-  end _ = impossible
-  impossible = error "parse' impossible"
-
-
--- | DEPRECATED: use 'parse' instead.
---
--- Strictly parse XML to tree. Returns error message or valid parsed tree.
-parseTree' :: (GenericXMLString tag, GenericXMLString text) =>
-              Maybe Encoding      -- ^ Optional encoding override
-           -> ByteString          -- ^ Input text (a strict ByteString)
-           -> Either XMLParseError (Node tag text)
-{-# DEPRECATED parseTree' "use Text.XML.Expat.parse' instead" #-}
-parseTree' enc = parse' (ParseOptions enc Nothing)
-
+parse' opts doc = case parse opts (L.fromChunks [doc]) of
+    (xml, Nothing) -> Right xml
+    (_, Just err) -> Left err
 
 -- | A lower level function that lazily converts a SAX stream into a tree structure.
 saxToTree :: GenericXMLString tag =>
@@ -460,19 +350,6 @@
        -> ItemM l (NodeG l tag text)
 parseG opts = saxToTreeG . SAX.parseG opts
 
--- | DEPREACTED: Use 'parse' instead.
---
--- Lazily parse XML to tree. Note that forcing the XMLParseError return value
--- will force the entire parse.  Therefore, to ensure lazy operation, don't
--- check the error status until you have processed the tree.
-parseTree :: (GenericXMLString tag, GenericXMLString text) =>
-             Maybe Encoding      -- ^ Optional encoding override
-          -> L.ByteString        -- ^ Input text (a lazy ByteString)
-          -> (Node tag text, Maybe XMLParseError)
-{-# DEPRECATED parseTree "use Text.XML.Expat.Tree.parse instead" #-}
-parseTree mEnc = parse (ParseOptions mEnc Nothing)
-
-
 -- | Lazily parse XML to tree. In the event of an error, throw 'XMLParseException'.
 --
 -- @parseThrowing@ can throw an exception from pure code, which is generally a bad
@@ -485,14 +362,3 @@
       -> L.ByteString           -- ^ Input text (a lazy ByteString)
       -> Node tag text
 parseThrowing opts bs = fst $ saxToTree $ SAX.parseThrowing opts bs
-
-
--- | DEPRECATED: Use 'parseThrowing' instead.
---
--- Lazily parse XML to tree. In the event of an error, throw 'XMLParseException'.
-parseTreeThrowing :: (GenericXMLString tag, GenericXMLString text) =>
-             Maybe Encoding      -- ^ Optional encoding override
-          -> L.ByteString        -- ^ Input text (a lazy ByteString)
-          -> Node tag text
-{-# DEPRECATED parseTreeThrowing "use Text.XML.Expat.Tree.parseThrowing instead" #-}
-parseTreeThrowing mEnc = parseThrowing (ParseOptions mEnc Nothing)
diff --git a/hexpat.cabal b/hexpat.cabal
--- a/hexpat.cabal
+++ b/hexpat.cabal
@@ -1,6 +1,6 @@
 Cabal-Version: >= 1.6
 Name: hexpat
-Version: 0.19.10
+Version: 0.20.1
 Synopsis: XML parser/formatter based on expat
 Description:
   This package provides a general purpose Haskell XML library using Expat to
@@ -23,8 +23,9 @@
   If you want to do interactive I\/O, an obvious option is to use lazy parsing
   with one of the lazy I\/O functions such as hGetContents.  However, this can be
   problematic in some applications because it doesn't handle I\/O errors properly
-  and can give no guarantee of timely resource cleanup.  In these cases, chunked
-  I\/O is a better approach: Take a look at the /hexpat-enumerator/ package.
+  and can give no guarantee of timely resource cleanup. Because of the generalized
+  list, Hexpat is designed to allow for chunked I/O, but as of this writing I haven't
+  done a nice integration with enumerator and friends.
   .
   /IO/ is filed under /Internal/ because it's low-level and most users won't want
   it.  The other /Internal/ modules are re-exported by /Annotated/, /Tree/ and /Extended/,
@@ -33,14 +34,6 @@
   Credits to Iavor Diatchki and the @xml@ (XML.Light) package for /Proc/ and /Cursor/.
   Thanks to the many contributors.
   .
-  BOUND VS. UNBOUND THREADS: GHC (at least versions 6.12.X) will spawn threads
-  if you call a safe FFI callback from an unbound thread.  This can get out of
-  control in a busy application.  To avoid this, from version 0.19.1 we now delegate
-  processing to a single worker thread if the calling thread is not bound.
-  This essentially means that hexpat currently won't exploit multicores very well.
-  It also means that hexpat may be more efficient on threads spawned with forkOS
-  (to give you a bound thread) rather than forkIO.
-  .
   ChangeLog: 0.15 changes intended to fix a (rare) \"error: a C finalizer called back into Haskell.\"
     that seemed only to happen only on ghc6.12.X; 0.15.1 Fix broken Annotated parse;
     0.16 switch from mtl to transformers; 0.17 fix mapNodeContainer & rename some things.;
@@ -52,7 +45,9 @@
     which broke entity parsing; 0.19.4 bump version constraint for text; 0.19.5 bump text
     to < 0.12 and fix text-0.10.0.1 breakage; 0.19.6 dependency breakage with List;
     0.19.7 ghc-7.2.1 compatibility; 0.19.8 fix space leak on lazy parse under ghc-7.2.1;
-    0.19.9 fix formatting of > character + improve performance; 0.9.10 ghc-7.4.x compatibility.
+    0.19.9 fix formatting of > character + improve performance; 0.19.10 ghc-7.4.x compatibility;
+    0.20.1 fix an unfortunate crash when used in parallel processing and greatly improve
+    performance.
 Category: XML
 License: BSD3
 License-File: LICENSE
@@ -95,6 +90,8 @@
   test/hexpat-leak/Parse.hs,
   test/hexpat-leak/run.sh,
   test/hexpat-leak/build.sh
+  test/readRoads.hs,
+  test/ROADS.xml,
   cbits/amigaconfig.h,
   cbits/asciitab.h,
   cbits/expat.h,
@@ -132,11 +129,7 @@
     Text.XML.Expat.Cursor,
     Text.XML.Expat.Extended,
     Text.XML.Expat.Format,
-    Text.XML.Expat.IO,
-    Text.XML.Expat.Namespaced,
-    Text.XML.Expat.NodeClass,
     Text.XML.Expat.Proc,
-    Text.XML.Expat.Qualified,
     Text.XML.Expat.SAX,
     Text.XML.Expat.Tree,
     Text.XML.Expat.Internal.DocumentClass,
@@ -152,6 +145,7 @@
     cbits/xmlrole.c,
     cbits/xmltok.c,
     cbits/xmltok_impl.c,
-    cbits/xmltok_ns.c
+    cbits/xmltok_ns.c,
+    Text/XML/Expat/Internal/Glue.c
   cc-options: -DHAVE_MEMMOVE -DXML_NS -DXML_DTD
 
diff --git a/test/ROADS.xml b/test/ROADS.xml
new file mode 100644
--- /dev/null
+++ b/test/ROADS.xml
@@ -0,0 +1,1008 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<shapes>
+  <shape shapeType="polyLine" id="0" ADD_L_DIR="-1" ADD_L_MAX="17" ADD_L_MIN="3" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="26" ADD_R_MIN="6" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="WAIMEA LANE" ID="64" ISLAND="North Island" NAME="WAIMEA LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64414" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Remuera" TOWN="Auckland" TURNRESLNK="ak66" URBANRURAL="U" ID1="1">
+    <vertices>
+      <vertex X="174.800917" Y="-36.874316"/>
+      <vertex X="174.800705" Y="-36.874296"/>
+      <vertex X="174.798671" Y="-36.874107"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="1" ADD_L_DIR="1" ADD_L_MAX="25" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="DENARIUS LANE" ID="65" ISLAND="North Island" NAME="DENARIUS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64413" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glendene" TOWN="Waitakere" TURNRESLNK="ak67" URBANRURAL="U" ID1="2">
+    <vertices>
+      <vertex X="174.657551" Y="-36.889236"/>
+      <vertex X="174.656120" Y="-36.888354"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="2" ADD_L_DIR="1" ADD_L_MAX="46" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="BOARDMAN LANE" ID="66" ISLAND="North Island" NAME="BOARDMAN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64412" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak92" URBANRURAL="U" ID1="3">
+    <vertices>
+      <vertex X="174.757249" Y="-36.857860"/>
+      <vertex X="174.757058" Y="-36.857463"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="3" ADD_L_DIR="1" ADD_L_MAX="20" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="13" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="GARDEN LANE" ID="35" ISLAND="North Island" NAME="GARDEN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64411" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Northcross" TOWN="North Shore" TURNRESLNK="ak35" URBANRURAL="U" ID1="4">
+    <vertices>
+      <vertex X="174.735888" Y="-36.707362"/>
+      <vertex X="174.736360" Y="-36.707260"/>
+      <vertex X="174.736581" Y="-36.707229"/>
+      <vertex X="174.737098" Y="-36.707092"/>
+      <vertex X="174.737294" Y="-36.706989"/>
+      <vertex X="174.737303" Y="-36.706958"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="4" ADD_L_DIR="1" ADD_L_MAX="10" ADD_L_MIN="2" ADD_L_TYPE="M" ADD_R_DIR="1" ADD_R_MAX="3" ADD_R_MIN="3" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="EMILY LANE" ID="36" ISLAND="North Island" NAME="EMILY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64409" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Cuthill" TOWN="North Shore" TURNRESLNK="ak36" URBANRURAL="U" ID1="5">
+    <vertices>
+      <vertex X="174.704080" Y="-36.764450"/>
+      <vertex X="174.703525" Y="-36.764050"/>
+      <vertex X="174.703360" Y="-36.763845"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="5" ADD_L_DIR="1" ADD_L_MAX="22" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="15" ADD_R_MIN="5" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="DENE COURT LANE" ID="37" ISLAND="North Island" NAME="DENE COURT LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64408" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Cuthill" TOWN="North Shore" TURNRESLNK="ak37" URBANRURAL="U" ID1="6">
+    <vertices>
+      <vertex X="174.706178" Y="-36.762460"/>
+      <vertex X="174.707042" Y="-36.763011"/>
+      <vertex X="174.707911" Y="-36.763718"/>
+      <vertex X="174.708126" Y="-36.764282"/>
+      <vertex X="174.708057" Y="-36.764526"/>
+      <vertex X="174.707982" Y="-36.764789"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="6" ADD_L_DIR="1" ADD_L_MAX="22" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="23" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="REDFERN LANE" ID="38" ISLAND="North Island" NAME="REDFERN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64407" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glenfield" TOWN="North Shore" TURNRESLNK="ak38" URBANRURAL="U" ID1="7">
+    <vertices>
+      <vertex X="174.708554" Y="-36.786916"/>
+      <vertex X="174.709059" Y="-36.786575"/>
+      <vertex X="174.709234" Y="-36.786400"/>
+      <vertex X="174.709373" Y="-36.786128"/>
+      <vertex X="174.709438" Y="-36.785949"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="7" ADD_L_DIR="-1" ADD_L_MAX="15" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="14" ADD_R_MIN="4" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="GLADFIELD LANE" ID="39" ISLAND="North Island" NAME="GLADFIELD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64405" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak39" URBANRURAL="U" ID1="8">
+    <vertices>
+      <vertex X="174.649093" Y="-36.835993"/>
+      <vertex X="174.648993" Y="-36.836069"/>
+      <vertex X="174.648946" Y="-36.836104"/>
+      <vertex X="174.648276" Y="-36.836606"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="8" ADD_L_DIR="-1" ADD_L_MAX="9" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="10" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="GLENFORD LANE" ID="40" ISLAND="North Island" NAME="GLENFORD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64404" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak40" URBANRURAL="U" ID1="9">
+    <vertices>
+      <vertex X="174.646092" Y="-36.834602"/>
+      <vertex X="174.645978" Y="-36.834622"/>
+      <vertex X="174.645450" Y="-36.834975"/>
+      <vertex X="174.645188" Y="-36.835258"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="9" ADD_L_DIR="-1" ADD_L_MAX="5" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="6" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="BRAEBANK LANE" ID="41" ISLAND="North Island" NAME="BRAEBANK LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64403" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu South" TOWN="Waitakere" TURNRESLNK="ak41" URBANRURAL="U" ID1="10">
+    <vertices>
+      <vertex X="174.654567" Y="-36.860195"/>
+      <vertex X="174.654041" Y="-36.861186"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="10" ADD_L_DIR="-1" ADD_L_MAX="8" ADD_L_MIN="4" ADD_L_TYPE="E" ADD_R_DIR="-1" ADD_R_MAX="7" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="SUNRISE LANE" ID="42" ISLAND="North Island" NAME="SUNRISE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64402" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu South" TOWN="Waitakere" TURNRESLNK="ak42" URBANRURAL="U" ID1="11">
+    <vertices>
+      <vertex X="174.651493" Y="-36.861550"/>
+      <vertex X="174.650956" Y="-36.862099"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="11" ADD_L_DIR="-1" ADD_L_MAX="11" ADD_L_MIN="3" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="10" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="GANE LANE" ID="43" ISLAND="North Island" NAME="GANE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64399" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak45" URBANRURAL="U" ID1="12">
+    <vertices>
+      <vertex X="174.648910" Y="-36.846895"/>
+      <vertex X="174.648532" Y="-36.847487"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="12" ADD_L_DIR="-1" ADD_L_MAX="7" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="6" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="GLENVIL LANE" ID="44" ISLAND="North Island" NAME="GLENVIL LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64398" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak46" URBANRURAL="U" ID1="13">
+    <vertices>
+      <vertex X="174.648767" Y="-36.849879"/>
+      <vertex X="174.648673" Y="-36.849839"/>
+      <vertex X="174.648157" Y="-36.849209"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="13" ADD_L_DIR="-1" ADD_L_MAX="11" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="16" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="SPRINGBANK LANE" ID="45" ISLAND="North Island" NAME="SPRINGBANK LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64397" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak47" URBANRURAL="U" ID1="14">
+    <vertices>
+      <vertex X="174.644889" Y="-36.843879"/>
+      <vertex X="174.646215" Y="-36.843489"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="14" ADD_L_DIR="-1" ADD_L_MAX="11" ADD_L_MIN="3" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="14" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="SHAMROCK LANE" ID="46" ISLAND="North Island" NAME="SHAMROCK LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64396" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak48" URBANRURAL="U" ID1="15">
+    <vertices>
+      <vertex X="174.649589" Y="-36.838069"/>
+      <vertex X="174.649551" Y="-36.838033"/>
+      <vertex X="174.648642" Y="-36.837629"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="15" ADD_L_DIR="-1" ADD_L_MAX="9" ADD_L_MIN="3" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="10" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="BEAUFIELD LANE" ID="47" ISLAND="North Island" NAME="BEAUFIELD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64395" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak49" URBANRURAL="U" ID1="16">
+    <vertices>
+      <vertex X="174.647448" Y="-36.837864"/>
+      <vertex X="174.648140" Y="-36.838223"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="16" ADD_L_DIR="1" ADD_L_MAX="22" ADD_L_MIN="4" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="25" ADD_R_MIN="3" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="ELISA LANE" ID="48" ISLAND="North Island" NAME="ELISA LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64394" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Ranui" TOWN="Waitakere" TURNRESLNK="ak50" URBANRURAL="U" ID1="17">
+    <vertices>
+      <vertex X="174.602145" Y="-36.861159"/>
+      <vertex X="174.602659" Y="-36.861093"/>
+      <vertex X="174.603003" Y="-36.861153"/>
+      <vertex X="174.603023" Y="-36.861149"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="17" ADD_L_DIR="-1" ADD_L_MAX="23" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="6" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="CONSTABLE LANE" ID="49" ISLAND="North Island" NAME="CONSTABLE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64393" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="West Harbour" TOWN="Waitakere" TURNRESLNK="ak51" URBANRURAL="U" ID1="18">
+    <vertices>
+      <vertex X="174.642384" Y="-36.818826"/>
+      <vertex X="174.642240" Y="-36.818688"/>
+      <vertex X="174.642098" Y="-36.818540"/>
+      <vertex X="174.642057" Y="-36.818473"/>
+      <vertex X="174.642042" Y="-36.818390"/>
+      <vertex X="174.642085" Y="-36.818272"/>
+      <vertex X="174.642163" Y="-36.818113"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="18" ADD_L_DIR="-1" ADD_L_MAX="9" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="8" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="STAFSON LANE" ID="50" ISLAND="North Island" NAME="STAFSON LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64392" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Te Atatu Peninsula" TOWN="Waitakere" TURNRESLNK="ak52" URBANRURAL="U" ID1="19">
+    <vertices>
+      <vertex X="174.645498" Y="-36.829736"/>
+      <vertex X="174.645394" Y="-36.829932"/>
+      <vertex X="174.644814" Y="-36.830599"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="19" ADD_L_DIR="-1" ADD_L_MAX="3" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="2" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SPROSTON AVENUE" ID="83" ISLAND="North Island" NAME="SPROSTON AVE" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64391" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Ellerslie" TOWN="Auckland" TURNRESLNK="ak109" URBANRURAL="U" ID1="20">
+    <vertices>
+      <vertex X="174.804846" Y="-36.893312"/>
+      <vertex X="174.805949" Y="-36.893695"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="20" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SHELLY BEACH ROAD" ID="84" ISLAND="North Island" NAME="SHELLY BEACH RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64388" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Saint Marys Bay" TOWN="Auckland" TURNRESLNK="ak110" URBANRURAL="U" ID1="21">
+    <vertices>
+      <vertex X="174.742966" Y="-36.835312"/>
+      <vertex X="174.742938" Y="-36.835373"/>
+      <vertex X="174.742907" Y="-36.835428"/>
+      <vertex X="174.742885" Y="-36.835464"/>
+      <vertex X="174.742868" Y="-36.835504"/>
+      <vertex X="174.742830" Y="-36.835629"/>
+      <vertex X="174.742809" Y="-36.835687"/>
+      <vertex X="174.742779" Y="-36.835746"/>
+      <vertex X="174.742666" Y="-36.835944"/>
+      <vertex X="174.742452" Y="-36.836289"/>
+      <vertex X="174.742391" Y="-36.836391"/>
+      <vertex X="174.742328" Y="-36.836503"/>
+      <vertex X="174.742293" Y="-36.836577"/>
+      <vertex X="174.742261" Y="-36.836648"/>
+      <vertex X="174.742233" Y="-36.836717"/>
+      <vertex X="174.742211" Y="-36.836777"/>
+      <vertex X="174.742183" Y="-36.836868"/>
+      <vertex X="174.742153" Y="-36.836985"/>
+      <vertex X="174.742136" Y="-36.837071"/>
+      <vertex X="174.742106" Y="-36.837292"/>
+      <vertex X="174.742080" Y="-36.837419"/>
+      <vertex X="174.742054" Y="-36.837504"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="21" ADD_L_DIR="1" ADD_L_MAX="20" ADD_L_MIN="8" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="30" ADD_R_MIN="30" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="WHITAKER PLACE" ID="85" ISLAND="North Island" NAME="WHITAKER PL" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64386" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak111" URBANRURAL="U" ID1="22">
+    <vertices>
+      <vertex X="174.766871" Y="-36.856923"/>
+      <vertex X="174.766970" Y="-36.856946"/>
+      <vertex X="174.767088" Y="-36.856905"/>
+      <vertex X="174.767243" Y="-36.856747"/>
+      <vertex X="174.767260" Y="-36.856668"/>
+      <vertex X="174.766999" Y="-36.856464"/>
+      <vertex X="174.767445" Y="-36.856063"/>
+      <vertex X="174.767785" Y="-36.855951"/>
+      <vertex X="174.768032" Y="-36.855830"/>
+      <vertex X="174.768469" Y="-36.855183"/>
+      <vertex X="174.768525" Y="-36.854709"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="22" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DOMAIN DRIVE" ID="86" ISLAND="North Island" NAME="DOMAIN DR" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64385" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak112" URBANRURAL="U" ID1="23">
+    <vertices>
+      <vertex X="174.774820" Y="-36.858931"/>
+      <vertex X="174.774130" Y="-36.858981"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="23" ADD_L_DIR="-1" ADD_L_MAX="14" ADD_L_MIN="7" ADD_L_TYPE="M" ADD_R_DIR="1" ADD_R_MAX="6" ADD_R_MIN="1" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="DAVERN LANE" ID="90" ISLAND="North Island" NAME="DAVERN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64383" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="New Lynn" TOWN="Waitakere" TURNRESLNK="ak71" URBANRURAL="U" ID1="24">
+    <vertices>
+      <vertex X="174.673713" Y="-36.920832"/>
+      <vertex X="174.672945" Y="-36.920079"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="24" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="CLUB LANE" ID="1" ISLAND="North Island" NAME="CLUB LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64382" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Takapuna Beach" TOWN="North Shore" TURNRESLNK="ak91" URBANRURAL="U" ID1="25">
+    <vertices>
+      <vertex X="174.773774" Y="-36.790392"/>
+      <vertex X="174.773267" Y="-36.789750"/>
+      <vertex X="174.773144" Y="-36.789551"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="25" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="CENOTAPH ROAD" ID="2" ISLAND="North Island" NAME="CENOTAPH RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64380" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak1" URBANRURAL="U" ID1="26">
+    <vertices>
+      <vertex X="174.776349" Y="-36.859527"/>
+      <vertex X="174.777016" Y="-36.859524"/>
+      <vertex X="174.777847" Y="-36.859529"/>
+      <vertex X="174.778229" Y="-36.859538"/>
+      <vertex X="174.778380" Y="-36.859585"/>
+      <vertex X="174.778588" Y="-36.859740"/>
+      <vertex X="174.778668" Y="-36.859853"/>
+      <vertex X="174.778713" Y="-36.859979"/>
+      <vertex X="174.778710" Y="-36.860295"/>
+      <vertex X="174.778704" Y="-36.860951"/>
+      <vertex X="174.778656" Y="-36.861033"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="26" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MUSEUM CIRCUIT" ID="3" ISLAND="North Island" NAME="MUSEUM CIRCUIT" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64379" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak2" URBANRURAL="U" ID1="27">
+    <vertices>
+      <vertex X="174.777198" Y="-36.860080"/>
+      <vertex X="174.776455" Y="-36.860071"/>
+      <vertex X="174.776317" Y="-36.860009"/>
+      <vertex X="174.776212" Y="-36.859899"/>
+      <vertex X="174.776200" Y="-36.859756"/>
+      <vertex X="174.776239" Y="-36.859658"/>
+      <vertex X="174.776291" Y="-36.859564"/>
+      <vertex X="174.776349" Y="-36.859527"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="27" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="KIOSK ROAD" ID="5" ISLAND="North Island" NAME="KIOSK RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64378" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak4" URBANRURAL="U" ID1="28">
+    <vertices>
+      <vertex X="174.774677" Y="-36.859587"/>
+      <vertex X="174.774392" Y="-36.859701"/>
+      <vertex X="174.774214" Y="-36.859776"/>
+      <vertex X="174.773644" Y="-36.860015"/>
+      <vertex X="174.773341" Y="-36.860152"/>
+      <vertex X="174.773183" Y="-36.860250"/>
+      <vertex X="174.773065" Y="-36.860346"/>
+      <vertex X="174.772994" Y="-36.860449"/>
+      <vertex X="174.772941" Y="-36.860568"/>
+      <vertex X="174.772880" Y="-36.860701"/>
+      <vertex X="174.772806" Y="-36.860780"/>
+      <vertex X="174.772722" Y="-36.860833"/>
+      <vertex X="174.772635" Y="-36.860870"/>
+      <vertex X="174.772509" Y="-36.860898"/>
+      <vertex X="174.771892" Y="-36.860896"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="28" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="THE CRESCENT" ID="6" ISLAND="North Island" NAME="THE CRESCENT" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64376" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak5" URBANRURAL="U" ID1="29">
+    <vertices>
+      <vertex X="174.775859" Y="-36.859622"/>
+      <vertex X="174.775569" Y="-36.859700"/>
+      <vertex X="174.775344" Y="-36.859728"/>
+      <vertex X="174.775129" Y="-36.859719"/>
+      <vertex X="174.774952" Y="-36.859688"/>
+      <vertex X="174.774677" Y="-36.859587"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="29" ADD_L_DIR="1" ADD_L_MAX="2" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="13" ADD_R_MIN="3" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MERCURY LANE" ID="7" ISLAND="North Island" NAME="MERCURY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="3" RD_SEG_LNK="63668" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Newton" TOWN="Auckland" TURNRESLNK="ak6" URBANRURAL="U" ID1="30">
+    <vertices>
+      <vertex X="174.759046" Y="-36.857703"/>
+      <vertex X="174.759010" Y="-36.858434"/>
+      <vertex X="174.759055" Y="-36.858534"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="30" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="2" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="FREYBERG PLACE" ID="13" ISLAND="North Island" NAME="FREYBERG PL" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63666" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak12" URBANRURAL="U" ID1="31">
+    <vertices>
+      <vertex X="174.766620" Y="-36.847670"/>
+      <vertex X="174.767098" Y="-36.847748"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="31" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SAINT JAMES STREET" ID="14" ISLAND="North Island" NAME="ST JAMES ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63662" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak13" URBANRURAL="U" ID1="32">
+    <vertices>
+      <vertex X="174.757675" Y="-36.856022"/>
+      <vertex X="174.757645" Y="-36.855944"/>
+      <vertex X="174.757642" Y="-36.855650"/>
+      <vertex X="174.757668" Y="-36.855191"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="32" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DOMAIN DRIVE" ID="15" ISLAND="North Island" NAME="DOMAIN DR" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="64385" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak14" URBANRURAL="U" ID1="33">
+    <vertices>
+      <vertex X="174.771892" Y="-36.860896"/>
+      <vertex X="174.771686" Y="-36.860869"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="33" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DOMAIN DRIVE" ID="16" ISLAND="North Island" NAME="DOMAIN DR" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64385" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak15" URBANRURAL="U" ID1="34">
+    <vertices>
+      <vertex X="174.770486" Y="-36.862104"/>
+      <vertex X="174.771000" Y="-36.861930"/>
+      <vertex X="174.771237" Y="-36.861723"/>
+      <vertex X="174.771503" Y="-36.861320"/>
+      <vertex X="174.771660" Y="-36.860995"/>
+      <vertex X="174.771686" Y="-36.860869"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="34" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DOMAIN DRIVE" ID="17" ISLAND="North Island" NAME="DOMAIN DR" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="64385" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Grafton" TOWN="Auckland" TURNRESLNK="ak16" URBANRURAL="U" ID1="35">
+    <vertices>
+      <vertex X="174.771686" Y="-36.860869"/>
+      <vertex X="174.771735" Y="-36.860556"/>
+      <vertex X="174.771747" Y="-36.860486"/>
+      <vertex X="174.771949" Y="-36.860006"/>
+      <vertex X="174.771972" Y="-36.859972"/>
+      <vertex X="174.772085" Y="-36.859815"/>
+      <vertex X="174.772274" Y="-36.859625"/>
+      <vertex X="174.772397" Y="-36.859522"/>
+      <vertex X="174.772529" Y="-36.859425"/>
+      <vertex X="174.772670" Y="-36.859344"/>
+      <vertex X="174.773031" Y="-36.859209"/>
+      <vertex X="174.773325" Y="-36.859123"/>
+      <vertex X="174.773592" Y="-36.859043"/>
+      <vertex X="174.773705" Y="-36.859018"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="35" ADD_L_DIR="1" ADD_L_MAX="76" ADD_L_MIN="70" ADD_L_TYPE="E" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SALE STREET" ID="19" ISLAND="North Island" NAME="SALE ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63657" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Freemans Bay" TOWN="Auckland" TURNRESLNK="ak18" URBANRURAL="U" ID1="36">
+    <vertices>
+      <vertex X="174.755025" Y="-36.849591"/>
+      <vertex X="174.754814" Y="-36.849627"/>
+      <vertex X="174.754580" Y="-36.849690"/>
+      <vertex X="174.754515" Y="-36.849738"/>
+      <vertex X="174.754489" Y="-36.849789"/>
+      <vertex X="174.754489" Y="-36.849846"/>
+      <vertex X="174.754505" Y="-36.849907"/>
+      <vertex X="174.754562" Y="-36.849995"/>
+      <vertex X="174.754712" Y="-36.850189"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="36" ADD_L_DIR="-1" ADD_L_MAX="47" ADD_L_MIN="31" ADD_L_TYPE="O" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SALE STREET" ID="20" ISLAND="North Island" NAME="SALE ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63657" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Freemans Bay" TOWN="Auckland" TURNRESLNK="ak19" URBANRURAL="U" ID1="37">
+    <vertices>
+      <vertex X="174.753766" Y="-36.849635"/>
+      <vertex X="174.753836" Y="-36.849684"/>
+      <vertex X="174.753920" Y="-36.849716"/>
+      <vertex X="174.753985" Y="-36.849723"/>
+      <vertex X="174.755015" Y="-36.849549"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="37" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="22" ADD_R_MIN="22" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DUNLOP LANE" ID="21" ISLAND="North Island" NAME="DUNLOP LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63651" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Panmure" TOWN="Auckland" TURNRESLNK="ak20" URBANRURAL="U" ID1="38">
+    <vertices>
+      <vertex X="174.851563" Y="-36.898649"/>
+      <vertex X="174.851600" Y="-36.898659"/>
+      <vertex X="174.854052" Y="-36.899122"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="38" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="KORMA LANE" ID="22" ISLAND="North Island" NAME="KORMA LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63650" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Panmure" TOWN="Auckland" TURNRESLNK="ak21" URBANRURAL="U" ID1="39">
+    <vertices>
+      <vertex X="174.853639" Y="-36.899839"/>
+      <vertex X="174.853685" Y="-36.899839"/>
+      <vertex X="174.853737" Y="-36.899847"/>
+      <vertex X="174.854524" Y="-36.900038"/>
+      <vertex X="174.854544" Y="-36.900065"/>
+      <vertex X="174.854302" Y="-36.900260"/>
+      <vertex X="174.854560" Y="-36.900441"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="39" ADD_L_DIR="-1" ADD_L_MAX="15" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Manukau City" FULL_NAME="FULTON CRESCENT" ID="23" ISLAND="North Island" NAME="FULTON CRES" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63649" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Otara" TOWN="Manukau" TURNRESLNK="ak22" URBANRURAL="U" ID1="40">
+    <vertices>
+      <vertex X="174.873543" Y="-36.962569"/>
+      <vertex X="174.873564" Y="-36.962848"/>
+      <vertex X="174.873522" Y="-36.962913"/>
+      <vertex X="174.873430" Y="-36.962932"/>
+      <vertex X="174.872717" Y="-36.962731"/>
+      <vertex X="174.872602" Y="-36.962681"/>
+      <vertex X="174.872539" Y="-36.962627"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="40" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="BOLLARD AVENUE" ID="24" ISLAND="North Island" NAME="BOLLARD AVE" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="0" OWNERSHIP="0" RC="6" RD_SEG_LNK="63647" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="2" SUBURB="One Tree Hill" TOWN="Auckland" TURNRESLNK="ak23" URBANRURAL="U" ID1="41">
+    <vertices>
+      <vertex X="174.787861" Y="-36.902871"/>
+      <vertex X="174.788213" Y="-36.903178"/>
+      <vertex X="174.788414" Y="-36.903353"/>
+      <vertex X="174.788708" Y="-36.903665"/>
+      <vertex X="174.788835" Y="-36.903807"/>
+      <vertex X="174.788923" Y="-36.903984"/>
+      <vertex X="174.788965" Y="-36.904094"/>
+      <vertex X="174.788972" Y="-36.904131"/>
+      <vertex X="174.789040" Y="-36.904486"/>
+      <vertex X="174.789094" Y="-36.904569"/>
+      <vertex X="174.789159" Y="-36.904644"/>
+      <vertex X="174.789621" Y="-36.904889"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="41" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="BOLLARD AVENUE" ID="25" ISLAND="North Island" NAME="BOLLARD AVE" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="6" RD_SEG_LNK="63647" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="One Tree Hill" TOWN="Auckland" TURNRESLNK="ak24" URBANRURAL="U" ID1="42">
+    <vertices>
+      <vertex X="174.786526" Y="-36.902359"/>
+      <vertex X="174.786637" Y="-36.902407"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="42" ADD_L_DIR="1" ADD_L_MAX="34" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="41" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="HONEYSUCKLE LANE" ID="26" ISLAND="North Island" NAME="HONEYSUCKLE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63646" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Mairangi Bay" TOWN="North Shore" TURNRESLNK="ak25" URBANRURAL="U" ID1="43">
+    <vertices>
+      <vertex X="174.741128" Y="-36.736259"/>
+      <vertex X="174.741358" Y="-36.736481"/>
+      <vertex X="174.741422" Y="-36.736503"/>
+      <vertex X="174.741459" Y="-36.736506"/>
+      <vertex X="174.742485" Y="-36.736318"/>
+      <vertex X="174.742653" Y="-36.736325"/>
+      <vertex X="174.744429" Y="-36.736584"/>
+      <vertex X="174.744678" Y="-36.736644"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="43" ADD_L_DIR="1" ADD_L_MAX="47" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="1" ADD_R_MAX="42" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="PALLISER LANE" ID="27" ISLAND="North Island" NAME="PALLISER LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63643" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Browns Bay" TOWN="North Shore" TURNRESLNK="ak26" URBANRURAL="U" ID1="44">
+    <vertices>
+      <vertex X="174.728908" Y="-36.723964"/>
+      <vertex X="174.728860" Y="-36.724225"/>
+      <vertex X="174.728827" Y="-36.724343"/>
+      <vertex X="174.728794" Y="-36.724425"/>
+      <vertex X="174.728743" Y="-36.724477"/>
+      <vertex X="174.728285" Y="-36.724653"/>
+      <vertex X="174.727985" Y="-36.724765"/>
+      <vertex X="174.727794" Y="-36.724862"/>
+      <vertex X="174.727023" Y="-36.725360"/>
+      <vertex X="174.726975" Y="-36.725391"/>
+      <vertex X="174.726550" Y="-36.725542"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="44" ADD_L_DIR="1" ADD_L_MAX="43" ADD_L_MIN="33" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="44" ADD_R_MIN="36" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="BERENICE LANE" ID="67" ISLAND="North Island" NAME="BERENICE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63642" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Coatesville" TOWN="" TURNRESLNK="ak93" URBANRURAL="R" ID1="45">
+    <vertices>
+      <vertex X="174.609999" Y="-36.735115"/>
+      <vertex X="174.610605" Y="-36.734742"/>
+      <vertex X="174.613196" Y="-36.734630"/>
+      <vertex X="174.613911" Y="-36.734341"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="45" ADD_L_DIR="1" ADD_L_MAX="22" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="27" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="MARTIN JUGUM LANE" ID="68" ISLAND="North Island" NAME="MARTIN JUGUM LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63641" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Ranui" TOWN="Waitakere" TURNRESLNK="ak94" URBANRURAL="U" ID1="46">
+    <vertices>
+      <vertex X="174.607807" Y="-36.866540"/>
+      <vertex X="174.607892" Y="-36.866638"/>
+      <vertex X="174.608251" Y="-36.866944"/>
+      <vertex X="174.608487" Y="-36.867111"/>
+      <vertex X="174.608763" Y="-36.867248"/>
+      <vertex X="174.609359" Y="-36.867418"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="46" ADD_L_DIR="1" ADD_L_MAX="10" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="19" ADD_R_MIN="3" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="SUMMERFIELD LANE" ID="69" ISLAND="North Island" NAME="SUMMERFIELD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63640" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Albany" TOWN="North Shore" TURNRESLNK="ak95" URBANRURAL="U" ID1="47">
+    <vertices>
+      <vertex X="174.691313" Y="-36.734866"/>
+      <vertex X="174.690747" Y="-36.734736"/>
+      <vertex X="174.689931" Y="-36.734486"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="47" ADD_L_DIR="1" ADD_L_MAX="45" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="48" ADD_R_MIN="4" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="DYSART LANE" ID="70" ISLAND="North Island" NAME="DYSART LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63638" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Kumeu" TOWN="" TURNRESLNK="ak96" URBANRURAL="R" ID1="48">
+    <vertices>
+      <vertex X="174.540356" Y="-36.798417"/>
+      <vertex X="174.542820" Y="-36.794720"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="48" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="69" ADD_R_MIN="69" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="CHERRY BLOSSOM LANE" ID="71" ISLAND="North Island" NAME="CHERRY BLOSSOM LN" NAMED_AREA="" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63637" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Te Pua" TOWN="" TURNRESLNK="ak97" URBANRURAL="R" ID1="49">
+    <vertices>
+      <vertex X="174.408949" Y="-36.683874"/>
+      <vertex X="174.408647" Y="-36.684589"/>
+      <vertex X="174.408495" Y="-36.684653"/>
+      <vertex X="174.408054" Y="-36.684705"/>
+      <vertex X="174.407883" Y="-36.684785"/>
+      <vertex X="174.407781" Y="-36.684957"/>
+      <vertex X="174.407799" Y="-36.685343"/>
+      <vertex X="174.409682" Y="-36.689106"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="49" ADD_L_DIR="1" ADD_L_MAX="51" ADD_L_MIN="23" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="61" ADD_R_MIN="34" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="PIONEER LANE" ID="72" ISLAND="North Island" NAME="PIONEER LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63636" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Taupaki" TOWN="" TURNRESLNK="ak98" URBANRURAL="R" ID1="50">
+    <vertices>
+      <vertex X="174.521642" Y="-36.811908"/>
+      <vertex X="174.520775" Y="-36.812576"/>
+      <vertex X="174.519719" Y="-36.812978"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="50" ADD_L_DIR="1" ADD_L_MAX="81" ADD_L_MIN="45" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="82" ADD_R_MIN="50" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="ROSS LANE" ID="73" ISLAND="North Island" NAME="ROSS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63634" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Huapai" TOWN="" TURNRESLNK="ak99" URBANRURAL="R" ID1="51">
+    <vertices>
+      <vertex X="174.513874" Y="-36.792036"/>
+      <vertex X="174.509156" Y="-36.793528"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="51" ADD_L_DIR="1" ADD_L_MAX="25" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="41" ADD_R_MIN="2" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="SARAH TODD LANE" ID="74" ISLAND="North Island" NAME="SARAH TODD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63632" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Waimauku" TOWN="" TURNRESLNK="ak100" URBANRURAL="R" ID1="52">
+    <vertices>
+      <vertex X="174.491722" Y="-36.769882"/>
+      <vertex X="174.492339" Y="-36.770018"/>
+      <vertex X="174.492473" Y="-36.770058"/>
+      <vertex X="174.492585" Y="-36.770108"/>
+      <vertex X="174.492673" Y="-36.770145"/>
+      <vertex X="174.492751" Y="-36.770176"/>
+      <vertex X="174.492872" Y="-36.770220"/>
+      <vertex X="174.492974" Y="-36.770252"/>
+      <vertex X="174.493106" Y="-36.770287"/>
+      <vertex X="174.493237" Y="-36.770311"/>
+      <vertex X="174.493256" Y="-36.770314"/>
+      <vertex X="174.493276" Y="-36.770317"/>
+      <vertex X="174.493376" Y="-36.770323"/>
+      <vertex X="174.493492" Y="-36.770329"/>
+      <vertex X="174.493583" Y="-36.770329"/>
+      <vertex X="174.493612" Y="-36.770329"/>
+      <vertex X="174.493742" Y="-36.770330"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="52" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="44" ADD_R_MIN="6" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="POYNTER LANE" ID="75" ISLAND="North Island" NAME="POYNTER LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63631" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Pine Valley" TOWN="" TURNRESLNK="ak101" URBANRURAL="R" ID1="53">
+    <vertices>
+      <vertex X="174.626114" Y="-36.630809"/>
+      <vertex X="174.625650" Y="-36.630147"/>
+      <vertex X="174.624725" Y="-36.628828"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="53" ADD_L_DIR="1" ADD_L_MAX="40" ADD_L_MIN="14" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="22" ADD_R_MIN="22" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="PETERS LANE" ID="76" ISLAND="North Island" NAME="PETERS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63630" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Taupaki" TOWN="" TURNRESLNK="ak102" URBANRURAL="R" ID1="54">
+    <vertices>
+      <vertex X="174.536625" Y="-36.824937"/>
+      <vertex X="174.536109" Y="-36.823184"/>
+      <vertex X="174.534002" Y="-36.822798"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="54" ADD_L_DIR="1" ADD_L_MAX="10" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="15" ADD_R_MIN="11" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SIMMONDS LANE" ID="77" ISLAND="North Island" NAME="SIMMONDS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63628" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Mount Wellington" TOWN="Auckland" TURNRESLNK="ak103" URBANRURAL="U" ID1="55">
+    <vertices>
+      <vertex X="174.837888" Y="-36.905740"/>
+      <vertex X="174.837440" Y="-36.905565"/>
+      <vertex X="174.837366" Y="-36.905529"/>
+      <vertex X="174.837323" Y="-36.905485"/>
+      <vertex X="174.837285" Y="-36.905432"/>
+      <vertex X="174.837190" Y="-36.905230"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="55" ADD_L_DIR="1" ADD_L_MAX="19" ADD_L_MIN="8" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="7" ADD_R_MIN="1" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MARINE LANE" ID="78" ISLAND="North Island" NAME="MARINE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63627" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Panmure" TOWN="Auckland" TURNRESLNK="ak104" URBANRURAL="U" ID1="56">
+    <vertices>
+      <vertex X="174.851022" Y="-36.908243"/>
+      <vertex X="174.851100" Y="-36.908210"/>
+      <vertex X="174.851197" Y="-36.908185"/>
+      <vertex X="174.851424" Y="-36.908187"/>
+      <vertex X="174.851546" Y="-36.908196"/>
+      <vertex X="174.851632" Y="-36.908223"/>
+      <vertex X="174.851696" Y="-36.908275"/>
+      <vertex X="174.851731" Y="-36.908333"/>
+      <vertex X="174.851739" Y="-36.908399"/>
+      <vertex X="174.851736" Y="-36.908488"/>
+      <vertex X="174.851734" Y="-36.908601"/>
+      <vertex X="174.851747" Y="-36.908698"/>
+      <vertex X="174.851787" Y="-36.908818"/>
+      <vertex X="174.851886" Y="-36.909043"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="56" ADD_L_DIR="1" ADD_L_MAX="8" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="-1" ADD_R_MAX="12" ADD_R_MIN="10" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="CONVAMORE LANE" ID="79" ISLAND="North Island" NAME="CONVAMORE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="0" OWNERSHIP="1" RC="6" RD_SEG_LNK="63626" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Mount Wellington" TOWN="Auckland" TURNRESLNK="ak105" URBANRURAL="U" ID1="57">
+    <vertices>
+      <vertex X="174.850544" Y="-36.909363"/>
+      <vertex X="174.850607" Y="-36.908479"/>
+      <vertex X="174.850588" Y="-36.908421"/>
+      <vertex X="174.850526" Y="-36.908385"/>
+      <vertex X="174.850149" Y="-36.908363"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="57" ADD_L_DIR="-1" ADD_L_MAX="53" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="24" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="CONVOY LANE" ID="80" ISLAND="North Island" NAME="CONVOY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63625" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Otahuhu" TOWN="Auckland" TURNRESLNK="ak106" URBANRURAL="U" ID1="58">
+    <vertices>
+      <vertex X="174.854789" Y="-36.932748"/>
+      <vertex X="174.854754" Y="-36.933246"/>
+      <vertex X="174.854574" Y="-36.935832"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="58" ADD_L_DIR="-1" ADD_L_MAX="6" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="-1" ADD_R_MAX="11" ADD_R_MIN="1" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MELODY LANE" ID="81" ISLAND="North Island" NAME="MELODY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63624" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Otahuhu" TOWN="Auckland" TURNRESLNK="ak107" URBANRURAL="U" ID1="59">
+    <vertices>
+      <vertex X="174.853044" Y="-36.945118"/>
+      <vertex X="174.853225" Y="-36.945157"/>
+      <vertex X="174.853855" Y="-36.945035"/>
+      <vertex X="174.853956" Y="-36.944992"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="59" ADD_L_DIR="1" ADD_L_MAX="4" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="8" ADD_R_MIN="5" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="DEBORAH HATTON LANE" ID="82" ISLAND="North Island" NAME="DEBORAH HATTON LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="0" OWNERSHIP="1" RC="6" RD_SEG_LNK="63616" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Otahuhu" TOWN="Auckland" TURNRESLNK="ak108" URBANRURAL="U" ID1="60">
+    <vertices>
+      <vertex X="174.849189" Y="-36.930396"/>
+      <vertex X="174.849748" Y="-36.930387"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="60" ADD_L_DIR="-1" ADD_L_MAX="71" ADD_L_MIN="69" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="78" ADD_R_MIN="70" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="WOLVERTON STREET" ID="124" ISLAND="North Island" NAME="WOLVERTON ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="2" RD_SEG_LNK="63615" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Avondale" TOWN="Auckland" TURNRESLNK="ak254" URBANRURAL="U" ID1="61">
+    <vertices>
+      <vertex X="174.695523" Y="-36.909057"/>
+      <vertex X="174.696334" Y="-36.908654"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="61" ADD_L_DIR="1" ADD_L_MAX="13" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="33" ADD_R_MIN="17" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="COTSWOLD LANE" ID="51" ISLAND="North Island" NAME="COTSWOLD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63614" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Mount Wellington" TOWN="Auckland" TURNRESLNK="ak53" URBANRURAL="U" ID1="62">
+    <vertices>
+      <vertex X="174.823371" Y="-36.911283"/>
+      <vertex X="174.823512" Y="-36.911226"/>
+      <vertex X="174.824201" Y="-36.911003"/>
+      <vertex X="174.824304" Y="-36.910974"/>
+      <vertex X="174.824402" Y="-36.910955"/>
+      <vertex X="174.824497" Y="-36.910945"/>
+      <vertex X="174.824604" Y="-36.910939"/>
+      <vertex X="174.824727" Y="-36.910939"/>
+      <vertex X="174.824982" Y="-36.910949"/>
+      <vertex X="174.825108" Y="-36.910949"/>
+      <vertex X="174.825223" Y="-36.910943"/>
+      <vertex X="174.825305" Y="-36.910933"/>
+      <vertex X="174.825411" Y="-36.910905"/>
+      <vertex X="174.825519" Y="-36.910858"/>
+      <vertex X="174.825621" Y="-36.910806"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="62" ADD_L_DIR="1" ADD_L_MAX="14" ADD_L_MIN="4" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="13" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="LEASIDE LANE" ID="52" ISLAND="North Island" NAME="LEASIDE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63613" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glen Innes" TOWN="Auckland" TURNRESLNK="ak54" URBANRURAL="U" ID1="63">
+    <vertices>
+      <vertex X="174.866100" Y="-36.874944"/>
+      <vertex X="174.864949" Y="-36.874544"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="63" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="-1" ADD_R_MAX="4" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="HORNES LANE" ID="53" ISLAND="North Island" NAME="HORNES LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63612" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Onehunga" TOWN="Auckland" TURNRESLNK="ak55" URBANRURAL="U" ID1="64">
+    <vertices>
+      <vertex X="174.776373" Y="-36.922343"/>
+      <vertex X="174.776316" Y="-36.922307"/>
+      <vertex X="174.775964" Y="-36.922240"/>
+      <vertex X="174.775859" Y="-36.922257"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="64" ADD_L_DIR="1" ADD_L_MAX="1" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="LOWER MUNICIPAL PLACE" ID="54" ISLAND="North Island" NAME="LOWER MUNICIPAL PL" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63611" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Onehunga" TOWN="Auckland" TURNRESLNK="ak56" URBANRURAL="U" ID1="65">
+    <vertices>
+      <vertex X="174.783876" Y="-36.923053"/>
+      <vertex X="174.784036" Y="-36.924250"/>
+      <vertex X="174.784055" Y="-36.924297"/>
+      <vertex X="174.784084" Y="-36.924341"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="65" ADD_L_DIR="-1" ADD_L_MAX="11" ADD_L_MIN="3" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="10" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="TYNOR PLACE" ID="55" ISLAND="North Island" NAME="TYNOR PL" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63610" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Hillsborough" TOWN="Auckland" TURNRESLNK="ak57" URBANRURAL="U" ID1="66">
+    <vertices>
+      <vertex X="174.760577" Y="-36.923815"/>
+      <vertex X="174.760323" Y="-36.923977"/>
+      <vertex X="174.759957" Y="-36.924341"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="66" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="UPPER MUNICIPAL PLACE" ID="56" ISLAND="North Island" NAME="UPPER MUNICIPAL PL" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63609" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Onehunga" TOWN="Auckland" TURNRESLNK="ak58" URBANRURAL="U" ID1="67">
+    <vertices>
+      <vertex X="174.784562" Y="-36.922991"/>
+      <vertex X="174.784745" Y="-36.924290"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="67" ADD_L_DIR="1" ADD_L_MAX="18" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="11" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="GEORGE LAURENSON LANE" ID="57" ISLAND="North Island" NAME="GEORGE LAURENSON LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63608" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Waikowhai" TOWN="Auckland" TURNRESLNK="ak59" URBANRURAL="U" ID1="68">
+    <vertices>
+      <vertex X="174.732340" Y="-36.932485"/>
+      <vertex X="174.732194" Y="-36.932424"/>
+      <vertex X="174.732039" Y="-36.932357"/>
+      <vertex X="174.731943" Y="-36.932310"/>
+      <vertex X="174.731750" Y="-36.932199"/>
+      <vertex X="174.731692" Y="-36.932171"/>
+      <vertex X="174.731617" Y="-36.932139"/>
+      <vertex X="174.731547" Y="-36.932113"/>
+      <vertex X="174.731478" Y="-36.932081"/>
+      <vertex X="174.731427" Y="-36.932047"/>
+      <vertex X="174.731401" Y="-36.932005"/>
+      <vertex X="174.731383" Y="-36.931948"/>
+      <vertex X="174.731360" Y="-36.931834"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="68" ADD_L_DIR="-1" ADD_L_MAX="41" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="43" ADD_R_MIN="2" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="DANUBE LANE" ID="58" ISLAND="North Island" NAME="DANUBE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63607" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glen Eden" TOWN="Waitakere" TURNRESLNK="ak60" URBANRURAL="U" ID1="69">
+    <vertices>
+      <vertex X="174.631432" Y="-36.918479"/>
+      <vertex X="174.631385" Y="-36.918487"/>
+      <vertex X="174.630877" Y="-36.918290"/>
+      <vertex X="174.629824" Y="-36.917887"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="69" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="BAKERS LANE" ID="59" ISLAND="North Island" NAME="BAKERS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63606" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Whenuapai" TOWN="" TURNRESLNK="ak61" URBANRURAL="R" ID1="70">
+    <vertices>
+      <vertex X="174.602054" Y="-36.822786"/>
+      <vertex X="174.604625" Y="-36.820273"/>
+      <vertex X="174.604716" Y="-36.820154"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="70" ADD_L_DIR="1" ADD_L_MAX="8" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="11" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="RUBENS LANE" ID="60" ISLAND="North Island" NAME="RUBENS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63605" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="West Harbour" TOWN="Waitakere" TURNRESLNK="ak62" URBANRURAL="U" ID1="71">
+    <vertices>
+      <vertex X="174.635083" Y="-36.821030"/>
+      <vertex X="174.634745" Y="-36.820963"/>
+      <vertex X="174.634522" Y="-36.821011"/>
+      <vertex X="174.634200" Y="-36.821064"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="71" ADD_L_DIR="1" ADD_L_MAX="4" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="3" ADD_R_MIN="3" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Waitakere City" FULL_NAME="SWAN LANE" ID="61" ISLAND="North Island" NAME="SWAN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63604" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Henderson" TOWN="Waitakere" TURNRESLNK="ak63" URBANRURAL="U" ID1="72">
+    <vertices>
+      <vertex X="174.637982" Y="-36.870826"/>
+      <vertex X="174.637337" Y="-36.871554"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="72" ADD_L_DIR="-1" ADD_L_MAX="9" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="8" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="BASIN VIEW LANE" ID="62" ISLAND="North Island" NAME="BASIN VIEW LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63602" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Panmure" TOWN="Auckland" TURNRESLNK="ak64" URBANRURAL="U" ID1="73">
+    <vertices>
+      <vertex X="174.854626" Y="-36.900384"/>
+      <vertex X="174.855122" Y="-36.899952"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="73" ADD_L_DIR="-1" ADD_L_MAX="15" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="16" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="GLENTIES LANE" ID="63" ISLAND="North Island" NAME="GLENTIES LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63601" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Ellerslie" TOWN="Auckland" TURNRESLNK="ak65" URBANRURAL="U" ID1="74">
+    <vertices>
+      <vertex X="174.823038" Y="-36.889889"/>
+      <vertex X="174.823083" Y="-36.889757"/>
+      <vertex X="174.823292" Y="-36.889157"/>
+      <vertex X="174.823300" Y="-36.889114"/>
+      <vertex X="174.823301" Y="-36.889071"/>
+      <vertex X="174.823295" Y="-36.889021"/>
+      <vertex X="174.823238" Y="-36.888703"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="74" ADD_L_DIR="1" ADD_L_MAX="24" ADD_L_MIN="24" ADD_L_TYPE="E" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MERCURY LANE" ID="8" ISLAND="North Island" NAME="MERCURY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="3" RD_SEG_LNK="63668" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Newton" TOWN="Auckland" TURNRESLNK="ak7" URBANRURAL="U" ID1="75">
+    <vertices>
+      <vertex X="174.759225" Y="-36.858848"/>
+      <vertex X="174.759338" Y="-36.859103"/>
+      <vertex X="174.759415" Y="-36.859210"/>
+      <vertex X="174.759542" Y="-36.859290"/>
+      <vertex X="174.759672" Y="-36.859371"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="75" ADD_L_DIR="1" ADD_L_MAX="1" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="12" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SAINT MARTINS LANE" ID="9" ISLAND="North Island" NAME="ST MARTINS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63600" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak8" URBANRURAL="U" ID1="76">
+    <vertices>
+      <vertex X="174.764743" Y="-36.857990"/>
+      <vertex X="174.765292" Y="-36.857534"/>
+      <vertex X="174.764862" Y="-36.857203"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="76" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MARKET LANE" ID="10" ISLAND="North Island" NAME="MARKET LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63599" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak9" URBANRURAL="U" ID1="77">
+    <vertices>
+      <vertex X="174.762109" Y="-36.844683"/>
+      <vertex X="174.762082" Y="-36.844587"/>
+      <vertex X="174.762074" Y="-36.844527"/>
+      <vertex X="174.762076" Y="-36.844486"/>
+      <vertex X="174.762089" Y="-36.844443"/>
+      <vertex X="174.762166" Y="-36.844249"/>
+      <vertex X="174.762278" Y="-36.843958"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="77" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MARKET LANE" ID="11" ISLAND="North Island" NAME="MARKET LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63599" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak10" URBANRURAL="U" ID1="78">
+    <vertices>
+      <vertex X="174.762278" Y="-36.843958"/>
+      <vertex X="174.762447" Y="-36.843521"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="78" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="BRADNOR LANE" ID="12" ISLAND="North Island" NAME="BRADNOR LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63598" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Auckland City Centre" TOWN="Auckland" TURNRESLNK="ak11" URBANRURAL="U" ID1="79">
+    <vertices>
+      <vertex X="174.761602" Y="-36.845360"/>
+      <vertex X="174.761611" Y="-36.845392"/>
+      <vertex X="174.761629" Y="-36.845423"/>
+      <vertex X="174.761650" Y="-36.845446"/>
+      <vertex X="174.761692" Y="-36.845467"/>
+      <vertex X="174.762667" Y="-36.845767"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="79" ADD_L_DIR="1" ADD_L_MAX="14" ADD_L_MIN="4" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="15" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="SAINT THOMAS MORE LANE" ID="163" ISLAND="North Island" NAME="ST THOMAS MORE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63597" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glenfield" TOWN="North Shore" TURNRESLNK="ak146" URBANRURAL="U" ID1="80">
+    <vertices>
+      <vertex X="174.721762" Y="-36.770566"/>
+      <vertex X="174.722295" Y="-36.770628"/>
+      <vertex X="174.722843" Y="-36.771146"/>
+      <vertex X="174.722944" Y="-36.771241"/>
+      <vertex X="174.723064" Y="-36.771246"/>
+      <vertex X="174.723102" Y="-36.771201"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="80" ADD_L_DIR="1" ADD_L_MAX="28" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="11" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="TYBURN LANE" ID="164" ISLAND="North Island" NAME="TYBURN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63596" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Unsworth Heights" TOWN="North Shore" TURNRESLNK="ak147" URBANRURAL="U" ID1="81">
+    <vertices>
+      <vertex X="174.713292" Y="-36.759233"/>
+      <vertex X="174.713272" Y="-36.759544"/>
+      <vertex X="174.712937" Y="-36.759900"/>
+      <vertex X="174.712843" Y="-36.759922"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="81" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="ROSEBERRY LANE" ID="165" ISLAND="North Island" NAME="ROSEBERRY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63594" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Birkenhead" TOWN="North Shore" TURNRESLNK="ak148" URBANRURAL="U" ID1="82">
+    <vertices>
+      <vertex X="174.714800" Y="-36.809357"/>
+      <vertex X="174.715762" Y="-36.809337"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="82" ADD_L_DIR="1" ADD_L_MAX="14" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="11" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="PELICAN LANE" ID="166" ISLAND="North Island" NAME="PELICAN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63593" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="The Palms" TOWN="North Shore" TURNRESLNK="ak149" URBANRURAL="U" ID1="83">
+    <vertices>
+      <vertex X="174.716272" Y="-36.760730"/>
+      <vertex X="174.716504" Y="-36.760433"/>
+      <vertex X="174.716575" Y="-36.760095"/>
+      <vertex X="174.716642" Y="-36.760028"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="83" ADD_L_DIR="1" ADD_L_MAX="89" ADD_L_MIN="21" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="86" ADD_R_MIN="6" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="CROFT LANE" ID="167" ISLAND="North Island" NAME="CROFT LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63592" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Coatesville" TOWN="" TURNRESLNK="ak150" URBANRURAL="R" ID1="84">
+    <vertices>
+      <vertex X="174.608952" Y="-36.730269"/>
+      <vertex X="174.608998" Y="-36.728435"/>
+      <vertex X="174.611995" Y="-36.727512"/>
+      <vertex X="174.614542" Y="-36.727276"/>
+      <vertex X="174.616560" Y="-36.726837"/>
+      <vertex X="174.616910" Y="-36.726860"/>
+      <vertex X="174.617176" Y="-36.726997"/>
+      <vertex X="174.617228" Y="-36.727194"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="84" ADD_L_DIR="-1" ADD_L_MAX="7" ADD_L_MIN="5" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="4" ADD_R_MIN="1" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="LOGAN LANE" ID="168" ISLAND="North Island" NAME="LOGAN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="HIBISCUS COAST" NAMED_ARE2="WHANGAPARAOA PENINSULA" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63591" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Stanmore Bay" TOWN="Whangaparaoa" TURNRESLNK="ak151" URBANRURAL="U" ID1="85">
+    <vertices>
+      <vertex X="174.721974" Y="-36.620861"/>
+      <vertex X="174.722470" Y="-36.620454"/>
+      <vertex X="174.722548" Y="-36.620444"/>
+      <vertex X="174.722624" Y="-36.620466"/>
+      <vertex X="174.722668" Y="-36.620511"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="85" ADD_L_DIR="-1" ADD_L_MAX="18" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="-1" ADD_R_MAX="37" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="BAKEHOUSE LANE" ID="169" ISLAND="North Island" NAME="BAKEHOUSE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="HIBISCUS COAST" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63589" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Orewa" TOWN="Orewa" TURNRESLNK="ak152" URBANRURAL="U" ID1="86">
+    <vertices>
+      <vertex X="174.695998" Y="-36.587363"/>
+      <vertex X="174.695576" Y="-36.586401"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="86" ADD_L_DIR="1" ADD_L_MAX="81" ADD_L_MIN="31" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="88" ADD_R_MIN="44" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="BURNS LANE" ID="170" ISLAND="North Island" NAME="BURNS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="0" OWNERSHIP="1" RC="6" RD_SEG_LNK="63588" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Kumeu" TOWN="" TURNRESLNK="ak153" URBANRURAL="R" ID1="87">
+    <vertices>
+      <vertex X="174.556592" Y="-36.765629"/>
+      <vertex X="174.556029" Y="-36.765517"/>
+      <vertex X="174.555933" Y="-36.765481"/>
+      <vertex X="174.555869" Y="-36.765424"/>
+      <vertex X="174.551561" Y="-36.761151"/>
+      <vertex X="174.551470" Y="-36.761049"/>
+      <vertex X="174.551412" Y="-36.760920"/>
+      <vertex X="174.551402" Y="-36.760817"/>
+      <vertex X="174.551403" Y="-36.760670"/>
+      <vertex X="174.551464" Y="-36.760087"/>
+      <vertex X="174.551439" Y="-36.759710"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="87" ADD_L_DIR="1" ADD_L_MAX="60" ADD_L_MIN="15" ADD_L_TYPE="M" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Rodney" FULL_NAME="GOLDFLATS LANE" ID="171" ISLAND="North Island" NAME="GOLDFLATS LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63587" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Coatesville" TOWN="" TURNRESLNK="ak154" URBANRURAL="R" ID1="88">
+    <vertices>
+      <vertex X="174.623641" Y="-36.733450"/>
+      <vertex X="174.625973" Y="-36.736026"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="88" ADD_L_DIR="1" ADD_L_MAX="14" ADD_L_MIN="2" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="9" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="FALSTONE LANE" ID="172" ISLAND="North Island" NAME="FALSTONE LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63586" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Browns Bay" TOWN="North Shore" TURNRESLNK="ak155" URBANRURAL="U" ID1="89">
+    <vertices>
+      <vertex X="174.726189" Y="-36.721564"/>
+      <vertex X="174.725102" Y="-36.721261"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="89" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="53" ADD_R_MIN="53" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="PENCARROW AVENUE" ID="132" ISLAND="North Island" NAME="PENCARROW AVE" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63585" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Epsom" TOWN="Auckland" TURNRESLNK="ak115" URBANRURAL="U" ID1="90">
+    <vertices>
+      <vertex X="174.766126" Y="-36.889163"/>
+      <vertex X="174.766231" Y="-36.889204"/>
+      <vertex X="174.766327" Y="-36.889264"/>
+      <vertex X="174.766614" Y="-36.889485"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="90" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="17" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SELBY SQUARE" ID="133" ISLAND="North Island" NAME="SELBY SQ" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63583" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Saint Marys Bay" TOWN="Auckland" TURNRESLNK="ak116" URBANRURAL="U" ID1="91">
+    <vertices>
+      <vertex X="174.743485" Y="-36.845338"/>
+      <vertex X="174.743746" Y="-36.845500"/>
+      <vertex X="174.743776" Y="-36.845513"/>
+      <vertex X="174.743803" Y="-36.845518"/>
+      <vertex X="174.743826" Y="-36.845516"/>
+      <vertex X="174.743846" Y="-36.845512"/>
+      <vertex X="174.743862" Y="-36.845501"/>
+      <vertex X="174.743880" Y="-36.845484"/>
+      <vertex X="174.744105" Y="-36.845225"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="91" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="UNION STREET" ID="134" ISLAND="North Island" NAME="UNION ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63565" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Freemans Bay" TOWN="Auckland" TURNRESLNK="ak117" URBANRURAL="U" ID1="92">
+    <vertices>
+      <vertex X="174.754498" Y="-36.850543"/>
+      <vertex X="174.754557" Y="-36.850419"/>
+      <vertex X="174.754610" Y="-36.850378"/>
+      <vertex X="174.754695" Y="-36.850346"/>
+      <vertex X="174.754819" Y="-36.850324"/>
+      <vertex X="174.754952" Y="-36.850328"/>
+      <vertex X="174.755257" Y="-36.850394"/>
+      <vertex X="174.755372" Y="-36.850419"/>
+      <vertex X="174.755711" Y="-36.850433"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="92" ADD_L_DIR="1" ADD_L_MAX="10" ADD_L_MIN="6" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="9" ADD_R_MIN="1" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="YARBOROUGH STREET" ID="136" ISLAND="North Island" NAME="YARBOROUGH ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63562" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Saint Marys Bay" TOWN="Auckland" TURNRESLNK="ak119" URBANRURAL="U" ID1="93">
+    <vertices>
+      <vertex X="174.745114" Y="-36.845546"/>
+      <vertex X="174.744105" Y="-36.845225"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="93" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="SULTAN LANE" ID="87" ISLAND="North Island" NAME="SULTAN LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63561" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Ellerslie" TOWN="Auckland" TURNRESLNK="ak68" URBANRURAL="U" ID1="94">
+    <vertices>
+      <vertex X="174.807469" Y="-36.898926"/>
+      <vertex X="174.807974" Y="-36.898539"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="94" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="-1" ADD_R_MAX="250" ADD_R_MIN="240" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="TANIWHA STREET" ID="88" ISLAND="North Island" NAME="TANIWHA ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63555" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glen Innes" TOWN="Auckland" TURNRESLNK="ak69" URBANRURAL="U" ID1="95">
+    <vertices>
+      <vertex X="174.854332" Y="-36.878091"/>
+      <vertex X="174.854497" Y="-36.878020"/>
+      <vertex X="174.854715" Y="-36.877982"/>
+      <vertex X="174.854783" Y="-36.877963"/>
+      <vertex X="174.854823" Y="-36.877941"/>
+      <vertex X="174.854855" Y="-36.877909"/>
+      <vertex X="174.854876" Y="-36.877874"/>
+      <vertex X="174.854887" Y="-36.877834"/>
+      <vertex X="174.854889" Y="-36.877777"/>
+      <vertex X="174.854877" Y="-36.877733"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="95" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="STRATTON LANE" ID="89" ISLAND="North Island" NAME="STRATTON LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63554" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glen Innes" TOWN="Auckland" TURNRESLNK="ak70" URBANRURAL="U" ID1="96">
+    <vertices>
+      <vertex X="174.855619" Y="-36.879355"/>
+      <vertex X="174.855667" Y="-36.879556"/>
+      <vertex X="174.855826" Y="-36.879538"/>
+      <vertex X="174.856320" Y="-36.879634"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="96" ADD_L_DIR="1" ADD_L_MAX="13" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="1" ADD_R_MAX="12" ADD_R_MIN="2" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="TOSCA LANE" ID="143" ISLAND="North Island" NAME="TOSCA LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63553" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Point England" TOWN="Auckland" TURNRESLNK="ak126" URBANRURAL="U" ID1="97">
+    <vertices>
+      <vertex X="174.860267" Y="-36.879043"/>
+      <vertex X="174.860411" Y="-36.879063"/>
+      <vertex X="174.861071" Y="-36.879128"/>
+      <vertex X="174.861522" Y="-36.879087"/>
+      <vertex X="174.861436" Y="-36.878624"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="97" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="655" ADD_R_MIN="649" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MANUKAU ROAD" ID="110" ISLAND="North Island" NAME="MANUKAU RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="2" RD_SEG_LNK="63549" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Royal Oak" TOWN="Auckland" TURNRESLNK="ak239" URBANRURAL="U" ID1="98">
+    <vertices>
+      <vertex X="174.774915" Y="-36.906935"/>
+      <vertex X="174.775106" Y="-36.907725"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="98" ADD_L_DIR="1" ADD_L_MAX="104" ADD_L_MIN="96" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="119" ADD_R_MIN="115" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="NEWTON ROAD" ID="111" ISLAND="North Island" NAME="NEWTON RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="2" RD_SEG_LNK="63548" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Newton" TOWN="Auckland" TURNRESLNK="ak240" URBANRURAL="U" ID1="99">
+    <vertices>
+      <vertex X="174.757389" Y="-36.862992"/>
+      <vertex X="174.757958" Y="-36.863119"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="99" ADD_L_DIR="-1" ADD_L_MAX="579" ADD_L_MIN="573" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="522" ADD_R_MIN="504" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="HILLSBOROUGH ROAD" ID="112" ISLAND="North Island" NAME="HILLSBOROUGH RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="1" RD_SEG_LNK="63535" REGION="Auckland" ROUTE="Urban Route 15" SH_NO="" SPEED="50" SR="0" SUBURB="Lynfield" TOWN="Auckland" TURNRESLNK="ak241" URBANRURAL="U" ID1="100">
+    <vertices>
+      <vertex X="174.724347" Y="-36.925631"/>
+      <vertex X="174.724459" Y="-36.925724"/>
+      <vertex X="174.724634" Y="-36.925874"/>
+      <vertex X="174.724825" Y="-36.926035"/>
+      <vertex X="174.725776" Y="-36.926815"/>
+      <vertex X="174.725870" Y="-36.926887"/>
+      <vertex X="174.725942" Y="-36.926940"/>
+      <vertex X="174.726110" Y="-36.927055"/>
+      <vertex X="174.726393" Y="-36.927246"/>
+      <vertex X="174.726496" Y="-36.927315"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="100" ADD_L_DIR="-1" ADD_L_MAX="7" ADD_L_MIN="1" ADD_L_TYPE="O" ADD_R_DIR="-1" ADD_R_MAX="12" ADD_R_MIN="2" ADD_R_TYPE="E" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="TRISTRAM AVENUE" ID="113" ISLAND="North Island" NAME="TRISTRAM AVE" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="1" RD_SEG_LNK="63534" REGION="Auckland" ROUTE="Urban Route 21" SH_NO="" SPEED="50" SR="0" SUBURB="Forrest Hill" TOWN="North Shore" TURNRESLNK="ak243" URBANRURAL="U" ID1="101">
+    <vertices>
+      <vertex X="174.747826" Y="-36.770445"/>
+      <vertex X="174.749219" Y="-36.770040"/>
+      <vertex X="174.749250" Y="-36.770034"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="101" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="1" ADD_R_MAX="659" ADD_R_MIN="657" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="MANUKAU ROAD" ID="114" ISLAND="North Island" NAME="MANUKAU RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="2" RD_SEG_LNK="63549" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Royal Oak" TOWN="Auckland" TURNRESLNK="ak244" URBANRURAL="U" ID1="102">
+    <vertices>
+      <vertex X="174.775106" Y="-36.907725"/>
+      <vertex X="174.775199" Y="-36.908106"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="102" ADD_L_DIR="1" ADD_L_MAX="118" ADD_L_MIN="108" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="127" ADD_R_MIN="121" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Auckland City" FULL_NAME="NEWTON ROAD" ID="115" ISLAND="North Island" NAME="NEWTON RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="2" RD_SEG_LNK="63548" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Newton" TOWN="Auckland" TURNRESLNK="ak245" URBANRURAL="U" ID1="103">
+    <vertices>
+      <vertex X="174.757958" Y="-36.863119"/>
+      <vertex X="174.758606" Y="-36.863259"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="103" ADD_L_DIR="-1" ADD_L_MAX="8" ADD_L_MIN="1" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="11" ADD_R_MIN="9" ADD_R_TYPE="O" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="CHERRY LANE" ID="33" ISLAND="North Island" NAME="CHERRY LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="0" OWNERSHIP="1" RC="6" RD_SEG_LNK="63533" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Glenfield" TOWN="North Shore" TURNRESLNK="ak33" URBANRURAL="U" ID1="104">
+    <vertices>
+      <vertex X="174.745740" Y="-36.780780"/>
+      <vertex X="174.744841" Y="-36.779979"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="104" ADD_L_DIR="1" ADD_L_MAX="14" ADD_L_MIN="5" ADD_L_TYPE="M" ADD_R_DIR="-1" ADD_R_MAX="4" ADD_R_MIN="1" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="North Shore City" FULL_NAME="ELDERWOOD LANE" ID="34" ISLAND="North Island" NAME="ELDERWOOD LN" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="4" RD_SEG_LNK="63526" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Belmont" TOWN="North Shore" TURNRESLNK="ak34" URBANRURAL="U" ID1="105">
+    <vertices>
+      <vertex X="174.785128" Y="-36.803494"/>
+      <vertex X="174.784406" Y="-36.803101"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="105" ADD_L_DIR="0" ADD_L_MAX="0" ADD_L_MIN="0" ADD_L_TYPE="" ADD_R_DIR="0" ADD_R_MAX="0" ADD_R_MIN="0" ADD_R_TYPE="" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Manukau City" FULL_NAME="WATFORD STREET" ID="229" ISLAND="North Island" NAME="WATFORD ST" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="5" RD_SEG_LNK="63522" REGION="Auckland" ROUTE="" SH_NO="" SPEED="50" SR="0" SUBURB="Otara" TOWN="Manukau" TURNRESLNK="ak210" URBANRURAL="U" ID1="106">
+    <vertices>
+      <vertex X="174.872745" Y="-36.960379"/>
+      <vertex X="174.872738" Y="-36.960413"/>
+      <vertex X="174.872731" Y="-36.960486"/>
+      <vertex X="174.872746" Y="-36.960670"/>
+    </vertices>
+  </shape>
+  <shape shapeType="polyLine" id="106" ADD_L_DIR="1" ADD_L_MAX="484" ADD_L_MIN="140" ADD_L_TYPE="E" ADD_R_DIR="1" ADD_R_MAX="411" ADD_R_MIN="75" ADD_R_TYPE="M" ALTERNATE_="" BRIDGE_NAM="" DISTRICT="Papakura" FULL_NAME="HUNUA ROAD" ID="230" ISLAND="North Island" NAME="HUNUA RD" NAMED_AREA="GREATER AUCKLAND" NAMED_ARE1="" NAMED_ARE2="" OPEN_TO_PU="1" OWNERSHIP="0" RC="3" RD_SEG_LNK="63521" REGION="Auckland" ROUTE="" SH_NO="" SPEED="100" SR="0" SUBURB="Red Hill" TOWN="Papakura" TURNRESLNK="ak211" URBANRURAL="R" ID1="107">
+    <vertices>
+      <vertex X="174.975798" Y="-37.075472"/>
+      <vertex X="174.976585" Y="-37.075457"/>
+      <vertex X="174.976789" Y="-37.075536"/>
+      <vertex X="174.976827" Y="-37.075551"/>
+      <vertex X="174.977052" Y="-37.075638"/>
+      <vertex X="174.977470" Y="-37.075721"/>
+      <vertex X="174.978963" Y="-37.075603"/>
+      <vertex X="174.980279" Y="-37.075201"/>
+      <vertex X="174.980735" Y="-37.075021"/>
+      <vertex X="174.981142" Y="-37.074698"/>
+      <vertex X="174.981180" Y="-37.074427"/>
+      <vertex X="174.980887" Y="-37.073648"/>
+      <vertex X="174.980700" Y="-37.073390"/>
+      <vertex X="174.980648" Y="-37.073139"/>
+      <vertex X="174.980690" Y="-37.073039"/>
+      <vertex X="174.980847" Y="-37.073000"/>
+      <vertex X="174.981197" Y="-37.073075"/>
+      <vertex X="174.981701" Y="-37.072985"/>
+      <vertex X="174.981914" Y="-37.072972"/>
+      <vertex X="174.982619" Y="-37.072418"/>
+      <vertex X="174.982929" Y="-37.072250"/>
+      <vertex X="174.983356" Y="-37.072233"/>
+      <vertex X="174.983724" Y="-37.072524"/>
+      <vertex X="174.983981" Y="-37.072844"/>
+      <vertex X="174.984317" Y="-37.073586"/>
+      <vertex X="174.984488" Y="-37.073673"/>
+      <vertex X="174.985129" Y="-37.073679"/>
+      <vertex X="174.985819" Y="-37.073811"/>
+      <vertex X="174.987735" Y="-37.074740"/>
+      <vertex X="174.987897" Y="-37.074872"/>
+      <vertex X="174.988529" Y="-37.075753"/>
+      <vertex X="174.989204" Y="-37.076525"/>
+      <vertex X="174.989827" Y="-37.076685"/>
+      <vertex X="174.990158" Y="-37.076850"/>
+      <vertex X="174.990654" Y="-37.077283"/>
+      <vertex X="174.990747" Y="-37.077398"/>
+      <vertex X="174.990887" Y="-37.077558"/>
+      <vertex X="174.991457" Y="-37.077836"/>
+      <vertex X="174.991798" Y="-37.077938"/>
+      <vertex X="174.992227" Y="-37.078022"/>
+    </vertices>
+  </shape>
+</shapes>
diff --git a/test/readRoads.hs b/test/readRoads.hs
new file mode 100644
--- /dev/null
+++ b/test/readRoads.hs
@@ -0,0 +1,20 @@
+{-# LANGUAGE OverloadedStrings #-}
+import Text.XML.Expat.Tree
+import Control.Monad
+import Data.Text (Text)
+import qualified Data.Text as T
+import Data.ByteString (ByteString)
+import qualified Data.ByteString.Lazy as L
+import Data.Maybe
+
+
+-- Reads the contents of ROADS.xml from stdin
+main :: IO ()
+main = do
+    bs <- L.getContents
+    let Element _ _ chs = parseThrowing defaultParseOptions bs :: UNode Text
+    forM_ chs $ \ch -> do
+        case ch of
+            elt@(Element "shape" _ _) -> do
+                putStrLn $ T.unpack $ fromMaybe "" $ getAttribute elt "FULL_NAME"
+            _ -> return ()
diff --git a/test/suite/Text/XML/Expat/ParseFormat.hs b/test/suite/Text/XML/Expat/ParseFormat.hs
--- a/test/suite/Text/XML/Expat/ParseFormat.hs
+++ b/test/suite/Text/XML/Expat/ParseFormat.hs
@@ -173,7 +173,7 @@
                                 sbDoc = normalizeText $ fromElement (getRoot $ pfDoc pf)
                             assertEqual "parse match" sbDoc (root :: Tree.UNode Text)
                             let sb = fromMaybe (pfXML pf) (impl `lookup` pfOutXML pf)
-                                bs = formatTree' root
+                                bs = format' root
                             assertEqual "format match" sb bs
             ]
         Annotated -> [
@@ -185,7 +185,7 @@
                                 sbDoc = normalizeText $ fromElement (getRoot $ pfDoc pf)
                             assertEqual "parse match" sbDoc (root :: Annotated.UNode () Text)
                             let sb = fromMaybe (pfXML pf) (impl `lookup` pfOutXML pf)
-                                bs = formatTree' root
+                                bs = format' root
                             assertEqual "format match" sb bs
             ]
         Extended  -> [
diff --git a/test/suite/Text/XML/Expat/UnitTests.hs b/test/suite/Text/XML/Expat/UnitTests.hs
--- a/test/suite/Text/XML/Expat/UnitTests.hs
+++ b/test/suite/Text/XML/Expat/UnitTests.hs
@@ -2,12 +2,14 @@
 
 import Text.XML.Expat.Tree hiding (parse)
 import qualified Text.XML.Expat.Tree as Tree
-import Text.XML.Expat.IO hiding (parse)
-import qualified Text.XML.Expat.IO as IO
+import Text.XML.Expat.SAX (SAXEvent(..))
+import qualified Text.XML.Expat.SAX as SAX
 import Text.XML.Expat.Cursor
 import Text.XML.Expat.Format
-import Text.XML.Expat.Qualified
+import Text.XML.Expat.Extended (LDocument)
+import qualified Text.XML.Expat.Extended as Extended
 import qualified Data.ByteString as B
+import qualified Data.ByteString.Char8 as C
 import qualified Data.ByteString.Lazy.Char8 as LC
 import qualified Data.ByteString.Lazy as L
 import qualified Data.Text as T
@@ -16,8 +18,10 @@
 import Data.ByteString.Internal (c2w, w2c)
 import Data.Char
 import Data.Maybe
+import Data.Monoid
 import Data.IORef
 import Control.Applicative
+import Control.Arrow (first)
 import Control.Exception as E
 import Control.Monad
 import Control.DeepSeq
@@ -98,30 +102,6 @@
     assertEqual "error1" (Left $ XMLParseError "not well-formed (invalid token)"
         (XMLParseLocation 1 0 0 0)) eDoc
 
-test_parse :: IO ()
-test_parse = do
-    ref <- newIORef []
-    let lazy = L.fromChunks [
-            toByteString "<open><tes",
-            toByteString "t1>Hello</test",
-            toByteString "1><hello></he",
-            toByteString "llo></open>"]
-    parser <- newParser Nothing
-    setStartElementHandler parser $ \_ cname cattrs -> do
-        name <- peekCString cname
-        ref <- modifyIORef ref $ \l -> ("start "++name):l
-        return True
-    setEndElementHandler parser $ \_ cname -> do
-        name <- peekCString cname
-        ref <- modifyIORef ref $ \l -> ("end "++name):l
-        return True
-    IO.parse parser lazy
-    l <- reverse <$> readIORef ref
-    assertEqual "parse"
-        ["start open","start test1","end test1","start hello","end hello","end open"]
-        l
-
-
 test_entities1 = do
     assertEqual "parse error" merr Nothing
     assertEqual "entity substitution" (Text "foo") c
@@ -240,6 +220,63 @@
 data ParseFormatTest = ParseFormatTest {
     }
 
+test_xmlDecl1 :: IO ()
+test_xmlDecl1 = do
+    assertEqual "plain" [XMLDeclaration "1.0" Nothing Nothing,StartElement "hello" [],EndElement "hello"]
+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\"?><hello/>") :: [SAXEvent String String])
+    assertEqual "withEnc" [XMLDeclaration "1.0" (Just "UTF-8") Nothing,StartElement "hello" [],EndElement "hello"]
+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\" encoding=\"UTF-8\"?><hello/>") :: [SAXEvent String String])
+    assertEqual "SA0" [XMLDeclaration "1.0" Nothing (Just False),StartElement "hello" [],EndElement "hello"]
+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\" standalone=\"no\"?><hello/>") :: [SAXEvent String String])
+    assertEqual "SA1" [XMLDeclaration "1.0" Nothing (Just True),StartElement "hello" [],EndElement "hello"]
+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\" standalone=\"yes\"?><hello/>") :: [SAXEvent String String])
+    assertEqual "SA0enc" [XMLDeclaration "1.0" (Just "UTF-8") (Just False),StartElement "hello" [],EndElement "hello"]
+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><hello/>") :: [SAXEvent String String])
+    assertEqual "SA1enc" [XMLDeclaration "1.0" (Just "UTF-8") (Just True),StartElement "hello" [],EndElement "hello"]
+        (SAX.parse defaultParseOptions (LC.pack "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><hello/>") :: [SAXEvent String String])
+
+test_various :: IO ()
+test_various =
+    assertEqual "var1" [
+            StartElement "test" [],
+            StartElement "sample" [("id","5")],
+            CharacterData "This \"text with quotations\" should be escaped.",
+            EndElement "sample",
+            StartElement "mytest" [],
+            CharacterData "//",
+            StartCData,
+            CharacterData "This \"text with quotations\" should not be escaped.//",
+            EndCData,
+            EndElement "mytest",
+            ProcessingInstruction "php" "somecode(); ",
+            Comment " this is a comment ",
+            EndElement "test"
+        ]
+        (SAX.parse defaultParseOptions (LC.pack variousText) :: [SAXEvent String String])
+
+variousText =
+    "<test>"++
+    "<sample id=\"5\">This \"text with quotations\" should be escaped.</sample>"++
+    "<mytest>"++
+    "//<![CDATA["++
+    "This \"text with quotations\" should not be escaped."++
+    "//]]>"++
+    "</mytest>"++
+    "<?php somecode(); ?>"++
+    "<!-- this is a comment -->"++
+    "</test>"
+
+quotationOut =
+    "<test><sample id=\"5\">This &quot;text with quotations&quot; should be escaped.</sample>"++
+    "<mytest>//<![CDATA[This \"text with quotations\" should not be escaped.//]]>"++
+    "</mytest><?php somecode(); ?><!-- this is a comment --></test>"
+
+test_quotation =
+    assertEqual "quotation"
+        (quotationOut, Nothing)
+        $ first (C.unpack . mconcat . LC.toChunks . formatDocument)
+        $ (Extended.parse defaultParseOptions (LC.pack variousText) :: (LDocument String String, Maybe XMLParseError))
+
 tests = hUnitTestToTests $
     TestList [
         t' ("String",
@@ -276,12 +313,14 @@
         TestLabel "error2" $ TestCase $ test_error2,
         TestLabel "error3" $ TestCase $ test_error3,
         TestLabel "error4" $ TestCase $ test_error4,
-        TestLabel "parse" $ TestCase $ test_parse,
         TestLabel "entities1" $ TestCase $ test_entities1,
         TestLabel "entities2" $ TestCase $ test_entities2,
         TestLabel "textContent" $ TestCase $ test_textContent,
         TestLabel "indent" $ TestCase $ test_indent,
-        TestLabel "setAttribute" $ TestCase $ test_setAttribute
+        TestLabel "setAttribute" $ TestCase $ test_setAttribute,
+        TestLabel "xmlDecl1" $ TestCase $ test_xmlDecl1,
+        TestLabel "various" $ TestCase $ test_various,
+        TestLabel "quotation" $ TestCase $ test_quotation
       ]
 
   where
