diff --git a/src/xercesc/parsers/DOMParser.cpp b/src/xercesc/parsers/DOMParser.cpp
index b9b0fda613171a058342c3cc5c1d83c1bc1e7754..bbf42a45205715d372d83f313763716bda7dc02b 100644
--- a/src/xercesc/parsers/DOMParser.cpp
+++ b/src/xercesc/parsers/DOMParser.cpp
@@ -505,18 +505,10 @@ void DOMParser::docCharacters(  const   XMLCh* const    chars
         else
         {
             DOM_Text node = fDocument.createTextNode(DOMString(chars, length));
-			//If the node type is entityRef then set the readOnly flag to false before appending node
-			bool oldReadFlag;
-			if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) {
-				oldReadFlag = fCurrentParent.fImpl->isReadOnly();
-				fCurrentParent.fImpl->isReadOnly(false);
-			}
-
             fCurrentParent.appendChild(node);
-			if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) {
-				fCurrentParent.fImpl->isReadOnly(oldReadFlag);
-			}
+
             fCurrentNode = node;
+
         }
     }
 }
@@ -547,6 +539,9 @@ void DOMParser::endEntityReference(const XMLEntityDecl& entDecl)
 {
     if (fCreateEntityReferenceNodes == true)
     {
+        if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) {
+            ((DOM_EntityReference&)fCurrentParent).fImpl->setReadOnly(true, true);
+        }
         fCurrentParent = fNodeStack->pop();
         fCurrentNode   = fCurrentParent;
     }
@@ -584,17 +579,7 @@ void DOMParser::ignorableWhitespace(const   XMLCh* const    chars
         DOM_Text node = fDocument.createTextNode(DOMString(chars, length));
         TextImpl *text = (TextImpl *) node.fImpl;
         text -> setIgnorableWhitespace(true);
-		//If the node type is entityRef then set the readOnly flag to false before appending node
-		bool oldReadFlag;
-		if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) {
-			oldReadFlag = fCurrentParent.fImpl->isReadOnly();
-			fCurrentParent.fImpl->isReadOnly(false);
-		}
-
         fCurrentParent.appendChild(node);
-		if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) {
-			fCurrentParent.fImpl->isReadOnly(oldReadFlag);
-		}
 
         fCurrentNode = node;
     }
@@ -679,39 +664,28 @@ void DOMParser::startElement(const  XMLElementDecl&         elemDecl
             attr->setSpecified(oneAttrib->getSpecified());
         }
     }
-	else {    //DOM Level 1
-			elem = fDocument.createElement(elemDecl.getFullName());
-			ElementImpl *elemImpl = (ElementImpl *) elem.fImpl;
-			for (unsigned int index = 0; index < attrCount; ++index) {
-				const XMLAttr* oneAttrib = attrList.elementAt(index);
-				AttrImpl *attr = elemImpl->setAttribute(oneAttrib->getName(), oneAttrib->getValue());
-				attr->setSpecified(oneAttrib->getSpecified());
-
-				// Attributes of type ID.  If this is one, add it to the hashtable of IDs
-				//   that is constructed for use by GetElementByID().
-				//
-				if (oneAttrib->getType()==XMLAttDef::ID)
-				{
-					if (docImpl->fNodeIDMap == 0)
-						docImpl->fNodeIDMap = new NodeIDMap(500);
-					docImpl->fNodeIDMap->add(attr);
-					attr->isIdAttr(true);
-				}
-
-		}
-    }
+    else {    //DOM Level 1
+        elem = fDocument.createElement(elemDecl.getFullName());
+        ElementImpl *elemImpl = (ElementImpl *) elem.fImpl;
+        for (unsigned int index = 0; index < attrCount; ++index) {
+            const XMLAttr* oneAttrib = attrList.elementAt(index);
+            AttrImpl *attr = elemImpl->setAttribute(oneAttrib->getName(), oneAttrib->getValue());
+            attr->setSpecified(oneAttrib->getSpecified());
 
-    //If the node type is entityRef then set the readOnly flag to false before appending node
-	bool oldReadFlag;
-	if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) {
-		oldReadFlag = fCurrentParent.fImpl->isReadOnly();
-		fCurrentParent.fImpl->isReadOnly(false);
-	}
+            // Attributes of type ID.  If this is one, add it to the hashtable of IDs
+            //   that is constructed for use by GetElementByID().
+            //
+            if (oneAttrib->getType()==XMLAttDef::ID)
+            {
+                if (docImpl->fNodeIDMap == 0)
+                    docImpl->fNodeIDMap = new NodeIDMap(500);
+                docImpl->fNodeIDMap->add(attr);
+                attr->isIdAttr(true);
+            }
+        }
+    }
 
     fCurrentParent.appendChild(elem);
-	if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) {
-		fCurrentParent.fImpl->isReadOnly(oldReadFlag);
-	}
 
     fNodeStack->push(fCurrentParent);
     fCurrentParent = elem;
