diff --git a/src/xercesc/internal/DGXMLScanner.cpp b/src/xercesc/internal/DGXMLScanner.cpp
index 975d86caa54bda157708d9102cfb845eaff832f1..b8109719d03e415cec8e7e96abc7fb8265e547fe 100644
--- a/src/xercesc/internal/DGXMLScanner.cpp
+++ b/src/xercesc/internal/DGXMLScanner.cpp
@@ -2384,7 +2384,8 @@ InputSource* DGXMLScanner::resolveSystemId(const XMLCh* const sysId
         ReaderMgr::LastExtEntityInfo lastInfo;
         fReaderMgr.getLastExtEntityInfo(lastInfo);
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                            expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId);
+                            expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId,
+                            &fReaderMgr);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);       
     }
     else
diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp
index b84d7b60a3300ca4ae9ed77b1b962d3c859de2b0..2f53cb9c24d0ceba2d84a5617501aab6de106f09 100644
--- a/src/xercesc/internal/IGXMLScanner2.cpp
+++ b/src/xercesc/internal/IGXMLScanner2.cpp
@@ -1698,7 +1698,8 @@ void IGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
             ReaderMgr::LastExtEntityInfo lastInfo;
             fReaderMgr.getLastExtEntityInfo(lastInfo);
             XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::SchemaGrammar,
-                            expSysId.getRawBuffer(), uri, XMLUni::fgZeroLenString, lastInfo.systemId);
+                            expSysId.getRawBuffer(), uri, XMLUni::fgZeroLenString, lastInfo.systemId,
+                            &fReaderMgr);
             srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
         }
         else
@@ -1884,7 +1885,8 @@ InputSource* IGXMLScanner::resolveSystemId(const XMLCh* const sysId
         ReaderMgr::LastExtEntityInfo lastInfo;
         fReaderMgr.getLastExtEntityInfo(lastInfo);
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                              expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId);
+                              expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId,
+                              &fReaderMgr);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
     else
diff --git a/src/xercesc/internal/ReaderMgr.cpp b/src/xercesc/internal/ReaderMgr.cpp
index 1eccfc6d52f41da30babbf298cb87d7b08483f3d..a46c46b164182d0d58644a06ba756cb8da6e9210 100644
--- a/src/xercesc/internal/ReaderMgr.cpp
+++ b/src/xercesc/internal/ReaderMgr.cpp
@@ -494,7 +494,8 @@ XMLReader* ReaderMgr::createReader( const   XMLCh* const        sysId
         LastExtEntityInfo lastInfo;
         getLastExtEntityInfo(lastInfo);
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                            expSysId.getRawBuffer(), XMLUni::fgZeroLenString, pubId, lastInfo.systemId);
+                            expSysId.getRawBuffer(), XMLUni::fgZeroLenString, pubId, lastInfo.systemId,
+                            this);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
 
@@ -643,7 +644,8 @@ XMLReader* ReaderMgr::createReader( const   XMLCh* const        baseURI
     if (fEntityHandler)
     {
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                            expSysId.getRawBuffer(), XMLUni::fgZeroLenString, pubId, baseURI);
+                            expSysId.getRawBuffer(), XMLUni::fgZeroLenString, pubId, baseURI,
+                            this);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
 
diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp
index 96462b7e04fb3185ab4e2e4c0edf47ac215fb42c..158e77a95a299266378dbbd12250748e5f1c59d4 100644
--- a/src/xercesc/internal/SGXMLScanner.cpp
+++ b/src/xercesc/internal/SGXMLScanner.cpp
@@ -3540,7 +3540,8 @@ void SGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
             ReaderMgr::LastExtEntityInfo lastInfo;
             fReaderMgr.getLastExtEntityInfo(lastInfo);
             XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::SchemaGrammar,
-                            expSysId.getRawBuffer(), uri, XMLUni::fgZeroLenString, lastInfo.systemId);
+                            expSysId.getRawBuffer(), uri, XMLUni::fgZeroLenString, lastInfo.systemId,
+                            &fReaderMgr);
             srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
         }
         else
@@ -3705,7 +3706,8 @@ InputSource* SGXMLScanner::resolveSystemId(const XMLCh* const sysId
         ReaderMgr::LastExtEntityInfo lastInfo;
         fReaderMgr.getLastExtEntityInfo(lastInfo);
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                            expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId);
+                            expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId,
+                            &fReaderMgr);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
     else
diff --git a/src/xercesc/internal/XMLScanner.cpp b/src/xercesc/internal/XMLScanner.cpp
index 60f53afb8753c382f87be85611d2e2dbeed76be9..d1baf894158f7c7f3a088ed3f56176042d54615f 100644
--- a/src/xercesc/internal/XMLScanner.cpp
+++ b/src/xercesc/internal/XMLScanner.cpp
@@ -1658,7 +1658,8 @@ Grammar* XMLScanner::loadGrammar(const   XMLCh* const systemId
         ReaderMgr::LastExtEntityInfo lastInfo;
         fReaderMgr.getLastExtEntityInfo(lastInfo);
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                            systemId, 0, XMLUni::fgZeroLenString, lastInfo.systemId);
+                            systemId, 0, XMLUni::fgZeroLenString, lastInfo.systemId,
+                            &fReaderMgr);
         srcToUse = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
 
