diff --git a/src/xercesc/dom/deprecated/DOMParser.cpp b/src/xercesc/dom/deprecated/DOMParser.cpp
index 593eb9a0eb78155e0d59ec1ffff438d0e0164ee8..0f6c9d0d94951412591b229ebded9da1f725e392 100644
--- a/src/xercesc/dom/deprecated/DOMParser.cpp
+++ b/src/xercesc/dom/deprecated/DOMParser.cpp
@@ -68,14 +68,15 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
+#include <xercesc/internal/XMLScannerResolver.hpp>
 #include <xercesc/sax/EntityResolver.hpp>
 #include <xercesc/util/XMLUniDefs.hpp>
 #include <xercesc/sax/ErrorHandler.hpp>
 #include <xercesc/sax/SAXParseException.hpp>
 #include <xercesc/framework/XMLNotationDecl.hpp>
 #include <xercesc/util/IOException.hpp>
-#include <xercesc/internal/XMLScanner.hpp>
-#include <xercesc/validators/DTD/DTDValidator.hpp>
+#include <xercesc/framework/XMLValidator.hpp>
+#include <xercesc/validators/common/GrammarResolver.hpp>
 #include "DOMParser.hpp"
 #include "ElementImpl.hpp"
 #include "AttrImpl.hpp"
@@ -100,35 +101,68 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 DOMParser::DOMParser(XMLValidator* const valToAdopt) :
 
-fErrorHandler(0)
-, fEntityResolver(0)
-, fCreateEntityReferenceNodes(true)
-, fToCreateXMLDeclTypeNode(false)
-, fIncludeIgnorableWhitespace(true)
-, fNodeStack(0)
-, fScanner(0)
+    fToCreateXMLDeclTypeNode(false)
+    , fCreateEntityReferenceNodes(true)
+    , fIncludeIgnorableWhitespace(true)
+    , fParseInProgress(false)
+    , fWithinElement(false)
+    , fEntityResolver(0)
+    , fErrorHandler(0)
+    , fNodeStack(0)
+    , fScanner(0)
+    , fDocumentType(0)
+    , fGrammarResolver(0)
+    , fURIStringPool(0)
+    , fValidator(valToAdopt)
 {
-    //
+    try
+    {
+        initialize();
+    }
+    catch(...)
+    {
+        cleanUp();
+        throw;
+    }
+}
+
+
+DOMParser::~DOMParser()
+{
+    cleanUp();
+}
+
+// ---------------------------------------------------------------------------
+//  DOMParser: Initialize/CleanUp methods
+// ---------------------------------------------------------------------------
+void DOMParser::initialize()
+{
+    // Create grammar resolver and URI string pool to pass to the scanner
+    fGrammarResolver = new GrammarResolver();
+    fURIStringPool = new XMLStringPool();
+
     //  Create a scanner and tell it what validator to use. Then set us
     //  as the document event handler so we can fill the DOM document.
-    //
-    fScanner = new XMLScanner(valToAdopt);
+    fScanner = XMLScannerResolver::getDefaultScanner(fValidator);
     fScanner->setDocHandler(this);
     fScanner->setDocTypeHandler(this);
+    fScanner->setGrammarResolver(fGrammarResolver);
+    fScanner->setURIStringPool(fURIStringPool);
 
     fNodeStack = new ValueStackOf<DOM_Node>(64);
     this->reset();
-
-
 }
 
-
-DOMParser::~DOMParser()
-{
+void DOMParser::cleanUp()
+{    
     delete fNodeStack;
     delete fScanner;
-}
+    delete fGrammarResolver;
+    delete fURIStringPool;
 
+    if (fValidator)
+        delete fValidator;
+}
 
 void DOMParser::reset()
 {
@@ -221,7 +255,7 @@ bool DOMParser::isUsingCachedGrammarInParse() const
 
 Grammar* DOMParser::getGrammar(const XMLCh* const nameSpaceKey)
 {
-    return fScanner->getGrammar(nameSpaceKey);
+    return fGrammarResolver->getGrammar(nameSpaceKey);
 }
 
 Grammar* DOMParser::getRootGrammar()
@@ -234,6 +268,10 @@ const XMLCh* DOMParser::getURIText(unsigned int uriId)
     return fScanner->getURIText(uriId);
 }
 
+bool DOMParser::getCalculateSrcOfs() const
+{
+    return fScanner->getCalculateSrcOfs();
+}
 
 // ---------------------------------------------------------------------------
 //  DOMParser: Setter methods
@@ -329,6 +367,24 @@ void DOMParser::useCachedGrammarInParse(const bool newState)
         fScanner->useCachedGrammarInParse(newState);
 }
 
