diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.cpp b/src/xercesc/dom/impl/DOMDocumentImpl.cpp
index aa9c7f20ff1548d84381190d00867b94b991ee56..3d6adb5ef2f8068cfa10eec329587f160e920b7e 100644
--- a/src/xercesc/dom/impl/DOMDocumentImpl.cpp
+++ b/src/xercesc/dom/impl/DOMDocumentImpl.cpp
@@ -362,7 +362,14 @@ DOMEntityReference *DOMDocumentImpl::createEntityReference(const XMLCh *nam)
     return new (this, DOMDocumentImpl::ENTITY_REFERENCE_OBJECT) DOMEntityReferenceImpl(this, nam);
 };
 
+DOMEntityReference *DOMDocumentImpl::createEntityReferenceByParser(const XMLCh *nam)
+{
+    if (!nam || !isXMLName(nam))
+        throw DOMException(
+        DOMException::INVALID_CHARACTER_ERR, 0);
 
+    return new (this, DOMDocumentImpl::ENTITY_REFERENCE_OBJECT) DOMEntityReferenceImpl(this, nam, false);
+};
 
 DOMNotation *DOMDocumentImpl::createNotation(const XMLCh *nam)
 {
diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.hpp b/src/xercesc/dom/impl/DOMDocumentImpl.hpp
index f813d288985e145d0f30625e259258d6486796c7..ecdcc11c83360984b5bfe58be822a7f39909a03f 100644
--- a/src/xercesc/dom/impl/DOMDocumentImpl.hpp
+++ b/src/xercesc/dom/impl/DOMDocumentImpl.hpp
@@ -197,6 +197,10 @@ public:
     virtual void                 removeNodeIterator(DOMNodeIteratorImpl* nodeIterator); //non-standard api
 
 
+    // Extension to be called by the Parser
+    DOMEntityReference*  createEntityReferenceByParser(const XMLCh * name);
+
+
     //
     // Functions to keep track of document mutations, so that node list chached
     //   information can be invalidated.  One global changes counter per document.
diff --git a/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp b/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp
index ad60caf5867edfc08b31ffa6dfeb431ac24d2570..0b626f520b07ce84d05ea83f7cef1ef2e97d4344 100644
--- a/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp
+++ b/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp
@@ -98,6 +98,35 @@ DOMEntityReferenceImpl::DOMEntityReferenceImpl(DOMDocument *ownerDoc,
 }
 
 
+DOMEntityReferenceImpl::DOMEntityReferenceImpl(DOMDocument *ownerDoc,
+                                         const XMLCh *entityName,
+                                         bool cloneChild)
+    : fNode(ownerDoc), fParent(ownerDoc), fBaseURI(0)
+{
+    fName = ((DOMDocumentImpl *)getOwnerDocument())->getPooledString(entityName);
+    // EntityReference behaves as a read-only node, since its contents
+    // reflect the Entity it refers to -- but see setNodeName().
+    //retrieve the corresponding entity content
+
+    if (ownerDoc) {
+        if (ownerDoc->getDoctype()) {
+            if (ownerDoc->getDoctype()->getEntities()) {
+                DOMEntityImpl* entity = (DOMEntityImpl*)ownerDoc->getDoctype()->getEntities()->getNamedItem(entityName);
+                if (entity) {
+                    fBaseURI = entity->getBaseURI();
+                    if (cloneChild) {
+                        DOMEntityReference* refEntity = entity->getEntityRef();
+                        if (refEntity) {
+                            fParent.cloneChildren(refEntity);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    fNode.setReadOnly(true, true);
+}
 
 DOMEntityReferenceImpl::DOMEntityReferenceImpl(const DOMEntityReferenceImpl &other,
                                          bool deep)
diff --git a/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp b/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp
index 3c54dc28f15661f5a3c8e69f35b4ecffffeba4c3..a2100e2b05ae55032a9b108a03a3bab1a201ac2b 100644
--- a/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp
+++ b/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp
@@ -94,6 +94,7 @@ private:
 
 public:
     DOMEntityReferenceImpl(DOMDocument *ownerDoc, const XMLCh *entityName);
+    DOMEntityReferenceImpl(DOMDocument *ownerDoc, const XMLCh *entityName, bool cloneChild);
     DOMEntityReferenceImpl(const DOMEntityReferenceImpl &other, bool deep=false);
     virtual ~DOMEntityReferenceImpl();
 
diff --git a/src/xercesc/parsers/AbstractDOMParser.cpp b/src/xercesc/parsers/AbstractDOMParser.cpp
index bc7f9a83823b25b4a3aee190397f6e0b22f66c82..0bcc9c586706bbdd612eaffaeed8d964b53555f5 100644
--- a/src/xercesc/parsers/AbstractDOMParser.cpp
+++ b/src/xercesc/parsers/AbstractDOMParser.cpp
@@ -1015,7 +1015,7 @@ void AbstractDOMParser::startEntityReference(const XMLEntityDecl& entDecl)
         entity->setActualEncoding(fScanner->getReaderMgr()->getCurrentEncodingStr());
     fCurrentEntity = entity;
 
-    DOMEntityReference *er = fDocument->createEntityReference(entName);
+    DOMEntityReference *er = fDocument->createEntityReferenceByParser(entName);
 
     //set the readOnly flag to false before appending node, will be reset in endEntityReference
     DOMEntityReferenceImpl *erImpl = (DOMEntityReferenceImpl *) er;