diff --git a/src/xercesc/dom/NamedNodeMapImpl.cpp b/src/xercesc/dom/NamedNodeMapImpl.cpp
index 5b6ced9642568f76ea534f158d7fc668076f52fa..df58808ae2fe3818cebbc32bde8be7e5e72d47a9 100644
--- a/src/xercesc/dom/NamedNodeMapImpl.cpp
+++ b/src/xercesc/dom/NamedNodeMapImpl.cpp
@@ -268,7 +268,7 @@ NodeImpl * NamedNodeMapImpl::setNamedItem(NodeImpl * arg)
         throw DOM_DOMException(DOM_DOMException::WRONG_DOCUMENT_ERR,null);
     if (readOnly)
         throw DOM_DOMException(DOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, null);
-    if (arg->isOwned())
+    if ((arg->getNodeType() == DOM_Node::ATTRIBUTE_NODE) && arg->isOwned() && (arg->ownerNode != ownerNode))
         throw DOM_DOMException(DOM_DOMException::INUSE_ATTRIBUTE_ERR,null);
 
     arg->ownerNode = ownerNode;
diff --git a/src/xercesc/idom/IDNamedNodeMapImpl.cpp b/src/xercesc/idom/IDNamedNodeMapImpl.cpp
index afd23c57356cc20d75527ddd6e36ad1a141c732f..fcbbad510ca70d83024809f4b9dc485682a86939 100644
--- a/src/xercesc/idom/IDNamedNodeMapImpl.cpp
+++ b/src/xercesc/idom/IDNamedNodeMapImpl.cpp
@@ -243,15 +243,16 @@ IDOM_Node * IDNamedNodeMapImpl::removeNamedItem(const XMLCh *name)
 IDOM_Node * IDNamedNodeMapImpl::setNamedItem(IDOM_Node * arg)
 {
     IDOM_Document *doc = fOwnerNode->getOwnerDocument();
-    if(castToNodeImpl(arg)->getOwnerDocument() != doc)
+    IDNodeImpl *argImpl = castToNodeImpl(arg);
+    if(argImpl->getOwnerDocument() != doc)
         throw IDOM_DOMException(IDOM_DOMException::WRONG_DOCUMENT_ERR,0);
     if (this->readOnly())
         throw IDOM_DOMException(IDOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
-    if (castToNodeImpl(arg)->isOwned())
+    if ((arg->getNodeType() == IDOM_Node::ATTRIBUTE_NODE) && argImpl->isOwned() && (argImpl->fOwnerNode != fOwnerNode))
         throw IDOM_DOMException(IDOM_DOMException::INUSE_ATTRIBUTE_ERR,0);
 
-    castToNodeImpl(arg)->fOwnerNode = fOwnerNode;
-    castToNodeImpl(arg)->isOwned(true);
+    argImpl->fOwnerNode = fOwnerNode;
+    argImpl->isOwned(true);
     int i=findNamePoint(arg->getNodeName());
     IDOM_Node * previous=0;
     if(i>=0)
@@ -353,15 +354,16 @@ IDOM_Node *IDNamedNodeMapImpl::getNamedItemNS(const XMLCh *namespaceURI,
 IDOM_Node * IDNamedNodeMapImpl::setNamedItemNS(IDOM_Node *arg)
 {
     IDOM_Document *doc = fOwnerNode->getOwnerDocument();
-    if (castToNodeImpl(arg)->getOwnerDocument() != doc)
+    IDNodeImpl *argImpl = castToNodeImpl(arg);
+    if (argImpl->getOwnerDocument() != doc)
         throw IDOM_DOMException(IDOM_DOMException::WRONG_DOCUMENT_ERR,0);
     if (this->readOnly())
         throw IDOM_DOMException(IDOM_DOMException::NO_MODIFICATION_ALLOWED_ERR, 0);
-    if (castToNodeImpl(arg)->isOwned())
+    if (argImpl->isOwned())
         throw IDOM_DOMException(IDOM_DOMException::INUSE_ATTRIBUTE_ERR,0);
 
-    castToNodeImpl(arg)->fOwnerNode = fOwnerNode;
-    castToNodeImpl(arg)->isOwned(true);
+    argImpl->fOwnerNode = fOwnerNode;
+    argImpl->isOwned(true);
     int i=findNamePoint(arg->getNamespaceURI(), arg->getLocalName());
     IDOM_Node *previous=0;
     if(i>=0) {