Index: xml-xalan-trunk/src/xalanc/XercesParserLiaison/XercesParserLiaison.cpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XercesParserLiaison/XercesParserLiaison.cpp
+++ xml-xalan-trunk/src/xalanc/XercesParserLiaison/XercesParserLiaison.cpp
@@ -71,6 +71,7 @@ XercesParserLiaison::XercesParserLiaison
     m_doNamespaces(true),
     m_exitOnFirstFatalError(true),
     m_entityResolver(0),
+	m_xmlEntityResolver(0),
     m_errorHandler(this),
     m_externalSchemaLocation(theManager),
     m_externalNoNamespaceSchemaLocation(theManager),
@@ -94,6 +95,7 @@ XercesParserLiaison::XercesParserLiaison
     m_doNamespaces(true),
     m_exitOnFirstFatalError(true),
     m_entityResolver(0),
+	m_xmlEntityResolver(0),
     m_errorHandler(this),
     m_externalSchemaLocation(theManager),
     m_externalNoNamespaceSchemaLocation(theManager),
@@ -183,6 +185,10 @@ XercesParserLiaison::ensureSAXParser()
     {
         m_saxParser->setEntityResolver(m_entityResolver);
     }
+	if (m_xmlEntityResolver != 0)
+	{
+		m_saxParser->setXMLEntityResolver(m_xmlEntityResolver);
+	}
 
     m_saxParser->setErrorHandler(m_errorHandler);
 }
@@ -209,6 +215,10 @@ XercesParserLiaison::ensureDOMParser()
     {
         m_domParser->setEntityResolver(m_entityResolver);
     }
+	if (m_xmlEntityResolver != 0)
+	{
+		m_domParser->setXMLEntityResolver(m_xmlEntityResolver);
+	}
 
     m_domParser->setErrorHandler(m_errorHandler);
 
@@ -466,6 +476,24 @@ void
 XercesParserLiaison::setEntityResolver(EntityResolverType*  resolver)
 {
     m_entityResolver = resolver;
+	m_xmlEntityResolver = 0;
+}
+
+
+
+XMLEntityResolverType*
+XercesParserLiaison::getXMLEntityResolver() const
+{
+	return m_xmlEntityResolver;
+}
+
+
+
+void
+XercesParserLiaison::setXMLEntityResolver(XMLEntityResolverType* resolver)
+{
+	m_xmlEntityResolver = resolver;
+	m_entityResolver = 0;
 }
 
 
@@ -743,7 +771,14 @@ XercesParserLiaison::createDOMParser()
 
     theParser->setExpandEntityReferences(true);
     theParser->setDoNamespaces(m_doNamespaces);
-    theParser->setEntityResolver(m_entityResolver);
+	if (m_entityResolver != 0)
+	{
+		theParser->setEntityResolver(m_entityResolver);
+	}
+	if (m_xmlEntityResolver != 0)
+	{
+		theParser->setXMLEntityResolver(m_xmlEntityResolver);
+	}
 
     return theParser;
 }
Index: xml-xalan-trunk/src/xalanc/XercesParserLiaison/XercesParserLiaison.hpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XercesParserLiaison/XercesParserLiaison.hpp
+++ xml-xalan-trunk/src/xalanc/XercesParserLiaison/XercesParserLiaison.hpp
@@ -146,6 +146,12 @@ public:
 	virtual void
 	setEntityResolver(EntityResolverType*	resolver);
 
+	virtual XMLEntityResolverType*
+	getXMLEntityResolver() const;
+
+	virtual void
+	setXMLEntityResolver(XMLEntityResolverType*	resolver);
+
 
 	// These interfaces are new to XercesParserLiaison...
 
@@ -742,39 +748,41 @@ private:
 
 
 	// Data members...
-	int 				m_indent;
+	int 					m_indent;
+
+	bool					m_useValidation;
 
-	bool				m_useValidation;
+	bool					m_includeIgnorableWhitespace;
 
-	bool				m_includeIgnorableWhitespace;
+	bool					m_doNamespaces;
 
-	bool				m_doNamespaces;
+	bool					m_exitOnFirstFatalError;
 
-	bool				m_exitOnFirstFatalError;
+	EntityResolverType*		m_entityResolver;
 
-	EntityResolverType* m_entityResolver;
+	XMLEntityResolverType*	m_xmlEntityResolver;
 
-	ErrorHandlerType*	m_errorHandler;
+	ErrorHandlerType*		m_errorHandler;
 
-	XalanDOMString		m_externalSchemaLocation;
+	XalanDOMString			m_externalSchemaLocation;
 
-	XalanDOMString		m_externalNoNamespaceSchemaLocation;
+	XalanDOMString			m_externalNoNamespaceSchemaLocation;
 