diff --git a/src/xercesc/util/XMLResourceIdentifier.hpp b/src/xercesc/util/XMLResourceIdentifier.hpp
index 4184f6f68cb8f9e9dffdd11f92caf32c555f8cb7..734548220223ab4640744335316a271c4590b643 100644
--- a/src/xercesc/util/XMLResourceIdentifier.hpp
+++ b/src/xercesc/util/XMLResourceIdentifier.hpp
@@ -23,6 +23,8 @@
 
 XERCES_CPP_NAMESPACE_BEGIN
 
+class Locator;
+
 /**
   * <p>This class is used along with XMLEntityResolver to resolve entities.
   * Instead of passing publicId and systemId on the resolveEntity call, 
@@ -93,7 +95,7 @@ class XMLUTIL_EXPORT XMLResourceIdentifier
 {
 public:
 
-    /** @name Public Contants */
+    /** @name Public Constants */
     //@{
     enum ResourceIdentifierType {
         SchemaGrammar = 0,
@@ -113,7 +115,8 @@ public:
                             , const XMLCh* const  systemId
                             , const XMLCh* const  nameSpace = 0
                             , const XMLCh* const  publicId = 0
-                            , const XMLCh* const  baseURI = 0);
+                            , const XMLCh* const  baseURI = 0
+                            , const Locator*      locator = 0);
 
     /** Destructor */
     ~XMLResourceIdentifier()
@@ -133,7 +136,7 @@ public:
     const XMLCh* getSchemaLocation()    const;
     const XMLCh* getBaseURI()           const;
     const XMLCh* getNameSpace()         const;
-
+    const Locator* getLocator()         const;
     //@}
 
 private :
@@ -143,7 +146,7 @@ private :
     const XMLCh*                    fSystemId;
     const XMLCh*                    fBaseURI;
     const XMLCh*                    fNameSpace;
-
+    const Locator*                  fLocator;
 
     /* Unimplemented constructors and operators */
 
@@ -185,16 +188,23 @@ inline const XMLCh* XMLResourceIdentifier::getNameSpace() const
     return fNameSpace;
 }
 
+inline const Locator* XMLResourceIdentifier::getLocator() const
+{
+    return fLocator;
+}
+
 inline XMLResourceIdentifier::XMLResourceIdentifier(const ResourceIdentifierType resourceIdentifierType
                             , const XMLCh* const  systemId
                             , const XMLCh* const  nameSpace
                             , const XMLCh* const  publicId
-                            , const XMLCh* const  baseURI )
+                            , const XMLCh* const  baseURI
+                            , const Locator*      locator )
     : fResourceIdentifierType(resourceIdentifierType)
     , fPublicId(publicId)
     , fSystemId(systemId)
     , fBaseURI(baseURI)     
     , fNameSpace(nameSpace)
+    , fLocator(locator)
 {
 }
 
diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp
index a07596d0bd8ab25a5214210ffc85abb9533dc59a..fbe23e9e96fbb4519420a806cdec1a673578302f 100644
--- a/src/xercesc/validators/schema/TraverseSchema.cpp
+++ b/src/xercesc/validators/schema/TraverseSchema.cpp
@@ -586,6 +586,9 @@ void TraverseSchema::preprocessInclude(const DOMElement* const elem) {
     // ------------------------------------------------------------------
     // Resolve schema location
     // ------------------------------------------------------------------
+    fLocator->setValues(fSchemaInfo->getCurrentSchemaURL(), 0,
+                        ((XSDElementNSImpl*) elem)->getLineNo(),
+                        ((XSDElementNSImpl*) elem)->getColumnNo());
     InputSource* srcToFill = resolveSchemaLocation(schemaLocation,
             XMLResourceIdentifier::SchemaInclude);
     Janitor<InputSource> janSrc(srcToFill);
@@ -779,6 +782,9 @@ void TraverseSchema::preprocessImport(const DOMElement* const elem) {
     // ------------------------------------------------------------------
     // Resolve schema location
     // ------------------------------------------------------------------
+    fLocator->setValues(fSchemaInfo->getCurrentSchemaURL(), 0,
+                        ((XSDElementNSImpl*) elem)->getLineNo(),
+                        ((XSDElementNSImpl*) elem)->getColumnNo());
     InputSource* srcToFill = resolveSchemaLocation(schemaLocation,
             XMLResourceIdentifier::SchemaImport, nameSpace);
 
@@ -6628,7 +6634,7 @@ InputSource* TraverseSchema::resolveSchemaLocation(const XMLCh* const loc,
 
     if (fEntityHandler){
         XMLResourceIdentifier resourceIdentifier(resourceIdentitiferType,
-                            normalizedURI, nameSpace, 0, fSchemaInfo->getCurrentSchemaURL());
+                            normalizedURI, nameSpace, 0, fSchemaInfo->getCurrentSchemaURL(), fLocator);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
 
@@ -7863,6 +7869,9 @@ bool TraverseSchema::openRedefinedSchema(const DOMElement* const redefineElem) {
     // ------------------------------------------------------------------
     // Resolve schema location
     // ------------------------------------------------------------------
+    fLocator->setValues(fSchemaInfo->getCurrentSchemaURL(), 0,
+                        ((XSDElementNSImpl*) redefineElem)->getLineNo(),
+                        ((XSDElementNSImpl*) redefineElem)->getColumnNo());
     InputSource*         srcToFill = resolveSchemaLocation(schemaLocation,
                                         XMLResourceIdentifier::SchemaRedefine);
     Janitor<InputSource> janSrc(srcToFill);