+void DOMParser::setCalculateSrcOfs(const bool newState)
+{
+    fScanner->setCalculateSrcOfs(newState);
+}
+
+void DOMParser::useScanner(const XMLCh* const scannerName)
+{
+    XMLScanner* tempScanner = XMLScannerResolver::resolveScanner(scannerName, fValidator);
+
+    if (tempScanner) {
+
+        // REVISIT: need to set scanner options and handlers
+        delete fScanner;
+        fScanner = tempScanner;
+        fScanner->setGrammarResolver(fGrammarResolver);
+        fScanner->setURIStringPool(fURIStringPool);
+    }
+}
 
 // ---------------------------------------------------------------------------
 //  DOMParser: Parsing methods
@@ -1340,7 +1396,7 @@ Grammar* DOMParser::loadGrammar(const InputSource& source,
 
 void DOMParser::resetCachedGrammarPool()
 {
-    fScanner->resetCachedGrammarPool();
+    fGrammarResolver->resetCachedGrammar();
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/dom/deprecated/DOMParser.hpp b/src/xercesc/dom/deprecated/DOMParser.hpp
index e90bd19c12c515d537162020aecf46d84a3cff7f..055e57d6bf145718504e33fdcb678bd0a048ff9f 100644
--- a/src/xercesc/dom/deprecated/DOMParser.hpp
+++ b/src/xercesc/dom/deprecated/DOMParser.hpp
@@ -62,7 +62,6 @@
 #if !defined(DOMPARSER_HPP)
 #define DOMPARSER_HPP
 
-
 #include <xercesc/framework/XMLDocumentHandler.hpp>
 #include <xercesc/framework/XMLErrorReporter.hpp>
 #include <xercesc/framework/XMLEntityHandler.hpp>
@@ -82,7 +81,7 @@ class XMLPScanToken;
 class XMLScanner;
 class XMLValidator;
 class Grammar;
-
+class GrammarResolver;
 
 /**
   * This class implements the Document Object Model (DOM) interface.
@@ -401,6 +400,19 @@ public :
       */
     bool isUsingCachedGrammarInParse() const;
 
+    /**
+      * Get the 'calculate src offset flag'
+      *
+      * This method returns the state of the parser's src offset calculation
+      * when parsing an XML document.
+      *
+      * @return true, if the parser is currently configured to
+      *         calculate src offsets, false otherwise.
+      *
+      * @see #setCalculateSrcOfs
+      */
+    bool getCalculateSrcOfs() const;
+
     /**
       * Retrieve the grammar that is associated with the specified namespace key
       *
@@ -726,6 +738,29 @@ public :
       */
     void useCachedGrammarInParse(const bool newState);
 
+    /** Enable/disable src offset calculation
+      *
+      * This method allows users to enable/disable src offset calculation.
+      * Disabling the calculation will improve performance.
+      *
+      * The parser's default state is: true.
+      *
+      * @param newState The value specifying whether we should enable or
+      *                 disable src offset calculation
+      *
+      * @see #getCalculateSrcOfs
+      */
+    void setCalculateSrcOfs(const bool newState);
+
+    /** Set the scanner to use when scanning the XML document
+      *
+      * This method allows users to set the scanner to use
+      * when scanning a given XML document.
+      *
+      * @param scannerName The name of the desired scanner
+      */
+    void useScanner(const XMLCh* const scannerName);
+
     //@}
 
 
@@ -1612,6 +1647,12 @@ protected :
 
 
 private :
+    // -----------------------------------------------------------------------
+    //  Protected setter methods
+    // -----------------------------------------------------------------------
+    void initialize();
+    void cleanUp();
+    
     // -----------------------------------------------------------------------
     //  Private data members
     //
@@ -1661,23 +1702,25 @@ private :
     //      This is an extension to xerces implementation
     //
     // -----------------------------------------------------------------------
+    bool                    fToCreateXMLDeclTypeNode;
+    bool                    fCreateEntityReferenceNodes;
+    bool                    fIncludeIgnorableWhitespace;
+    bool                    fParseInProgress;
+    bool                    fWithinElement;
     DOM_Node                fCurrentParent;
     DOM_Node                fCurrentNode;
     DOM_Document            fDocument;
     EntityResolver*         fEntityResolver;
     ErrorHandler*           fErrorHandler;
-    bool                    fCreateEntityReferenceNodes;
-    bool                    fIncludeIgnorableWhitespace;
     ValueStackOf<DOM_Node>* fNodeStack;
-    bool                    fParseInProgress;
     XMLScanner*             fScanner;
-    bool                    fWithinElement;
     DocumentTypeImpl*       fDocumentType;
-    bool                    fToCreateXMLDeclTypeNode;
+    GrammarResolver*        fGrammarResolver;
+    XMLStringPool*          fURIStringPool;
+    XMLValidator*           fValidator;
 };
 
 
-
 // ---------------------------------------------------------------------------
 //  DOMParser: Handlers for the XMLEntityHandler interface
 // ---------------------------------------------------------------------------
@@ -1788,7 +1831,6 @@ inline DOM_Node DOMParser::getCurrentNode()
     return fCurrentNode;
 }
 
-
 // ---------------------------------------------------------------------------
 //  DOMParser: Protected setter methods
 // ---------------------------------------------------------------------------