-	DocumentMapType 	m_documentMap;
+	DocumentMapType 		m_documentMap;
 
-	bool				m_buildWrapper;
+	bool					m_buildWrapper;
 
-	bool				m_buildBridge;
+	bool					m_buildBridge;
 
-	bool				m_threadSafe;
+	bool					m_threadSafe;
 
-	bool				m_buildMaps;
+	bool					m_buildMaps;
 
-	ExecutionContext*	m_executionContext;
+	ExecutionContext*		m_executionContext;
 
-	SAXParserType*		m_saxParser;
+	SAXParserType*			m_saxParser;
 
-	DOMParserType*		m_domParser;
+	DOMParserType*			m_domParser;
 };
 
 
Index: xml-xalan-trunk/src/xalanc/XalanTransformer/XalanCompiledStylesheetDefault.cpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XalanTransformer/XalanCompiledStylesheetDefault.cpp
+++ xml-xalan-trunk/src/xalanc/XalanTransformer/XalanCompiledStylesheetDefault.cpp
@@ -32,10 +32,12 @@ public:
 	SetAndRestoreHandlers(
 			XMLParserLiaison&		theParserLiaison,
 			ErrorHandlerType*		theErrorHandler,
-			EntityResolverType*		theEntityResolver) :
+			EntityResolverType*		theEntityResolver,
+			XMLEntityResolverType*	theXMLEntityResolver) :
 		m_parserLiaison(theParserLiaison),
 		m_errorHandler(theParserLiaison.getErrorHandler()),
-		m_entityResolver(theParserLiaison.getEntityResolver())
+		m_entityResolver(theParserLiaison.getEntityResolver()),
+		m_xmlEntityResolver(theParserLiaison.getXMLEntityResolver())
 	{
 		if (theErrorHandler != 0)
 		{
@@ -46,22 +48,39 @@ public:
 		{
 			theParserLiaison.setEntityResolver(theEntityResolver);
 		}
+		if (theXMLEntityResolver != 0)
+		{
+			theParserLiaison.setXMLEntityResolver(theXMLEntityResolver);
+		}
 	}
 
 	~SetAndRestoreHandlers()
 	{
-		m_parserLiaison.setEntityResolver(m_entityResolver);
+		if (m_entityResolver != 0)
+		{
+			m_parserLiaison.setEntityResolver(m_entityResolver);
+		}
+		else if (m_xmlEntityResolver != 0)
+		{
+			m_parserLiaison.setXMLEntityResolver(m_xmlEntityResolver);
+		}
+		else
+		{
+			m_parserLiaison.setEntityResolver(0);
+		}
 
 		m_parserLiaison.setErrorHandler(m_errorHandler);
 	}
 
 private:
 
-	XMLParserLiaison&			m_parserLiaison;
-
-	ErrorHandlerType* const		m_errorHandler;
+	XMLParserLiaison&				m_parserLiaison;
 
-	EntityResolverType*	const	m_entityResolver;
+	ErrorHandlerType* const			m_errorHandler;
+ 
+	EntityResolverType*	const		m_entityResolver;
+ 
+	XMLEntityResolverType* const	m_xmlEntityResolver;
 };
 
 
@@ -73,12 +92,14 @@ compileStylesheet(
 			XSLTEngineImpl&							theProcessor,
 			StylesheetConstructionContextDefault&	theConstructionContext,
 			ErrorHandlerType*						theErrorHandler,
-			EntityResolverType*						theEntityResolver)
+			EntityResolverType*						theEntityResolver,
+			XMLEntityResolverType*					theXMLEntityResolver)
 {
 	const SetAndRestoreHandlers		theSetAndRestore(
 			theProcessor.getXMLParserLiaison(),
 			theErrorHandler,
-			theEntityResolver);
+			theEntityResolver,
+			theXMLEntityResolver);
 
 	return theProcessor.processStylesheet(theStylesheetSource, theConstructionContext);
 }
@@ -90,7 +111,8 @@ XalanCompiledStylesheetDefault::XalanCom
 			const XSLTInputSource&	theStylesheetSource,
 			XSLTEngineImpl&			theProcessor,
 			ErrorHandlerType*		theErrorHandler,
-			EntityResolverType*		theEntityResolver):
+			EntityResolverType*		theEntityResolver,
+			XMLEntityResolverType*	theXMLEntityResolver):
 	XalanCompiledStylesheet(),
 	m_stylesheetXPathFactory(theManager),
 	m_stylesheetConstructionContext(
@@ -102,7 +124,8 @@ XalanCompiledStylesheetDefault::XalanCom
 				theProcessor,
 				m_stylesheetConstructionContext,
 				theErrorHandler,
-				theEntityResolver))
+				theEntityResolver,
+				theXMLEntityResolver))
 {
 }
 
