diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.cpp b/src/xercesc/dom/impl/DOMDocumentImpl.cpp
index d55fe97dd4af00a2b8eb8c0f746f9d9eb2830472..29ab3cffe561b3f900dc858e984ab0b7a14e5ef0 100644
--- a/src/xercesc/dom/impl/DOMDocumentImpl.cpp
+++ b/src/xercesc/dom/impl/DOMDocumentImpl.cpp
@@ -1011,7 +1011,7 @@ DOMNode* DOMDocumentImpl::adoptNode(DOMNode* sourceNode) {
     case DOCUMENT_NODE:
     case DOCUMENT_TYPE_NODE:
         throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, getMemoryManager());
-    case ATTRIBUTE_NODE:    
+    case ATTRIBUTE_NODE:
         {
             DOMAttr* sourceAttr=(DOMAttr*)sourceNode;
             DOMElement* sourceAttrElem=sourceAttr->getOwnerElement();
@@ -1314,11 +1314,20 @@ void DOMDocumentImpl::callUserDataHandlers(const DOMNodeImpl* n, DOMUserDataHand
     if (fUserDataTable) {
         RefHash2KeysTableOfEnumerator<DOMUserDataRecord> userDataEnum(fUserDataTable, false, fMemoryManager);
         userDataEnum.setPrimaryKey(n);
+        // Create a snapshot of the handlers to be called, as the "handle" callback could be invalidating the enumerator by calling
+        // setUserData on the dst node
+        ValueVectorOf< int > snapshot(3, fMemoryManager);
         while (userDataEnum.hasMoreElements()) {
             // get the key
             void* key;
             int key2;
             userDataEnum.nextElementKey(key,key2);
+            snapshot.addElement(key2);
+        }
+        ValueVectorEnumerator< int > snapshotEnum(&snapshot);
+        while(snapshotEnum.hasMoreElements())
+        {
+            int key2=snapshotEnum.nextElement();
 
             // get the DOMUserDataRecord
             DOMUserDataRecord* userDataRecord = fUserDataTable->get((void*)n,key2);