diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.cpp b/src/xercesc/dom/impl/DOMDocumentImpl.cpp
index c49f0edc509d4b8f50988e4171b41dbcbb35f58b..1a9e0b00bf450a97a59c50a1f0e5127700bf89b3 100644
--- a/src/xercesc/dom/impl/DOMDocumentImpl.cpp
+++ b/src/xercesc/dom/impl/DOMDocumentImpl.cpp
@@ -68,7 +68,7 @@ static const XMLSize_t kMaxSubAllocationSize =  0x1000;  // Any request for more
 //                             fNode and fParent constructors used here can not
 //                             allocate.
 //
-DOMDocumentImpl::DOMDocumentImpl(MemoryManager* const manager)
+DOMDocumentImpl::DOMDocumentImpl(DOMImplementation* domImpl, MemoryManager* const manager)
     : fNode(this),
       fParent(this),
       fNodeIDMap(0),
@@ -94,6 +94,7 @@ DOMDocumentImpl::DOMDocumentImpl(MemoryManager* const manager)
       fRanges(0),
       fNodeIterators(0),
       fMemoryManager(manager),
+      fDOMImplementation(domImpl),
       fChanges(0),      
       errorChecking(true)
 {
@@ -105,6 +106,7 @@ DOMDocumentImpl::DOMDocumentImpl(MemoryManager* const manager)
 DOMDocumentImpl::DOMDocumentImpl(const XMLCh *fNamespaceURI,
                                const XMLCh *qualifiedName,
                                DOMDocumentType *doctype,
+                               DOMImplementation* domImpl, 
                                MemoryManager* const manager)
     : fNode(this),
       fParent(this),
@@ -131,6 +133,7 @@ DOMDocumentImpl::DOMDocumentImpl(const XMLCh *fNamespaceURI,
       fRanges(0),
       fNodeIterators(0),
       fMemoryManager(manager),
+      fDOMImplementation(domImpl),
       fChanges(0),
       errorChecking(true)
 {
@@ -211,7 +214,7 @@ DOMDocumentImpl::~DOMDocumentImpl()
 DOMNode *DOMDocumentImpl::cloneNode(bool deep) const {
 
     // Note:  the cloned document node goes on the same heap we live in.
-    DOMDocumentImpl *newdoc = new (fMemoryManager) DOMDocumentImpl(fMemoryManager);
+    DOMDocumentImpl *newdoc = new (fMemoryManager) DOMDocumentImpl(fDOMImplementation, fMemoryManager);
     if(fXmlEncoding && *fXmlEncoding)
         newdoc->setXmlEncoding(fXmlEncoding);
     if(fXmlVersion && *fXmlVersion)
@@ -474,8 +477,8 @@ DOMNodeList *DOMDocumentImpl::getElementsByTagName(const XMLCh *tagname) const
 
 
 DOMImplementation   *DOMDocumentImpl::getImplementation() const {
-    // REVISIT: we should return the implementation that created us
-    return DOMImplementation::getImplementation();
+
+    return fDOMImplementation;
 }
 
 
diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.hpp b/src/xercesc/dom/impl/DOMDocumentImpl.hpp
index 683e00fea38cb52681b05b922067302eea649bea..4512463f40399d65527217edf9c39fe88c36d189 100644
--- a/src/xercesc/dom/impl/DOMDocumentImpl.hpp
+++ b/src/xercesc/dom/impl/DOMDocumentImpl.hpp
@@ -89,10 +89,11 @@ public:
     DOMNodeIDMap*         fNodeIDMap;     // for use by GetElementsById().
 
 public:
-    DOMDocumentImpl(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
+    DOMDocumentImpl(DOMImplementation* domImpl, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
     DOMDocumentImpl(const XMLCh*     namespaceURI,     //DOM Level 2
                     const XMLCh*     qualifiedName,
                     DOMDocumentType* doctype,
+                    DOMImplementation* domImpl, 
                     MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
     virtual ~DOMDocumentImpl();
 
@@ -332,6 +333,7 @@ private:
     Ranges*               fRanges;
     NodeIterators*        fNodeIterators;
     MemoryManager*        fMemoryManager;   // configurable memory manager
+    DOMImplementation*    fDOMImplementation;
 
     int                   fChanges;
     bool                  errorChecking;    // Bypass error checking.
diff --git a/src/xercesc/dom/impl/DOMImplementationImpl.cpp b/src/xercesc/dom/impl/DOMImplementationImpl.cpp
index 71be1ca8ce3aec6d075fa5c7e87358f7828a3d2b..1c6d342e6a1734cdb316dd29f63416bffdc68f19 100644
--- a/src/xercesc/dom/impl/DOMImplementationImpl.cpp
+++ b/src/xercesc/dom/impl/DOMImplementationImpl.cpp
@@ -232,7 +232,7 @@ DOMDocument *DOMImplementationImpl::createDocument(const XMLCh *namespaceURI,
 	const XMLCh *qualifiedName, DOMDocumentType *doctype,
     MemoryManager* const manager)
 {
-    return new (manager) DOMDocumentImpl(namespaceURI, qualifiedName, doctype, manager);
+    return new (manager) DOMDocumentImpl(namespaceURI, qualifiedName, doctype, this, manager);
 }
 
 
@@ -244,7 +244,7 @@ void* DOMImplementationImpl::getFeature(const XMLCh*, const XMLCh*) const {
 // Non-standard extension
 DOMDocument *DOMImplementationImpl::createDocument(MemoryManager* const manager)
 {
-        return new (manager) DOMDocumentImpl(manager);
+        return new (manager) DOMDocumentImpl(this, manager);
 }
 
 //