diff --git a/src/xercesc/parsers/AbstractDOMParser.cpp b/src/xercesc/parsers/AbstractDOMParser.cpp
index 90a74060c1608de23ae161d31e1bf2fa0a8577d3..be3aaf6522c3ef792351a2d371228b73b143f900 100644
--- a/src/xercesc/parsers/AbstractDOMParser.cpp
+++ b/src/xercesc/parsers/AbstractDOMParser.cpp
@@ -68,13 +68,14 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
+#include <xercesc/parsers/AbstractDOMParser.hpp>
+#include <xercesc/internal/XMLScannerResolver.hpp>
+#include <xercesc/internal/ElemStack.hpp>
 #include <xercesc/sax/EntityResolver.hpp>
 #include <xercesc/util/XMLUniDefs.hpp>
 #include <xercesc/framework/XMLNotationDecl.hpp>
+#include <xercesc/framework/XMLValidator.hpp>
 #include <xercesc/util/IOException.hpp>
-#include <xercesc/internal/XMLScanner.hpp>
-#include <xercesc/validators/DTD/DTDValidator.hpp>
-#include <xercesc/parsers/AbstractDOMParser.hpp>
 #include <xercesc/dom/DOMImplementation.hpp>
 #include <xercesc/dom/DOMElement.hpp>
 #include <xercesc/dom/impl/DOMAttrImpl.hpp>
@@ -92,9 +93,9 @@
 #include <xercesc/dom/DOMProcessingInstruction.hpp>
 #include <xercesc/dom/impl/DOMProcessingInstructionImpl.hpp>
 #include <xercesc/dom/impl/DOMNodeIDMap.hpp>
-
 #include <xercesc/validators/common/ContentSpecNode.hpp>
-#include <xercesc/validators/DTD/DTDAttDefList.hpp>
+#include <xercesc/validators/common/GrammarResolver.hpp>
+
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -108,6 +109,8 @@ AbstractDOMParser::AbstractDOMParser(XMLValidator* const valToAdopt) :
 , fIncludeIgnorableWhitespace(true)
 , fWithinElement(false)
 , fParseInProgress(false)
+, fCreateCommentNodes(true)
+, fDocumentAdoptedByUser(false)
 , fScanner(0)
 , fCurrentParent(0)
 , fCurrentNode(0)
@@ -116,34 +119,65 @@ AbstractDOMParser::AbstractDOMParser(XMLValidator* const valToAdopt) :
 , fNodeStack(0)
 , fDocumentType(0)
 , fDocumentVector(0)
-, fCreateCommentNodes(true)
-, fDocumentAdoptedByUser(false)
+, fGrammarResolver(0)
+, fURIStringPool(0)
+, fValidator(valToAdopt)
 , fInternalSubset(fBufMgr.bidOnBuffer())
 {
-    //
+    try
+    {
+        initialize();
+    }
+    catch(...)
+    {
+       cleanUp();
+       throw;
+    }
+}
+
+
+AbstractDOMParser::~AbstractDOMParser()
+{
+    cleanUp();
+}
+
+// ---------------------------------------------------------------------------
+//  AbstractDOMParser: Initialize/CleanUp methods
+// ---------------------------------------------------------------------------
+void AbstractDOMParser::initialize()
+{
+    //  Create grammar resolver and 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<DOMNode*>(64);
     this->reset();
 }
 
-
-AbstractDOMParser::~AbstractDOMParser()
+void AbstractDOMParser::cleanUp()
 {
     if (fDocumentVector)
         delete fDocumentVector;
 
     if (!fDocumentAdoptedByUser)
         delete fDocument;
+
     delete fNodeStack;
     delete fScanner;
-}
+    delete fGrammarResolver;
+    delete fURIStringPool;
 
+    if (fValidator)
+        delete fValidator;
+}
 
 // ---------------------------------------------------------------------------
 //  AbstractDOMParser: Utilities
@@ -266,6 +300,11 @@ bool AbstractDOMParser::getLoadExternalDTD() const
     return fScanner->getLoadExternalDTD();
 }
 
+bool AbstractDOMParser::getCalculateSrcOfs() const
+{
+    return fScanner->getCalculateSrcOfs();
+}
+
 
 // ---------------------------------------------------------------------------
 //  AbstractDOMParser: Setter methods
@@ -328,6 +367,24 @@ void AbstractDOMParser::setLoadExternalDTD(const bool newState)
     fScanner->setLoadExternalDTD(newState);
 }
 
+void AbstractDOMParser::setCalculateSrcOfs(const bool newState)
+{
+    fScanner->setCalculateSrcOfs(newState);
+}
+
+void AbstractDOMParser::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);
+    }
+}
 
 // ---------------------------------------------------------------------------
 //  AbstractDOMParser: Parsing methods
