diff --git a/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp b/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp
index a673ac27756d2f12869368863d5e5cbd6496c72f..606910ef86cc5104ef81ec142df8a4da03b038ee 100644
--- a/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp
+++ b/src/xercesc/dom/impl/DOMCharacterDataImpl.cpp
@@ -36,12 +36,11 @@ DOMCharacterDataImpl::DOMCharacterDataImpl(DOMDocument *doc, const XMLCh *dat)
 {
     fDoc = (DOMDocumentImpl*)doc;
 
-    fDataBuf = fDoc->popBuffer(XMLString::stringLen(dat)+1);
+    XMLSize_t len=XMLString::stringLen(dat);
+    fDataBuf = fDoc->popBuffer(len+1);
     if (!fDataBuf)
-        fDataBuf = new (fDoc) DOMBuffer(fDoc, dat);
-    else
-        fDataBuf->set(dat);
-
+        fDataBuf = new (fDoc) DOMBuffer(fDoc, len+15);
+    fDataBuf->set(dat, len);
 }
 
 
@@ -51,12 +50,11 @@ DOMCharacterDataImpl::DOMCharacterDataImpl(const DOMCharacterDataImpl &other)
 {
     fDoc = (DOMDocumentImpl*)other.fDoc;
 
-    fDataBuf = fDoc->popBuffer(other.getLength()+1);
+    XMLSize_t len=other.getLength();
+    fDataBuf = fDoc->popBuffer(len+1);
     if (!fDataBuf)
-        fDataBuf = new (fDoc) DOMBuffer(fDoc, other.fDataBuf->getRawBuffer());
-    else
-        fDataBuf->set(other.fDataBuf->getRawBuffer());
-
+        fDataBuf = new (fDoc) DOMBuffer(fDoc, len+15);
+    fDataBuf->set(other.fDataBuf->getRawBuffer(), len);
 }
 
 
diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.hpp b/src/xercesc/dom/impl/DOMDocumentImpl.hpp
index 79f2257fcdb9f642bc6b1a97dd33136e5cfcc244..0323e668207ab8ae994553b6c437c9a3f57cb8d4 100644
--- a/src/xercesc/dom/impl/DOMDocumentImpl.hpp
+++ b/src/xercesc/dom/impl/DOMDocumentImpl.hpp
@@ -368,6 +368,12 @@ inline void * operator new(size_t amt, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocumen
     return p;
 }
 
+inline void * operator new(size_t amt, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocumentImpl *doc)
+{
+    void* p = doc->allocate(amt);
+    return p;
+}
+
 inline void * operator new(size_t amt, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *doc)
 {
     XERCES_CPP_NAMESPACE_QUALIFIER DOMMemoryManager* mgr=(XERCES_CPP_NAMESPACE_QUALIFIER DOMMemoryManager*)doc->getFeature(XERCES_CPP_NAMESPACE_QUALIFIER XMLUni::fgXercescInterfaceDOMMemoryManager,0);
@@ -391,6 +397,11 @@ inline void operator delete(void* /*ptr*/, XERCES_CPP_NAMESPACE_QUALIFIER DOMDoc
 {
     return;
 }
+
+inline void operator delete(void* /*ptr*/, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocumentImpl * /*doc*/)
+{
+    return;
+}
 inline void operator delete(void* /*ptr*/, XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument * /*doc*/)
 {
     return;
diff --git a/src/xercesc/dom/impl/DOMElementImpl.cpp b/src/xercesc/dom/impl/DOMElementImpl.cpp
index 899f5e7ef6ffd1f065c133f547f8248f9c58dc23..cfc899bb4e1abbae26c6ac591db516c597b5dd28 100644
--- a/src/xercesc/dom/impl/DOMElementImpl.cpp
+++ b/src/xercesc/dom/impl/DOMElementImpl.cpp
@@ -49,11 +49,11 @@ DOMElementImpl::DOMElementImpl(DOMDocument *ownerDoc, const XMLCh *eName)
     fName = docImpl->getPooledString(eName);
     setupDefaultAttributes();
     if (!fDefaultAttributes) {
-        fDefaultAttributes = new (getOwnerDocument()) DOMAttrMapImpl(this);
-        fAttributes = new (getOwnerDocument()) DOMAttrMapImpl(this);
+        fDefaultAttributes = new (docImpl) DOMAttrMapImpl(this);
+        fAttributes = new (docImpl) DOMAttrMapImpl(this);
     }
     else {
-        fAttributes = new (getOwnerDocument()) DOMAttrMapImpl(this, fDefaultAttributes);
+        fAttributes = new (docImpl) DOMAttrMapImpl(this, fDefaultAttributes);
     }
 }
 
diff --git a/src/xercesc/dom/impl/DOMStringPool.cpp b/src/xercesc/dom/impl/DOMStringPool.cpp
index c317e2c9fc27f55874f191fb8f88be6448d40be1..298695b84c7c606082cd91f47e7576918983d4ee 100644
--- a/src/xercesc/dom/impl/DOMStringPool.cpp
+++ b/src/xercesc/dom/impl/DOMStringPool.cpp
@@ -121,25 +121,6 @@ DOMBuffer::DOMBuffer(DOMDocumentImpl *doc, XMLSize_t capacity) :
     fBuffer[0] = XMLCh(0);
 }
 
-DOMBuffer::DOMBuffer(DOMDocumentImpl *doc, const XMLCh* string) :
-    fBuffer(0)
-    , fIndex(0)
-    , fCapacity(0)
-    , fDoc(doc)
-{
-    XMLSize_t actualCount = XMLString::stringLen(string);
-    fCapacity = actualCount + 15;
-
-    // Buffer is one larger than capacity, to allow for zero term
-    fBuffer = (XMLCh*) doc->allocate((fCapacity+1)*sizeof(XMLCh));
-
-    memcpy(fBuffer, string, actualCount * sizeof(XMLCh));
-    fIndex = actualCount;
-
-    // Keep it null terminated
-    fBuffer[fIndex] = 0;
-}
-
 // ---------------------------------------------------------------------------
 //  DOMBuffer: Buffer management
 // ---------------------------------------------------------------------------
diff --git a/src/xercesc/dom/impl/DOMStringPool.hpp b/src/xercesc/dom/impl/DOMStringPool.hpp
index 0bdbba8c78d988c53506f31d970fc345e46e8a6d..57e2ff0f87735c4d08dba43de6440b4bc616bd55 100644
--- a/src/xercesc/dom/impl/DOMStringPool.hpp
+++ b/src/xercesc/dom/impl/DOMStringPool.hpp
@@ -80,8 +80,6 @@ public :
     // -----------------------------------------------------------------------
     DOMBuffer(DOMDocumentImpl *doc, XMLSize_t capacity = 31);
 
-    DOMBuffer(DOMDocumentImpl *doc, const XMLCh* string);
-
     ~DOMBuffer()
     {
     }