@@ -112,7 +135,8 @@ XalanCompiledStylesheetDefault::create(
 			const XSLTInputSource&	theStylesheetSource,
 			XSLTEngineImpl&			theProcessor,
 			ErrorHandlerType*		theErrorHandler,
-			EntityResolverType*		theEntityResolver)
+			EntityResolverType*		theEntityResolver,
+			XMLEntityResolverType*	theXMLEntityResolver)
 {
     typedef XalanCompiledStylesheetDefault ThisType;
 
@@ -125,7 +149,8 @@ XalanCompiledStylesheetDefault::create(
 			theStylesheetSource,
 			theProcessor,
 			theErrorHandler,
-			theEntityResolver);
+			theEntityResolver,
+			theXMLEntityResolver);
 
      theGuard.release();
 
Index: xml-xalan-trunk/src/xalanc/XalanTransformer/XalanCompiledStylesheetDefault.hpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XalanTransformer/XalanCompiledStylesheetDefault.hpp
+++ xml-xalan-trunk/src/xalanc/XalanTransformer/XalanCompiledStylesheetDefault.hpp
@@ -41,6 +41,7 @@
 
 
 XALAN_DECLARE_XERCES_CLASS(EntityResolver)
+XALAN_DECLARE_XERCES_CLASS(XMLEntityResolver)
 XALAN_DECLARE_XERCES_CLASS(ErrorHandler)
 
 
@@ -49,8 +50,9 @@ XALAN_CPP_NAMESPACE_BEGIN
 
 
 
-typedef XERCES_CPP_NAMESPACE_QUALIFIER EntityResolver	EntityResolverType;
-typedef XERCES_CPP_NAMESPACE_QUALIFIER ErrorHandler		ErrorHandlerType;
+typedef XERCES_CPP_NAMESPACE_QUALIFIER EntityResolver		EntityResolverType;
+typedef XERCES_CPP_NAMESPACE_QUALIFIER XMLEntityResolver	XMLEntityResolverType;
+typedef XERCES_CPP_NAMESPACE_QUALIFIER ErrorHandler			ErrorHandlerType;
 
 
 
@@ -63,7 +65,8 @@ public:
 			const XSLTInputSource&	theStylesheetSource,
 			XSLTEngineImpl&			theProcessor,
 			ErrorHandlerType*		theErrorHandler = 0,
-			EntityResolverType*		theEntityResolver = 0);
+			EntityResolverType*		theEntityResolver = 0,
+			XMLEntityResolverType*	theXMLEntityResolver = 0);
 
 	
 	static XalanCompiledStylesheetDefault*
@@ -72,7 +75,8 @@ public:
 			const XSLTInputSource&	theStylesheetSource,
 			XSLTEngineImpl&			theProcessor,
 			ErrorHandlerType*		theErrorHandler = 0,
-			EntityResolverType*		theEntityResolver = 0);
+			EntityResolverType*		theEntityResolver = 0,
+			XMLEntityResolverType*	theXMLEntityResolver = 0);
 
 	virtual
 	~XalanCompiledStylesheetDefault();
Index: xml-xalan-trunk/src/xalanc/XalanTransformer/XercesDOMParsedSource.cpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XalanTransformer/XercesDOMParsedSource.cpp
+++ xml-xalan-trunk/src/xalanc/XalanTransformer/XercesDOMParsedSource.cpp
@@ -82,6 +82,7 @@ XercesDOMParsedSource::XercesDOMParsedSo
 			bool					fValidate,
 			ErrorHandlerType*		theErrorHandler,
 			EntityResolverType*		theEntityResolver,
+			XMLEntityResolverType*	theXMLEntityResolver,
 			const XalanDOMChar*		theExternalSchemaLocation,
 			const XalanDOMChar*		theExternalNoNamespaceSchemaLocation,
             MemoryManagerType&      theManager) :