@@ -801,10 +858,9 @@ void AbstractDOMParser::startElement(const  XMLElementDecl&         elemDecl
                         // done here.
                         const XMLCh* qualifiedName = attr->getFullName();
                         XMLBufBid bbPrefixQName(&fBufMgr);
-                        XMLBufBid bbQName(&fBufMgr);
                         XMLBuffer& prefixBuf = bbPrefixQName.getBuffer();
-                        XMLBuffer& nameBuf = bbQName.getBuffer();
-                        unsigned int uriId = fScanner->resolveQName(qualifiedName, nameBuf, prefixBuf, ElemStack::Mode_Attribute);
+                        int colonPos = -1;
+                        unsigned int uriId = fScanner->resolveQName(qualifiedName, prefixBuf, ElemStack::Mode_Attribute, colonPos);
 
                         const XMLCh* namespaceURI = 0;
                         if (XMLString::equals(qualifiedName, XMLNS))    //for xmlns=...
diff --git a/src/xercesc/parsers/AbstractDOMParser.hpp b/src/xercesc/parsers/AbstractDOMParser.hpp
index 5ffa5d60869db66984b193ed44fc08ee3056fd64..e70131d77be0d498be1333d069b315efd4f5b966 100644
--- a/src/xercesc/parsers/AbstractDOMParser.hpp
+++ b/src/xercesc/parsers/AbstractDOMParser.hpp
@@ -61,7 +61,6 @@
 #if !defined(ABSTRACTDOMPARSER_HPP)
 #define ABSTRACTDOMPARSER_HPP
 
-
 #include <xercesc/dom/DOMDocument.hpp>
 #include <xercesc/framework/XMLDocumentHandler.hpp>
 #include <xercesc/framework/XMLErrorReporter.hpp>
@@ -81,6 +80,7 @@ class XMLValidator;
 class DOMDocumentImpl;
 class DOMDocumentTypeImpl;
 class DOMElement;
+class GrammarResolver;
 
 
 /**
@@ -362,6 +362,19 @@ public :
       */
     bool  getCreateCommentNodes()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;
+
     //@}
 
 
@@ -611,6 +624,29 @@ public :
       */
     void setCreateCommentNodes(const bool create);
 
+    /** 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 the scanner to use
+      * when scanning a given XML document.
+      *
+      * @param scannerName The name of the desired scanner
+      */
+    void useScanner(const XMLCh* const scannerName);
+
     //@}
 
 
@@ -1234,6 +1270,12 @@ protected :
       */
     XMLScanner* getScanner() const;
 
+    /** Get the Grammar resolver
+      *
+      * This provides derived classes with access to the grammar resolver.
+      */
+    GrammarResolver* getGrammarResolver() const;
+
     /** Get the parse in progress flag
       *
       * This provides derived classes with access to the parse in progress
@@ -1290,6 +1332,12 @@ protected :
 
 
 private :
+    // -----------------------------------------------------------------------
+    //  Initialize/Cleanup methods
+    // -----------------------------------------------------------------------
+    void initialize();
+    void cleanUp();
+
     // -----------------------------------------------------------------------
     //  Private data members
     //
@@ -1353,6 +1401,8 @@ private :
     bool                          fIncludeIgnorableWhitespace;
     bool                          fWithinElement;
     bool                          fParseInProgress;
+    bool                          fCreateCommentNodes;
+    bool                          fDocumentAdoptedByUser;
     XMLBufferMgr                  fBufMgr;
     XMLScanner*                   fScanner;
     DOMNode*                      fCurrentParent;
@@ -1362,8 +1412,9 @@ private :
     ValueStackOf<DOMNode*>*       fNodeStack;
     DOMDocumentTypeImpl*          fDocumentType;
     RefVectorOf<DOMDocumentImpl>* fDocumentVector;
-    bool                          fCreateCommentNodes;
-    bool                          fDocumentAdoptedByUser;
+    GrammarResolver*              fGrammarResolver;
+    XMLStringPool*                fURIStringPool;
+    XMLValidator*                 fValidator;
     XMLBuffer&                    fInternalSubset;
 };
 
@@ -1396,6 +1447,11 @@ inline XMLScanner* AbstractDOMParser::getScanner() const
     return fScanner;
 }
 
+inline GrammarResolver* AbstractDOMParser::getGrammarResolver() const
+{
+    return fGrammarResolver;
+}
+
 inline bool AbstractDOMParser::getCreateCommentNodes() const
 {
     return fCreateCommentNodes;
diff --git a/src/xercesc/parsers/DOMBuilderImpl.cpp b/src/xercesc/parsers/DOMBuilderImpl.cpp
index 71c42b1e53c939025e8b4a63ee736c45173b6cde..18a5affb45e8861fffe2e1b281ed1c5abbf29b32 100644
--- a/src/xercesc/parsers/DOMBuilderImpl.cpp
+++ b/src/xercesc/parsers/DOMBuilderImpl.cpp
@@ -78,6 +78,7 @@
 #include <xercesc/sax/SAXParseException.hpp>
 #include <xercesc/internal/XMLScanner.hpp>
 #include <xercesc/framework/Wrapper4DOMInputSource.hpp>
+#include <xercesc/validators/common/GrammarResolver.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -231,7 +232,11 @@ void DOMBuilderImpl::setFeature(const XMLCh* const name, const bool state)
     else if (XMLString::compareIString(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0)
     {
         if (state || !getScanner()->isCachingGrammarFromParse())
-         getScanner()->useCachedGrammarInParse(state);
+            getScanner()->useCachedGrammarInParse(state);
+    }
+    else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)
+    {
+        getScanner()->setCalculateSrcOfs(state);
     }
     else {
         throw DOMException(DOMException::NOT_FOUND_ERR, 0);
@@ -304,6 +309,10 @@ bool DOMBuilderImpl::getFeature(const XMLCh* const name) const
     {
         return getScanner()->isUsingCachedGrammarInParse();
     }
+    else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)
+    {
+        return getScanner()->getCalculateSrcOfs();
+    }
     else {
         throw DOMException(DOMException::NOT_FOUND_ERR, 0);
     }
@@ -320,7 +329,8 @@ bool DOMBuilderImpl::canSetFeature(const XMLCh* const name, const bool state) co
         (XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) ||
         (XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) ||
         (XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) ||
-        (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0)) {
+        (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) ||
+        (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)) {
         return true;
     }
 
@@ -362,6 +372,10 @@ void DOMBuilderImpl::setProperty(const XMLCh* const name, void* value)
 	{
 		setExternalNoNamespaceSchemaLocation((XMLCh*)value);
 	}
+    else if (XMLString::equals(name, XMLUni::fgXercesScannerName))
+    {
+        AbstractDOMParser::useScanner((const XMLCh*) value);
+    }
     else
       throw DOMException(DOMException::NOT_FOUND_ERR, 0);
 }
@@ -577,12 +591,12 @@ Grammar* DOMBuilderImpl::loadGrammar(const DOMInputSource& source,
 
 void DOMBuilderImpl::resetCachedGrammarPool()
 {
-    getScanner()->resetCachedGrammarPool();
+    getGrammarResolver()->resetCachedGrammar();
 }
 
 Grammar* DOMBuilderImpl::getGrammar(const XMLCh* const nameSpaceKey) const
 {
-    return getScanner()->getGrammar(nameSpaceKey);
+    return getGrammarResolver()->getGrammar(nameSpaceKey);
 }
 
 Grammar* DOMBuilderImpl::getRootGrammar() const
diff --git a/src/xercesc/parsers/SAX2XMLReaderImpl.cpp b/src/xercesc/parsers/SAX2XMLReaderImpl.cpp
index e928825086565a05032494e799d2d5c2992a1353..234e78da149f4d4c8cc4a623c14e707cdc9f9076 100644
--- a/src/xercesc/parsers/SAX2XMLReaderImpl.cpp
+++ b/src/xercesc/parsers/SAX2XMLReaderImpl.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.13  2002/12/04 01:57:09  knoaman
+ * Scanner re-organization.
+ *
  * Revision 1.12  2002/11/04 14:57:03  tng
  * C++ Namespace Support.
  *
@@ -224,6 +227,7 @@
 #include <xercesc/util/XMLChTranscoder.hpp>
 #include <xercesc/util/RefStackOf.hpp>
 #include <xercesc/util/XMLUniDefs.hpp>
+#include <xercesc/util/Janitor.hpp>
 #include <xercesc/sax2/ContentHandler.hpp>
 #include <xercesc/sax2/LexicalHandler.hpp>
 #include <xercesc/sax2/DeclHandler.hpp>
@@ -232,8 +236,9 @@
 #include <xercesc/sax/EntityResolver.hpp>
 #include <xercesc/sax/SAXParseException.hpp>
 #include <xercesc/sax/SAXException.hpp>
-#include <xercesc/internal/XMLScanner.hpp>
+#include <xercesc/internal/XMLScannerResolver.hpp>
 #include <xercesc/parsers/SAX2XMLReaderImpl.hpp>
+#include <xercesc/validators/common/GrammarResolver.hpp>
 #include <string.h>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -245,25 +250,59 @@ const XMLCh gDTDEntityStr[] =
 };
 
 SAX2XMLReaderImpl::SAX2XMLReaderImpl() :
-    fDocHandler(0)
-    , fDTDHandler(0)
+
+    fNamespacePrefix(false)
+    , fAutoValidation(false)
+    , fValidation(true)
+    , fParseInProgress(false)
+    , fHasExternalSubset(false)
     , fElemDepth(0)
+    , fAdvDHCount(0)
+    , fAdvDHListSize(32)
+    , fDocHandler(0)
+    , fTempAttrVec(0)
+    , fPrefixes(0)
+    , fPrefixCounts(0)
+    , fDTDHandler(0)
     , fEntityResolver(0)
     , fErrorHandler(0)
     , fLexicalHandler(0)
     , fDeclHandler(0)
-    , fAdvDHCount(0)
     , fAdvDHList(0)
-    , fAdvDHListSize(32)
-    , fParseInProgress(false)
     , fScanner(0)
-    , fHasExternalSubset(false)
+    , fGrammarResolver(0)
+    , fURIStringPool(0)
 {
-    //
+    try
+    {
+        initialize();
+    }
+    catch(...)
+    {
+        cleanUp();
+        throw;
+    }
+}
+
+SAX2XMLReaderImpl::~SAX2XMLReaderImpl()
+{
+    cleanUp();
+}
+
+// ---------------------------------------------------------------------------
+//  SAX2XMLReaderImpl: Initialize/Cleanup methods
+// ---------------------------------------------------------------------------
+void SAX2XMLReaderImpl::initialize()
+{
+    // Create grammar resolver and string pool that we 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(0);
+    fScanner = XMLScannerResolver::getDefaultScanner(0);
+    fScanner->setGrammarResolver(fGrammarResolver);
+    fScanner->setURIStringPool(fURIStringPool);
 
     // Create the initial advanced handler list array and zero it out
     fAdvDHList = new XMLDocumentHandler*[fAdvDHListSize];
@@ -272,28 +311,24 @@ SAX2XMLReaderImpl::SAX2XMLReaderImpl() :
 	// SAX2 default is for namespaces (feature http://xml.org/sax/features/namespaces) to be on
 	setDoNamespaces(true) ;
 
-	// SAX2 default is for namespaces-prefixes to be off
-	fnamespacePrefix = false;
-
-	// SAX2 default: validation on, auto-validation off
-	fValidation = true;
-	fautoValidation = false;
-
 	// default: schema is on
 	setDoSchema(true);
 	
 	fPrefixes    = new RefStackOf<XMLBuffer> (10, false) ;
-	tempAttrVec  = new RefVectorOf<XMLAttr>  (10, false) ;
-	prefixCounts = new ValueStackOf<unsigned int>(10) ;
+	fTempAttrVec  = new RefVectorOf<XMLAttr>  (10, false) ;
+	fPrefixCounts = new ValueStackOf<unsigned int>(10) ;
 }
 
-SAX2XMLReaderImpl::~SAX2XMLReaderImpl()
+
+void SAX2XMLReaderImpl::cleanUp()
 {
     delete [] fAdvDHList;
     delete fScanner;
     delete fPrefixes;
-    delete tempAttrVec;
-    delete prefixCounts ;
+    delete fTempAttrVec;
+    delete fPrefixCounts;
+    delete fGrammarResolver;
+    delete fURIStringPool;
 }
 
 // ---------------------------------------------------------------------------
@@ -389,6 +424,7 @@ bool SAX2XMLReaderImpl::removeAdvDocHandler(XMLDocumentHandler* const toRemove)
 // ---------------------------------------------------------------------------
 void SAX2XMLReaderImpl::setValidator(XMLValidator* valueToAdopt)
 {
+    fValidator = valueToAdopt;
 	fScanner->setValidator(valueToAdopt);
 }
 
@@ -757,9 +793,9 @@ void SAX2XMLReaderImpl::resetDocument()
     fElemDepth = 0;
 
     // Pop any prefix buffers left over from previous uses
-    while (!prefixCounts->empty())
+    while (!fPrefixCounts->empty())
     {
-        unsigned int numPrefix = prefixCounts->pop();
+        unsigned int numPrefix = fPrefixCounts->pop();
         for (unsigned int i = 0; i < numPrefix; i++)
         {
             XMLBuffer * buf = fPrefixes->pop() ;
@@ -817,9 +853,9 @@ startElement(   const   XMLElementDecl&         elemDecl
             const XMLCh*   nsURI    = 0;
             const XMLAttr* tempAttr = 0;
 
-            if (!fnamespacePrefix)
+            if (!fNamespacePrefix)
             {
-                tempAttrVec->removeAllElements();
+                fTempAttrVec->removeAllElements();
             }
 
             for (unsigned int i = 0; i < attrCount; i++)
@@ -832,10 +868,10 @@ startElement(   const   XMLElementDecl&         elemDecl
                     nsPrefix = tempAttr->getName();
                     nsURI = tempAttr->getValue();
                 }
-                if (!fnamespacePrefix)
+                if (!fNamespacePrefix)
                 {
                     if (nsURI == 0)
-                        tempAttrVec->addElement((XMLAttr* const)tempAttr);
+                        fTempAttrVec->addElement((XMLAttr* const)tempAttr);
                 }
                 if (nsURI != 0)
                 {
@@ -850,9 +886,9 @@ startElement(   const   XMLElementDecl&         elemDecl
                 nsURI = 0;
                 nsPrefix = 0;
             }
-            prefixCounts->push(numPrefix) ;
-            if (!fnamespacePrefix)
-                fAttrList.setVector(tempAttrVec, tempAttrVec->size(), fScanner);
+            fPrefixCounts->push(numPrefix) ;
+            if (!fNamespacePrefix)
+                fAttrList.setVector(fTempAttrVec, fTempAttrVec->size(), fScanner);
             else
                 fAttrList.setVector(&attrList, attrCount, fScanner);
 
@@ -891,7 +927,7 @@ startElement(   const   XMLElementDecl&         elemDecl
 											elemDecl.getBaseName(),
 											elemQName.getRawBuffer());
 
-                unsigned int numPrefix = prefixCounts->pop();
+                unsigned int numPrefix = fPrefixCounts->pop();
                 for (unsigned int i = 0; i < numPrefix; ++i)
                 {
                     XMLBuffer * buf = fPrefixes->pop() ;
@@ -955,7 +991,7 @@ void SAX2XMLReaderImpl::endElement( const   XMLElementDecl& elemDecl
 										elemDecl.getBaseName(),
 										elemQName.getRawBuffer());
 
-            unsigned int numPrefix = prefixCounts->pop();
+            unsigned int numPrefix = fPrefixCounts->pop();
             for (unsigned int i = 0; i < numPrefix; i++)
             {
                 XMLBuffer * buf = fPrefixes->pop() ;
@@ -1339,7 +1375,7 @@ void SAX2XMLReaderImpl::setFeature(const XMLCh* const name, const bool value)
     {
         fValidation = value;
         if (fValidation)
-            if (fautoValidation)
+            if (fAutoValidation)
                 setValidationScheme(Val_Auto);
             else
                 setValidationScheme(Val_Always);
@@ -1348,14 +1384,14 @@ void SAX2XMLReaderImpl::setFeature(const XMLCh* const name, const bool value)
     }
     else if (XMLString::compareIString(name, XMLUni::fgSAX2CoreNameSpacePrefixes) == 0)
     {
-        fnamespacePrefix = value;
+        fNamespacePrefix = value;
     }
     else if (XMLString::compareIString(name, XMLUni::fgXercesDynamic) == 0)
     {
-        fautoValidation = value;
+        fAutoValidation = value;
         // for auto validation, the sax2 core validation feature must also be enabled.
         if (fValidation)
-            if (fautoValidation)
+            if (fAutoValidation)
                 setValidationScheme(Val_Auto);
             else
                 setValidationScheme(Val_Always);
@@ -1394,6 +1430,10 @@ void SAX2XMLReaderImpl::setFeature(const XMLCh* const name, const bool value)
         if (value || !fScanner->isCachingGrammarFromParse())
             fScanner->useCachedGrammarInParse(value);
     }
+    else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)
+    {
+        fScanner->setCalculateSrcOfs(value);
+    }
     else
        throw SAXNotRecognizedException("Unknown Feature");
 }
@@ -1405,9 +1445,9 @@ bool SAX2XMLReaderImpl::getFeature(const XMLCh* const name) const
     else if (XMLString::compareIString(name, XMLUni::fgSAX2CoreValidation) == 0)
         return fValidation;
     else if (XMLString::compareIString(name, XMLUni::fgSAX2CoreNameSpacePrefixes) == 0)
-        return fnamespacePrefix;
+        return fNamespacePrefix;
     else if (XMLString::compareIString(name, XMLUni::fgXercesDynamic) == 0)
-        return fautoValidation;
+        return fAutoValidation;
     else if (XMLString::compareIString(name, XMLUni::fgXercesSchema) == 0)
         return getDoSchema();
     else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaFullChecking) == 0)
@@ -1422,6 +1462,8 @@ bool SAX2XMLReaderImpl::getFeature(const XMLCh* const name) const
         return fScanner->isCachingGrammarFromParse();
     else if (XMLString::compareIString(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0)
         return fScanner->isUsingCachedGrammarInParse();
+    else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)
+        return fScanner->getCalculateSrcOfs();
     else
        throw SAXNotRecognizedException("Unknown Feature");
 
@@ -1437,13 +1479,24 @@ void SAX2XMLReaderImpl::setProperty(const XMLCh* const name, void* value)
 	{
 		fScanner->setExternalSchemaLocation((XMLCh*)value);
 	}
-
 	else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0)
 	{
 		fScanner->setExternalNoNamespaceSchemaLocation((XMLCh*)value);
 	}
+    else if (XMLString::equals(name, XMLUni::fgXercesScannerName))
+    {
+        XMLScanner* tempScanner = XMLScannerResolver::resolveScanner((const XMLCh*) value, fValidator);
 
-   else
+        if (tempScanner) {
+
+            // REVISIT: set scanner options and handlers
+            tempScanner->setGrammarResolver(fGrammarResolver);
+            tempScanner->setURIStringPool(fURIStringPool);
+            delete fScanner;
+            fScanner = tempScanner;
+        }
+    }
+    else
        throw SAXNotRecognizedException("Unknown Property");
 }
 
@@ -1454,6 +1507,8 @@ void* SAX2XMLReaderImpl::getProperty(const XMLCh* const name) const
         return (void*)fScanner->getExternalSchemaLocation();
     else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation) == 0)
         return (void*)fScanner->getExternalNoNamespaceSchemaLocation();
+    else if (XMLString::equals(name, XMLUni::fgXercesScannerName))
+        return (void*)fScanner->getName();
     else
         throw SAXNotRecognizedException("Unknown Property");
     return 0;
@@ -1575,8 +1630,14 @@ Grammar* SAX2XMLReaderImpl::loadGrammar(const InputSource& source,
 
 void SAX2XMLReaderImpl::resetCachedGrammarPool()
 {
-    fScanner->resetCachedGrammarPool();
+    fGrammarResolver->resetCachedGrammar();
 }
 
+Grammar* SAX2XMLReaderImpl::getGrammar(const XMLCh* const nameSpaceKey)
+{
+    return fGrammarResolver->getGrammar(nameSpaceKey);
+}
+
+
 XERCES_CPP_NAMESPACE_END
 
diff --git a/src/xercesc/parsers/SAX2XMLReaderImpl.hpp b/src/xercesc/parsers/SAX2XMLReaderImpl.hpp
index f8f80534d0d57b3abaed523057495991de075f7f..3a5d12a8abdd6963eebc9a123fb9a1f05c408456 100644
--- a/src/xercesc/parsers/SAX2XMLReaderImpl.hpp
+++ b/src/xercesc/parsers/SAX2XMLReaderImpl.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.15  2002/12/04 01:57:09  knoaman
+ * Scanner re-organization.
+ *
  * Revision 1.14  2002/11/04 14:57:03  tng
  * C++ Namespace Support.
  *
@@ -199,6 +202,7 @@ XERCES_CPP_NAMESPACE_BEGIN
 class ContentHandler;
 class LexicalHandler;
 class DeclHandler;
+class GrammarResolver;
 
 /**
   * This class implements the SAX2 'XMLReader' interface and should be
@@ -1642,6 +1646,12 @@ private :
     SAX2XMLReaderImpl(const SAX2XMLReaderImpl&);
     void operator=(const SAX2XMLReaderImpl&);
 
+    // -----------------------------------------------------------------------
+    //  Initialize/Cleanup methods
+    // -----------------------------------------------------------------------
+    void initialize();
+    void cleanUp();
+
     // -----------------------------------------------------------------------
     //  Private data members
     //
@@ -1722,30 +1732,30 @@ private :
     //      Indicate if the document has external DTD subset.
     //
     // -----------------------------------------------------------------------
-	VecAttributesImpl		   fAttrList ;
-	ContentHandler*			   fDocHandler ;
-	RefVectorOf<XMLAttr>*      tempAttrVec ;
-
-	bool                       fnamespacePrefix;
-	bool                       fautoValidation;
-	bool                       fValidation;
-
-	XMLBufferMgr			   fStringBuffers ;
-	RefStackOf<XMLBuffer> *    fPrefixes ;
-	ValueStackOf<unsigned int> * prefixCounts ;
-
-    DTDHandler*                fDTDHandler;
-    unsigned int               fElemDepth;
-    EntityResolver*            fEntityResolver;
-    ErrorHandler*              fErrorHandler;
-    LexicalHandler*            fLexicalHandler;
-    DeclHandler*               fDeclHandler;
-    unsigned int               fAdvDHCount;
-    XMLDocumentHandler**       fAdvDHList;
-    unsigned int               fAdvDHListSize;
-    bool                       fParseInProgress;
-    XMLScanner*                fScanner;
-    bool                       fHasExternalSubset;
+    bool                        fNamespacePrefix;
+    bool                        fAutoValidation;
+    bool                        fValidation;
+    bool                        fParseInProgress;
+    bool                        fHasExternalSubset;
+    unsigned int                fElemDepth;
+    unsigned int                fAdvDHCount;
+    unsigned int                fAdvDHListSize;
+    VecAttributesImpl		fAttrList ;
+    ContentHandler*		fDocHandler ;
+    RefVectorOf<XMLAttr>*       fTempAttrVec ;
+    XMLBufferMgr		fStringBuffers ;
+    RefStackOf<XMLBuffer> *     fPrefixes ;
+    ValueStackOf<unsigned int>* fPrefixCounts ;
+    DTDHandler*                 fDTDHandler;
+    EntityResolver*             fEntityResolver;
+    ErrorHandler*               fErrorHandler;
+    LexicalHandler*             fLexicalHandler;
+    DeclHandler*                fDeclHandler;
+    XMLDocumentHandler**        fAdvDHList;
+    XMLScanner*                 fScanner;
+    GrammarResolver*            fGrammarResolver;
+    XMLStringPool*              fURIStringPool;
+    XMLValidator*               fValidator;
 	
     // -----------------------------------------------------------------------
     // internal function used to set the state of the parser
@@ -1755,7 +1765,6 @@ private :
     bool getDoNamespaces() const;
     void setDoSchema(const bool newState);
     bool getDoSchema() const;
-
 };
 
 
@@ -1802,11 +1811,6 @@ inline bool SAX2XMLReaderImpl::getValidationConstraintFatal() const
     return fScanner->getValidationConstraintFatal();
 }
 
-inline Grammar* SAX2XMLReaderImpl::getGrammar(const XMLCh* const nameSpaceKey)
-{
-    return fScanner->getGrammar(nameSpaceKey);
-}
-
 inline Grammar* SAX2XMLReaderImpl::getRootGrammar()
 {
     return fScanner->getRootGrammar();
diff --git a/src/xercesc/parsers/SAXParser.cpp b/src/xercesc/parsers/SAXParser.cpp
index b5d0f27da98b63accac3899fdefb987fc27d0571..cd6b88530a4682189e631dfbf3ff3a908567176a 100644
--- a/src/xercesc/parsers/SAXParser.cpp
+++ b/src/xercesc/parsers/SAXParser.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.10  2002/12/04 01:57:09  knoaman
+ * Scanner re-organization.
+ *
  * Revision 1.9  2002/11/04 14:57:03  tng
  * C++ Namespace Support.
  *
@@ -183,14 +186,16 @@
 // ---------------------------------------------------------------------------
 //  Includes
 // ---------------------------------------------------------------------------
+#include <xercesc/parsers/SAXParser.hpp>
+#include <xercesc/internal/XMLScannerResolver.hpp>
+#include <xercesc/framework/XMLValidator.hpp>
 #include <xercesc/util/IOException.hpp>
 #include <xercesc/sax/DocumentHandler.hpp>
 #include <xercesc/sax/DTDHandler.hpp>
 #include <xercesc/sax/ErrorHandler.hpp>
 #include <xercesc/sax/EntityResolver.hpp>
 #include <xercesc/sax/SAXParseException.hpp>
-#include <xercesc/internal/XMLScanner.hpp>
-#include <xercesc/parsers/SAXParser.hpp>
+#include <xercesc/validators/common/GrammarResolver.hpp>
 #include <string.h>
 
 XERCES_CPP_NAMESPACE_BEGIN
@@ -201,32 +206,66 @@ XERCES_CPP_NAMESPACE_BEGIN
 // ---------------------------------------------------------------------------
 SAXParser::SAXParser(XMLValidator* const valToAdopt) :
 
-    fDocHandler(0)
-    , fDTDHandler(0)
+    fParseInProgress(false)
     , fElemDepth(0)
+    , fAdvDHCount(0)
+    , fAdvDHListSize(32)
+    , fDocHandler(0)
+    , fDTDHandler(0)
     , fEntityResolver(0)
     , fErrorHandler(0)
-    , fAdvDHCount(0)
     , fAdvDHList(0)
-    , fAdvDHListSize(32)
-    , fParseInProgress(false)
     , fScanner(0)
+    , fGrammarResolver(0)
+    , fURIStringPool(0)
+    , fValidator(valToAdopt)
+{
+    try
+    {
+        initialize();
+    }
+    catch(...)
+    {
+        cleanUp();
+        throw;
+    }
+}
+
+
+SAXParser::~SAXParser()
 {
+    cleanUp();
+}
+
+// ---------------------------------------------------------------------------
+//  SAXParser: Initialize/CleanUp methods
+// ---------------------------------------------------------------------------
+void SAXParser::initialize()
+{
+    // Create grammar resolver and string pool to pass to scanner
+    fGrammarResolver = new GrammarResolver();
+    fURIStringPool = new XMLStringPool();
+
     // Create our scanner and tell it what validator to use
-    fScanner = new XMLScanner(valToAdopt);
+    fScanner = XMLScannerResolver::getDefaultScanner(fValidator);
+    fScanner->setGrammarResolver(fGrammarResolver);
+    fScanner->setURIStringPool(fURIStringPool);
 
     // Create the initial advanced handler list array and zero it out
     fAdvDHList = new XMLDocumentHandler*[fAdvDHListSize];
     memset(fAdvDHList, 0, sizeof(void*) * fAdvDHListSize);
 }
 
-
-SAXParser::~SAXParser()
+void SAXParser::cleanUp()
 {
     delete [] fAdvDHList;
     delete fScanner;
-}
+    delete fGrammarResolver;
+    delete fURIStringPool;
 
+    if (fValidator)
+        delete fValidator;
+}
 
 
 // ---------------------------------------------------------------------------
@@ -396,9 +435,14 @@ bool SAXParser::isUsingCachedGrammarInParse() const
     return fScanner->isUsingCachedGrammarInParse();
 }
 
+bool SAXParser::getCalculateSrcOfs() const
+{
+    return fScanner->getCalculateSrcOfs();
+}
+
 Grammar* SAXParser::getGrammar(const XMLCh* const nameSpaceKey)
 {
-    return fScanner->getGrammar(nameSpaceKey);
+    return fGrammarResolver->getGrammar(nameSpaceKey);
 }
 
 Grammar* SAXParser::getRootGrammar()
@@ -489,6 +533,25 @@ void SAXParser::useCachedGrammarInParse(const bool newState)
         fScanner->useCachedGrammarInParse(newState);
 }
 
+void SAXParser::setCalculateSrcOfs(const bool newState)
+{
+    fScanner->setCalculateSrcOfs(newState);
+}
+
+void SAXParser::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);
+    }
+}
+
 
 // ---------------------------------------------------------------------------
 //  SAXParser: Overrides of the SAX Parser interface
@@ -1258,7 +1321,7 @@ Grammar* SAXParser::loadGrammar(const InputSource& source,
 
 void SAXParser::resetCachedGrammarPool()
 {
-    fScanner->resetCachedGrammarPool();
+    fGrammarResolver->resetCachedGrammar();
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/parsers/SAXParser.hpp b/src/xercesc/parsers/SAXParser.hpp
index 36afca30880cd79b9e45fb413207e13c59cd4a8c..8984ffb9bd07d02afcdd7b582c9f8abb5537fbbf 100644
--- a/src/xercesc/parsers/SAXParser.hpp
+++ b/src/xercesc/parsers/SAXParser.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.15  2002/12/04 01:57:09  knoaman
+ * Scanner re-organization.
+ *
  * Revision 1.14  2002/11/04 14:57:03  tng
  * C++ Namespace Support.
  *
@@ -199,6 +202,7 @@ class XMLPScanToken;
 class XMLScanner;
 class XMLValidator;
 class Grammar;
+class GrammarResolver;
 
 
 /**
@@ -477,6 +481,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
      *
@@ -730,6 +747,28 @@ 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);
 
     //@}
 
@@ -1803,6 +1842,11 @@ private:
     SAXParser(const SAXParser&);
     void operator=(const SAXParser&);
 
+    // -----------------------------------------------------------------------
+    //  Initialize/Cleanup methods
+    // -----------------------------------------------------------------------
+    void initialize();
+    void cleanUp();
 
     // -----------------------------------------------------------------------
     //  Private data members
@@ -1851,17 +1895,20 @@ private:
     //      during construction.
     //
     // -----------------------------------------------------------------------
-    VecAttrListImpl         fAttrList;
-    DocumentHandler*        fDocHandler;
-    DTDHandler*             fDTDHandler;
-    unsigned int            fElemDepth;
-    EntityResolver*         fEntityResolver;
-    ErrorHandler*           fErrorHandler;
-    unsigned int            fAdvDHCount;
-    XMLDocumentHandler**    fAdvDHList;
-    unsigned int            fAdvDHListSize;
-    bool                    fParseInProgress;
-    XMLScanner*             fScanner;
+    bool                 fParseInProgress;
+    unsigned int         fElemDepth;
+    unsigned int         fAdvDHCount;
+    unsigned int         fAdvDHListSize;
+    VecAttrListImpl      fAttrList;
+    DocumentHandler*     fDocHandler;
+    DTDHandler*          fDTDHandler;
+    EntityResolver*      fEntityResolver;
+    ErrorHandler*        fErrorHandler;
+    XMLDocumentHandler** fAdvDHList;
+    XMLScanner*          fScanner;
+    GrammarResolver*     fGrammarResolver;
+    XMLStringPool*       fURIStringPool;
+    XMLValidator*        fValidator;
 };
 
 
diff --git a/src/xercesc/parsers/XercesDOMParser.cpp b/src/xercesc/parsers/XercesDOMParser.cpp
index cdf7c343a021fb9274e482bd2078f8d0ee0ed24b..bdcbf5f0a5d2848ab46605296fd9d1eff1c9cb73 100644
--- a/src/xercesc/parsers/XercesDOMParser.cpp
+++ b/src/xercesc/parsers/XercesDOMParser.cpp
@@ -74,6 +74,7 @@
 #include <xercesc/util/IOException.hpp>
 #include <xercesc/internal/XMLScanner.hpp>
 #include <xercesc/parsers/XercesDOMParser.hpp>
+#include <xercesc/validators/common/GrammarResolver.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -111,7 +112,7 @@ bool XercesDOMParser::isUsingCachedGrammarInParse() const
 
 Grammar* XercesDOMParser::getGrammar(const XMLCh* const nameSpaceKey)
 {
-    return getScanner()->getGrammar(nameSpaceKey);
+    return getGrammarResolver()->getGrammar(nameSpaceKey);
 }
 
 Grammar* XercesDOMParser::getRootGrammar()
@@ -319,7 +320,7 @@ Grammar* XercesDOMParser::loadGrammar(const InputSource& source,
 
 void XercesDOMParser::resetCachedGrammarPool()
 {
-    getScanner()->resetCachedGrammarPool();
+    getGrammarResolver()->resetCachedGrammar();
 }
 
 XERCES_CPP_NAMESPACE_END