@@ -730,6 +704,10 @@ void DOMParser::startEntityReference(const XMLEntityDecl& entDecl)
     {
 		DOMString entName(entDecl.getName());
         DOM_EntityReference er = fDocument.createEntityReference(entName);
+
+        //set the readOnly flag to false before appending node, will be reset in endEntityReference
+        er.fImpl->setReadOnly(false, true);
+
         fCurrentParent.appendChild(er);
         fNodeStack->push(fCurrentParent);
         fCurrentParent = er;
diff --git a/src/xercesc/parsers/IDOMParser.cpp b/src/xercesc/parsers/IDOMParser.cpp
index 8b7c423c22f32e7a95048b070836cd1c023d2cad..cbdea74da81320267be73ef75b1d482089793b8f 100644
--- a/src/xercesc/parsers/IDOMParser.cpp
+++ b/src/xercesc/parsers/IDOMParser.cpp
@@ -545,18 +545,7 @@ void IDOMParser::docCharacters(  const   XMLCh* const    chars
         else
         {
             IDOM_Text *node = fDocument->createTextNode(chars);
-            //If the node type is entityRef then set the readOnly flag to false before appending node
-            if (fCurrentParent->getNodeType() == IDOM_Node::ENTITY_REFERENCE_NODE) {
-                IDEntityReferenceImpl *erImpl = (IDEntityReferenceImpl *) fCurrentParent;
-                bool oldReadFlag = erImpl->fNode.isReadOnly();
-                erImpl->fNode.isReadOnly(false);
-                fCurrentParent->appendChild(node);
-                erImpl->fNode.isReadOnly(oldReadFlag);
-            }
-            else
-            {
-                fCurrentParent->appendChild(node);
-			   }
+            fCurrentParent->appendChild(node);
             fCurrentNode = node;
         }
     }
@@ -590,6 +579,10 @@ void IDOMParser::endEntityReference(const XMLEntityDecl& entDecl)
 {
     if (fCreateEntityReferenceNodes == true)
     {
+        if (fCurrentParent->getNodeType() == IDOM_Node::ENTITY_REFERENCE_NODE) {
+            IDEntityReferenceImpl *erImpl = (IDEntityReferenceImpl *) fCurrentParent;
+            erImpl->setReadOnly(true, true);
+        }
         fCurrentParent = fNodeStack->pop();
         fCurrentNode   = fCurrentParent;
     }
@@ -631,19 +624,7 @@ void IDOMParser::ignorableWhitespace(const   XMLCh* const    chars
     {
         IDTextImpl *node = (IDTextImpl *)fDocument->createTextNode(chars);
         node->setIgnorableWhitespace(true);
-        //If the node type is entityRef then set the readOnly flag to false before appending node
-        if (fCurrentParent->getNodeType() == IDOM_Node::ENTITY_REFERENCE_NODE) {
-            IDEntityReferenceImpl *erImpl = (IDEntityReferenceImpl *) fCurrentParent;
-            bool oldReadFlag = erImpl->fNode.isReadOnly();
-            erImpl->fNode.isReadOnly(false);
-            fCurrentParent->appendChild(node);
-            erImpl->fNode.isReadOnly(oldReadFlag);
-        }
-
-        else
-        {
-            fCurrentParent->appendChild(node);
-        }
+        fCurrentParent->appendChild(node);
 
         fCurrentNode = node;
     }
@@ -761,20 +742,7 @@ void IDOMParser::startElement(const  XMLElementDecl&         elemDecl
         }
     }
 
-    //If the node type is entityRef then set the readOnly flag to false before appending node
-    bool oldReadFlag;
-    if (fCurrentParent->getNodeType() == IDOM_Node::ENTITY_REFERENCE_NODE) {
-        IDEntityReferenceImpl *erNode = (IDEntityReferenceImpl *)fCurrentParent;
-        oldReadFlag = erNode->fNode.isReadOnly();
-        erNode->fNode.isReadOnly(false);
-        fCurrentParent->appendChild(elem);
-        erNode->fNode.isReadOnly(oldReadFlag);
-    }
-
-    else
-    {
-        fCurrentParent->appendChild(elem);
-    }
+    fCurrentParent->appendChild(elem);
 
     fNodeStack->push(fCurrentParent);
     fCurrentParent = elem;
@@ -793,6 +761,11 @@ void IDOMParser::startEntityReference(const XMLEntityDecl& entDecl)
     {
         const XMLCh * entName = entDecl.getName();
         IDOM_EntityReference *er = fDocument->createEntityReference(entName);
+
+        //set the readOnly flag to false before appending node, will be reset in endEntityReference
+        IDEntityReferenceImpl *erImpl = (IDEntityReferenceImpl *) er;
+        erImpl->setReadOnly(false, true);
+
         fCurrentParent->appendChild(er);
         fNodeStack->push(fCurrentParent);
         fCurrentParent = er;