@@ -91,7 +92,16 @@ XercesDOMParsedSource::XercesDOMParsedSo
     m_uri(theManager)
 {
 	m_parserLiaison.setUseValidation(fValidate);
-	m_parserLiaison.setEntityResolver(theEntityResolver);
+
+	if (theEntityResolver != 0)
+	{
+		m_parserLiaison.setEntityResolver(theEntityResolver);
+	}
+	if (theXMLEntityResolver != 0)
+	{
+		m_parserLiaison.setXMLEntityResolver(theXMLEntityResolver);
+	}
+
 	m_parserLiaison.setErrorHandler(theErrorHandler);
 	m_parserLiaison.setExternalSchemaLocation(theExternalSchemaLocation);
 	m_parserLiaison.setExternalNoNamespaceSchemaLocation(theExternalNoNamespaceSchemaLocation);
@@ -125,6 +135,7 @@ XercesDOMParsedSource::create(
 			bool					fValidate,
 			ErrorHandlerType*		theErrorHandler,
 			EntityResolverType*		theEntityResolver,
+			XMLEntityResolverType*	theXMLEntityResolver,
 			const XalanDOMChar*		theExternalSchemaLocation,
 			const XalanDOMChar*		theExternalNoNamespaceSchemaLocation)
 {
@@ -139,6 +150,7 @@ XercesDOMParsedSource::create(
                             fValidate,
                             theErrorHandler,
                             theEntityResolver,
+							theXMLEntityResolver,
                             theExternalSchemaLocation,
                             theExternalNoNamespaceSchemaLocation,
                             theManager);
Index: xml-xalan-trunk/src/xalanc/XalanTransformer/XercesDOMParsedSource.hpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XalanTransformer/XercesDOMParsedSource.hpp
+++ xml-xalan-trunk/src/xalanc/XalanTransformer/XercesDOMParsedSource.hpp
@@ -75,6 +75,7 @@ public:
 			bool					fValidate = false,
 			ErrorHandlerType*		theErrorHandler = 0,
 			EntityResolverType*		theEntityResolver = 0,
+			XMLEntityResolverType*	theXMLEntityResolver = 0,
 			const XalanDOMChar*		theExternalSchemaLocation = 0,
 			const XalanDOMChar*		theExternalNoNamespaceSchemaLocation = 0,
             MemoryManagerType&      theManager XALAN_DEFAULT_MEMMGR);
@@ -86,6 +87,7 @@ public:
 			bool					fValidate = false,
 			ErrorHandlerType*		theErrorHandler = 0,
 			EntityResolverType*		theEntityResolver = 0,
+			XMLEntityResolverType*	theXMLEntityResolver = 0,
 			const XalanDOMChar*		theExternalSchemaLocation = 0,
 			const XalanDOMChar*		theExternalNoNamespaceSchemaLocation = 0);
 
Index: xml-xalan-trunk/src/xalanc/XalanTransformer/XalanDefaultParsedSource.cpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XalanTransformer/XalanDefaultParsedSource.cpp
+++ xml-xalan-trunk/src/xalanc/XalanTransformer/XalanDefaultParsedSource.cpp
@@ -153,6 +153,7 @@ XalanDefaultParsedSource::XalanDefaultPa
 			bool					fValidate,
 			ErrorHandlerType*		theErrorHandler,
 			EntityResolverType*		theEntityResolver,
+			XMLEntityResolverType*	theXMLEntityResolver,
 			const XalanDOMChar*		theExternalSchemaLocation,
 			const XalanDOMChar*		theExternalNoNamespaceSchemaLocation,
             bool                    fPoolAllTextNodes,
@@ -164,7 +165,16 @@ XalanDefaultParsedSource::XalanDefaultPa
     m_uri(theManager)
 {
 	m_parserLiaison.setUseValidation(fValidate);
-	m_parserLiaison.setEntityResolver(theEntityResolver);
+
+	if (theEntityResolver != 0)
+	{
+		m_parserLiaison.setEntityResolver(theEntityResolver);
+	}
+	if (theXMLEntityResolver != 0)
+	{
+		m_parserLiaison.setXMLEntityResolver(theXMLEntityResolver);
+	}
+
 	m_parserLiaison.setErrorHandler(theErrorHandler);
 	m_parserLiaison.setExternalSchemaLocation(theExternalSchemaLocation);
 	m_parserLiaison.setExternalNoNamespaceSchemaLocation(theExternalNoNamespaceSchemaLocation);
@@ -201,6 +211,7 @@ XalanDefaultParsedSource::create(
 			bool					fValidate,
 			ErrorHandlerType*		theErrorHandler,
 			EntityResolverType*		theEntityResolver,
+			XMLEntityResolverType*	theXMLEntityResolver,
 			const XalanDOMChar*		theExternalSchemaLocation,
 			const XalanDOMChar*		theExternalNoNamespaceSchemaLocation,
             bool                    fPoolAllTextNodes)
@@ -216,6 +227,7 @@ XalanDefaultParsedSource::create(
 			                fValidate,
 			                theErrorHandler,
 			                theEntityResolver,
+							theXMLEntityResolver,
 			                theExternalSchemaLocation,
 			                theExternalNoNamespaceSchemaLocation,
                             fPoolAllTextNodes,
Index: xml-xalan-trunk/src/xalanc/XalanTransformer/XalanTransformer.hpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XalanTransformer/XalanTransformer.hpp
+++ xml-xalan-trunk/src/xalanc/XalanTransformer/XalanTransformer.hpp
@@ -47,6 +47,7 @@ class ostream;
 
 
 XALAN_DECLARE_XERCES_CLASS(EntityResolver)
+XALAN_DECLARE_XERCES_CLASS(XMLEntityResolver)
 XALAN_DECLARE_XERCES_CLASS(ErrorHandler)
 
 
@@ -55,8 +56,9 @@ XALAN_CPP_NAMESPACE_BEGIN
 
 
 
-typedef XERCES_CPP_NAMESPACE_QUALIFIER EntityResolver   EntityResolverType;
-typedef XERCES_CPP_NAMESPACE_QUALIFIER ErrorHandler     ErrorHandlerType;
+typedef XERCES_CPP_NAMESPACE_QUALIFIER EntityResolver		EntityResolverType;
+typedef XERCES_CPP_NAMESPACE_QUALIFIER XMLEntityResolver	XMLEntityResolverType;
+typedef XERCES_CPP_NAMESPACE_QUALIFIER ErrorHandler			ErrorHandlerType;
 
 
 
@@ -568,6 +570,9 @@ public:
      * It allows applications to trap and redirect calls to
      * external entities.
      *
+	 * If both setEntityResolver and setXMLEntityResolver are called,
+	 * the last method called takes precedence.
+	 *
      * @param handler A pointer to the entity resolver to be called
      *             when the parser comes across references to
      *             entities in the XML file.
@@ -576,7 +581,38 @@ public:
     setEntityResolver(EntityResolverType*   theResolver)
     {
         m_entityResolver = theResolver;
-    }
+		m_xmlEntityResolver = 0;
+	}
+
+	/**
+	 * This method returns the installed XML entity resolver.
+	 *
+	 * @return The pointer to the installed entity resolver object.
+	 */
+	XMLEntityResolverType*
+	getXMLEntityResolver() const
+	{
+		return m_xmlEntityResolver;
+	}
+
+	/**
+	 * This method installs the user-specified XML entity resolver.
+	 * It allows applications to trap and redirect calls to
+	 * external entities.
+	 *
+	 * If both setEntityResolver and setXMLEntityResolver are called,
+	 * the last method called takes precedence.
+	 *
+	 * @param handler A pointer to the entity resolver to be called
+	 * 			   when the parser comes across references to
+	 * 			   entities in the XML file.
+	 */
+	void
+	setXMLEntityResolver(XMLEntityResolverType*	theXMLResolver)
+	{
+		m_xmlEntityResolver = theXMLResolver;
+		m_entityResolver = 0;
+ 	}
 
     /**
      * This method returns the installed error handler.
@@ -1056,7 +1092,9 @@ private:
 
     EntityResolverType*                     m_entityResolver;
 
-    ErrorHandlerType*                       m_errorHandler;
+    XMLEntityResolverType*                  m_xmlEntityResolver;
+
+	ErrorHandlerType*                       m_errorHandler;
 
     XalanDOMString                          m_externalSchemaLocation;
 
Index: xml-xalan-trunk/src/xalanc/XalanTransformer/XalanDefaultParsedSource.hpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XalanTransformer/XalanDefaultParsedSource.hpp
+++ xml-xalan-trunk/src/xalanc/XalanTransformer/XalanDefaultParsedSource.hpp
@@ -131,6 +131,7 @@ public:
 			bool					fValidate = false,
 			ErrorHandlerType*		theErrorHandler = 0,
 			EntityResolverType*		theEntityResolver = 0,
+			XMLEntityResolverType*	theXMLEntityResolver = 0,
 			const XalanDOMChar*		theExternalSchemaLocation = 0,
             const XalanDOMChar*     theExternalNoNamespaceSchemaLocation = 0,
             bool                    fPoolAllTextNodes = XalanSourceTreeDocument::getPoolAllTextNodes(),
@@ -143,6 +144,7 @@ public:
 			bool					fValidate = false,
 			ErrorHandlerType*		theErrorHandler = 0,
 			EntityResolverType*		theEntityResolver = 0,
+			XMLEntityResolverType*	theXMLEntityResolver = 0,
 			const XalanDOMChar*		theExternalSchemaLocation = 0,
 			const XalanDOMChar*		theExternalNoNamespaceSchemaLocation = 0,
             bool                    fPoolAllTextNodes = XalanSourceTreeDocument::getPoolAllTextNodes());
Index: xml-xalan-trunk/src/xalanc/XSLT/XSLTEngineImpl.cpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XSLT/XSLTEngineImpl.cpp
+++ xml-xalan-trunk/src/xalanc/XSLT/XSLTEngineImpl.cpp
@@ -23,10 +23,13 @@
 
 #include <xercesc/sax/DocumentHandler.hpp>
 #include <xercesc/sax/EntityResolver.hpp>
+#include <xercesc/util/XMLEntityResolver.hpp>
+XALAN_USING_XERCES(XMLResourceIdentifier)
 #include <xercesc/sax/Locator.hpp>
 
 
 
+
 #include <xalanc/Include/STLHelper.hpp>
 
 
@@ -562,17 +565,33 @@ XSLTEngineImpl::parseXML(
     {
         EntityResolverType* const   theResolver = 
             m_parserLiaison.getEntityResolver();
+		XMLEntityResolverType* const	theXMLResolver =
+			m_parserLiaison.getXMLEntityResolver();
 
-        if (theResolver == 0)
+		if (theResolver != 0)
         {
-            const XSLTInputSource   inputSource(c_wstr(urlString), m_parserLiaison.getMemoryManager());
+			const XalanAutoPtr<InputSourceType>		resolverInputSource =
+				theResolver->resolveEntity(0, c_wstr(urlString));
+ 
+			if (resolverInputSource.get() != 0)
+			{
+				doc = parseXML(*resolverInputSource.get(), docHandler, docToRegister);
+			}
+			else
+			{
+				const XSLTInputSource	inputSource(c_wstr(urlString), m_parserLiaison.getMemoryManager());
+
+				doc = parseXML(inputSource, docHandler, docToRegister);
+			}
+ 		}
+		else if (theXMLResolver != 0)
+ 		{
+			XMLResourceIdentifier rid(
+				XMLResourceIdentifier::ExternalEntity,
+				c_wstr(urlString));
 
-            doc = parseXML(inputSource, docHandler, docToRegister);
-        }
-        else
-        {
-            const XalanAutoPtr<InputSourceType> resolverInputSource =  
-                                theResolver->resolveEntity(0, c_wstr(urlString));
+ 			const XalanAutoPtr<InputSourceType>		resolverInputSource =
+				theXMLResolver->resolveEntity(&rid);
 
             if (resolverInputSource.get() != 0)
             {
@@ -590,7 +609,13 @@ XSLTEngineImpl::parseXML(
                             docHandler,
                             docToRegister);
             }
-        }
+		}
+		else
+		{
+			const XSLTInputSource	inputSource(c_wstr(urlString));
+
+			doc = parseXML(inputSource, docHandler, docToRegister);
+ 		}
 
         if (doc != 0)
         {
Index: xml-xalan-trunk/src/xalanc/XalanSourceTree/XalanSourceTreeParserLiaison.hpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XalanSourceTree/XalanSourceTreeParserLiaison.hpp
+++ xml-xalan-trunk/src/xalanc/XalanSourceTree/XalanSourceTreeParserLiaison.hpp
@@ -154,6 +154,13 @@ public:
     virtual void
     setEntityResolver(EntityResolverType*   resolver);
 
+ 	virtual XMLEntityResolverType*
+ 	getXMLEntityResolver() const;
+  
+ 	virtual void
+ 	setXMLEntityResolver(XMLEntityResolverType*	resolver);
+ 
+ 
 
     // These interfaces are new to XalanSourceTreeParserLiaison...
 
Index: xml-xalan-trunk/src/xalanc/XalanTransformer/XalanTransformer.cpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XalanTransformer/XalanTransformer.cpp
+++ xml-xalan-trunk/src/xalanc/XalanTransformer/XalanTransformer.cpp
@@ -113,6 +113,7 @@ XalanTransformer::XalanTransformer(Memor
     m_errorMessage(1, '\0', m_memoryManager),
     m_useValidation(false),
     m_entityResolver(0),
+	m_xmlEntityResolver(0),
     m_errorHandler(0),
     m_externalSchemaLocation(m_memoryManager),
     m_externalNoNamespaceSchemaLocation(m_memoryManager),
@@ -560,7 +561,15 @@ XalanTransformer::compileStylesheet(
 
         XalanSourceTreeParserLiaison    theParserLiaison(theDOMSupport, m_memoryManager);
 
-        theParserLiaison.setEntityResolver(m_entityResolver);
+		if (m_entityResolver != 0)
+		{
+			theParserLiaison.setEntityResolver(m_entityResolver);
+		}
+		if (m_xmlEntityResolver != 0)
+		{
+			theParserLiaison.setXMLEntityResolver(m_xmlEntityResolver);
+		}
+
         theParserLiaison.setErrorHandler(m_errorHandler);
 
         // Hook the two together...
@@ -606,7 +615,8 @@ XalanTransformer::compileStylesheet(
                         theStylesheetSource,
                         theProcessor,
                         m_errorHandler,
-                        m_entityResolver);
+                        m_entityResolver,
+						m_xmlEntityResolver);
 
         // Store it in a vector.
         m_compiledStylesheets.push_back(theCompiledStylesheet);
@@ -748,6 +758,7 @@ XalanTransformer::parseSource(
                         m_useValidation,
                         m_errorHandler,
                         m_entityResolver,
+						m_xmlEntityResolver,
                         getExternalSchemaLocation(),
                         getExternalNoNamespaceSchemaLocation());
         }
@@ -760,6 +771,7 @@ XalanTransformer::parseSource(
                         m_useValidation,
                         m_errorHandler,
                         m_entityResolver,
+						m_xmlEntityResolver,
                         getExternalSchemaLocation(),
                         getExternalNoNamespaceSchemaLocation());
         }
@@ -1206,7 +1218,15 @@ XalanTransformer::doTransform(
 
         theParserLiaison.setExecutionContext(*m_stylesheetExecutionContext);
 
-        theParserLiaison.setEntityResolver(m_entityResolver);
+		if (m_entityResolver != 0)
+		{
+			theParserLiaison.setEntityResolver(m_entityResolver);
+		}
+		if (m_xmlEntityResolver != 0)
+		{
+			theParserLiaison.setXMLEntityResolver(m_xmlEntityResolver);
+		}
+
         theParserLiaison.setErrorHandler(m_errorHandler);
         theParserLiaison.setUseValidation(m_useValidation);
 
Index: xml-xalan-trunk/src/xalanc/XSLT/XSLTProcessorEnvSupportDefault.cpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XSLT/XSLTProcessorEnvSupportDefault.cpp
+++ xml-xalan-trunk/src/xalanc/XSLT/XSLTProcessorEnvSupportDefault.cpp
@@ -22,6 +22,8 @@
 
 
 #include <xercesc/sax/EntityResolver.hpp>
+#include <xercesc/util/XMLEntityResolver.hpp>
+XALAN_USING_XERCES(XMLResourceIdentifier)
 #include <xercesc/util/XMLURL.hpp>
 
 
@@ -155,25 +157,38 @@ XSLTProcessorEnvSupportDefault::parseXML
 
 			EntityResolverType* const	theResolver = 
 				parserLiaison.getEntityResolver();
+			XMLEntityResolverType* const	theXMLResolver = 
+				parserLiaison.getXMLEntityResolver();
 
             const XalanDOMString    theEmptyString(theManager);
 
-			if (theResolver == 0)
+			if (theResolver != 0)
 			{
-				const XSLTInputSource	inputSource(urlText.c_str(), theManager);
+				const XalanAutoPtr<InputSourceType>		resolverInputSource =
+					theResolver->resolveEntity(0, c_wstr(urlText));
 
-                theDocument = parserLiaison.parseXMLStream(inputSource, theEmptyString);
-			}
-			else
-			{
-                XALAN_USING_XERCES(InputSource)
+				if (resolverInputSource.get() != 0)
+				{
+					theDocument = parserLiaison.parseXMLStream(*resolverInputSource.get(), theEmptyString);
+				}
+				else
+				{
+					const XSLTInputSource	inputSource(c_wstr(urlText), theManager);
 
-                typedef XalanAutoPtr<InputSource>   AutoPtrType;
+					theDocument = parserLiaison.parseXMLStream(inputSource, theEmptyString);
+				}
+ 			}
+			else if (theXMLResolver != 0)
+ 			{
+				XMLResourceIdentifier rid(
+					XMLResourceIdentifier::ExternalEntity,
+					c_wstr(urlString),
+					0,
+					0,
+					base.c_str());
 
-				const AutoPtrType   resolverInputSource(
-                                        theResolver->resolveEntity(
-                                            0,
-                                            urlText.c_str()));
+ 				const XalanAutoPtr<InputSourceType>		resolverInputSource =
+					theXMLResolver->resolveEntity(&rid);
 
 				if (resolverInputSource.get() != 0)
 				{
@@ -186,6 +201,12 @@ XSLTProcessorEnvSupportDefault::parseXML
 					theDocument = parserLiaison.parseXMLStream(inputSource, theEmptyString);
 				}
 			}
+			else
+			{
+				const XSLTInputSource	inputSource(c_wstr(urlText), theManager);
+
+				theDocument = parserLiaison.parseXMLStream(inputSource, theEmptyString);
+ 			}
 
 			if (theDocument != 0)
 			{
Index: xml-xalan-trunk/src/xalanc/XMLSupport/XMLParserLiaison.hpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XMLSupport/XMLParserLiaison.hpp
+++ xml-xalan-trunk/src/xalanc/XMLSupport/XMLParserLiaison.hpp
@@ -29,6 +29,7 @@
 
 XALAN_DECLARE_XERCES_CLASS(DocumentHandler)
 XALAN_DECLARE_XERCES_CLASS(EntityResolver)
+XALAN_DECLARE_XERCES_CLASS(XMLEntityResolver)
 XALAN_DECLARE_XERCES_CLASS(ErrorHandler)
 XALAN_DECLARE_XERCES_CLASS(InputSource)
 
@@ -38,10 +39,11 @@ XALAN_CPP_NAMESPACE_BEGIN
 
 
 
-typedef XERCES_CPP_NAMESPACE_QUALIFIER DocumentHandler	DocumentHandlerType;
-typedef XERCES_CPP_NAMESPACE_QUALIFIER EntityResolver	EntityResolverType;
-typedef XERCES_CPP_NAMESPACE_QUALIFIER ErrorHandler		ErrorHandlerType;
-typedef XERCES_CPP_NAMESPACE_QUALIFIER InputSource		InputSourceType;
+typedef XERCES_CPP_NAMESPACE_QUALIFIER DocumentHandler		DocumentHandlerType;
+typedef XERCES_CPP_NAMESPACE_QUALIFIER EntityResolver		EntityResolverType;
+typedef XERCES_CPP_NAMESPACE_QUALIFIER XMLEntityResolver	XMLEntityResolverType;
+typedef XERCES_CPP_NAMESPACE_QUALIFIER ErrorHandler			ErrorHandlerType;
+typedef XERCES_CPP_NAMESPACE_QUALIFIER InputSource			InputSourceType;
 
 class ExecutionContext;
 class FormatterListener;
@@ -202,6 +204,9 @@ public:
 	  * parser. It allows applications to trap and redirect calls to
 	  * external entities.
 	  *
+	  * If both setEntityResolver and setXMLEntityResolver are called the
+	  * last method called takes precedence.
+	  *
 	  * @param handler A pointer to the entity resolver to be called
 	  * 			   when the parser comes across references to
 	  * 			   entities in the XML file.
@@ -210,6 +215,29 @@ public:
 	setEntityResolver(EntityResolverType*	resolver) = 0;
 
 	/**
+	  * This method returns the installed XML entity resolver.
+	  *
+	  * @return The pointer to the installed entity resolver object.
+	  */
+	virtual XMLEntityResolverType*
+	getXMLEntityResolver() const = 0;
+
+	/**
+	  * This method installs the user specified XML entity resolver on the
+	  * parser. It allows applications to trap and redirect calls to
+	  * external entities.
+	  *
+	  * If both setEntityResolver and setXMLEntityResolver are called the
+	  * last method called takes precedence.
+	  *
+	  * @param handler A pointer to the entity resolver to be called
+	  * 			   when the parser comes across references to
+	  * 			   entities in the XML file.
+	  */
+	virtual void
+	setXMLEntityResolver(XMLEntityResolverType*	resolver) = 0;
+ 
+	/**
 	  * This method returns the installed error handler.
 	  *
 	  * @return The pointer to the installed error handler object.
Index: xml-xalan-trunk/src/xalanc/XalanSourceTree/XalanSourceTreeParserLiaison.cpp
===================================================================
--- xml-xalan-trunk.orig/src/xalanc/XalanSourceTree/XalanSourceTreeParserLiaison.cpp
+++ xml-xalan-trunk/src/xalanc/XalanSourceTree/XalanSourceTreeParserLiaison.cpp
@@ -578,7 +578,16 @@ XalanSourceTreeParserLiaison::ensureRead
         m_xmlReader->setErrorHandler(theHandler);
     }
 
-    m_xmlReader->setEntityResolver(getEntityResolver());
+ 	EntityResolverType *theEntityResolver = getEntityResolver();
+ 	if (theEntityResolver)
+ 	{
+ 		m_xmlReader->setEntityResolver(theEntityResolver);
+ 	}
+ 	XMLEntityResolverType *theXMLEntityResolver = getXMLEntityResolver();
+ 	if (theXMLEntityResolver)
+ 	{
+ 		m_xmlReader->setXMLEntityResolver(theXMLEntityResolver);
+ 	}
 
     {
         const XalanDOMChar* const   theLocation =
@@ -823,6 +832,19 @@ XalanSourceTreeParserLiaison::setEntityR
     m_xercesParserLiaison.setEntityResolver(resolver);
 }
 
+XMLEntityResolverType*
+XalanSourceTreeParserLiaison::getXMLEntityResolver() const
+{
+	return m_xercesParserLiaison.getXMLEntityResolver();
+}
+
+
+
+void
+XalanSourceTreeParserLiaison::setXMLEntityResolver(XMLEntityResolverType*	resolver)
+{
+	m_xercesParserLiaison.setXMLEntityResolver(resolver);
+}
 
 
 const XalanDOMChar*

