Finished unifying the code for Node#cloneNode and OMElement#cloneOMElement.

diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java
index 7a0eb80..e35bd69 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java
@@ -463,7 +463,7 @@
         throw new UnsupportedOperationException();
     }
 
-    ParentNode shallowClone(OMCloneOptions options, ParentNode targetParent) {
+    ParentNode shallowClone(OMCloneOptions options, ParentNode targetParent, boolean namespaceRepairing) {
         // Note: targetParent is always null here
         return new AttrImpl(localName, namespace, type, factory);
     }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttributeMap.java b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttributeMap.java
index d703bf3..39ecdd6 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttributeMap.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttributeMap.java
@@ -227,7 +227,7 @@
                 nodes.setSize(size);
                 for (int i = 0; i < size; ++i) {
                     AttrImpl n = (AttrImpl) srcnodes.elementAt(i);
-                    AttrImpl clone = (AttrImpl)n.clone(options, null, true);
+                    AttrImpl clone = (AttrImpl)n.clone(options, null, true, false);
                     clone.isSpecified(n.isSpecified());
                     nodes.setElementAt(clone, i);
                     clone.setOwnerElement(ownerNode, true);
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DocumentFragmentImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DocumentFragmentImpl.java
index 39d38a8..6ab6076 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DocumentFragmentImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DocumentFragmentImpl.java
@@ -80,7 +80,7 @@
         throw new UnsupportedOperationException("TODO");
     }
 
-    ParentNode shallowClone(OMCloneOptions options, ParentNode targetParent) {
+    ParentNode shallowClone(OMCloneOptions options, ParentNode targetParent, boolean namespaceRepairing) {
         return new DocumentFragmentImpl(factory);
     }
 
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DocumentImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DocumentImpl.java
index c661748..5dbfda7 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DocumentImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/DocumentImpl.java
@@ -588,7 +588,7 @@
         OMDocumentImplUtil.internalSerialize(this, writer, cache, includeXMLDeclaration);
     }
 
-    ParentNode shallowClone(OMCloneOptions options, ParentNode targetParent) {
+    ParentNode shallowClone(OMCloneOptions options, ParentNode targetParent, boolean namespaceRepairing) {
         DocumentImpl clone = new DocumentImpl(factory);
         clone.xmlVersion = xmlVersion;
         clone.xmlEncoding = xmlEncoding;
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ElementImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ElementImpl.java
index 6ae223e..ddf955a 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ElementImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ElementImpl.java
@@ -22,7 +22,6 @@
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMConstants;
-import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMFactory;
@@ -1113,26 +1112,34 @@
     }
 
     public OMElement cloneOMElement(OMCloneOptions options) {
-        return (OMElement)clone(options, null, true);
+        return (OMElement)clone(options, null, true, true);
     }
 
-    final ParentNode shallowClone(OMCloneOptions options, ParentNode targetParent) {
+    final ParentNode shallowClone(OMCloneOptions options, ParentNode targetParent, boolean namespaceRepairing) {
         ElementImpl clone;
         if (options.isPreserveModel()) {
-            clone = (ElementImpl)createClone(options, (OMContainer)targetParent);
+            clone = (ElementImpl)createClone(options, targetParent, namespaceRepairing);
         } else {
-            clone = (ElementImpl)factory.createOMElement(localName, namespace, (OMContainer)targetParent);
+            clone = new ElementImpl(targetParent, localName, namespace, null, factory, namespaceRepairing);
         }
         for (Iterator it = getAllDeclaredNamespaces(); it.hasNext(); ) {
             OMNamespace ns = (OMNamespace)it.next();
             clone.declareNamespace(ns);
         }
         clone.attributes.cloneContent(options, attributes);
+        if (namespaceRepairing) {
+            for (Iterator it = getAllAttributes(); it.hasNext(); ) {
+                OMNamespace ns = ((OMAttribute)it.next()).getNamespace();
+                if (ns != null) {
+                    clone.declareNamespace(ns);
+                }
+            }
+        }
         return clone;
     }
 
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return factory.createOMElement(localName, namespace, targetParent);
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent, boolean generateNSDecl) {
+        return new ElementImpl(targetParent, localName, namespace, null, factory, generateNSDecl);
     }
     
     public void setLineNumber(int lineNumber) {
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/LeafNode.java b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/LeafNode.java
index 4ee1fd4..65980f9 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/LeafNode.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/LeafNode.java
@@ -92,7 +92,7 @@
                                        DOMException.HIERARCHY_REQUEST_ERR, null));
     }
 
-    final NodeImpl clone(OMCloneOptions options, ParentNode targetParent, boolean deep) {
+    final NodeImpl clone(OMCloneOptions options, ParentNode targetParent, boolean deep, boolean namespaceRepairing) {
         beforeClone(options);
         LeafNode clone = createClone();
         if (targetParent != null) {
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java
index 8373328..1005e27 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/NodeImpl.java
@@ -156,7 +156,7 @@
         OMCloneOptions options = new OMCloneOptions();
         // This is not specified by the API, but it's compatible with versions before 1.2.14
         options.setPreserveModel(true);
-        NodeImpl clone = clone(options, null, getNodeType() == Node.ATTRIBUTE_NODE ? true : deep);
+        NodeImpl clone = clone(options, null, getNodeType() == Node.ATTRIBUTE_NODE ? true : deep, false);
         if (!(clone instanceof DocumentImpl)) {
             clone.setOwnerDocument(ownerDocument());
         }
@@ -877,5 +877,5 @@
     // by certain subclasses (for the reason, see AXIOM-385).
     public abstract void internalSerialize(XMLStreamWriter writer, boolean cache) throws XMLStreamException;
     
-    abstract NodeImpl clone(OMCloneOptions options, ParentNode targetParent, boolean deep);
+    abstract NodeImpl clone(OMCloneOptions options, ParentNode targetParent, boolean deep, boolean namespaceRepairing);
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
index ee207d9..8fa9925 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
@@ -504,17 +504,17 @@
         return false;
     }
 
-    final NodeImpl clone(OMCloneOptions options, ParentNode targetParent, boolean deep) {
-        ParentNode clone = shallowClone(options, targetParent);
+    final NodeImpl clone(OMCloneOptions options, ParentNode targetParent, boolean deep, boolean namespaceRepairing) {
+        ParentNode clone = shallowClone(options, targetParent, namespaceRepairing);
         if (deep) {
             for (Node child = getFirstChild(); child != null; child = child.getNextSibling()) {
-                ((NodeImpl)child).clone(options, clone, true);
+                ((NodeImpl)child).clone(options, clone, true, namespaceRepairing);
             }
         }
         return clone;
     }
     
-    abstract ParentNode shallowClone(OMCloneOptions options, ParentNode targetParent);
+    abstract ParentNode shallowClone(OMCloneOptions options, ParentNode targetParent, boolean namespaceRepairing);
 
     /**
      * This method is intended only to be used by Axiom intenals when merging Objects from different
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPBodyImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPBodyImpl.java
index 9c9429b..a05eebb 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPBodyImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPBodyImpl.java
@@ -19,13 +19,13 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMConstants;
-import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAP11Constants;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPBody;
@@ -48,15 +48,9 @@
 
     }
 
-    /**
-     * Constructor SOAPBodyImpl
-     *
-     * @param envelope
-     * @param builder
-     */
-    public SOAPBodyImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder,
-                        SOAPFactory factory) {
-        super(envelope, SOAPConstants.BODY_LOCAL_NAME, builder, factory);
+    public SOAPBodyImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, SOAPConstants.BODY_LOCAL_NAME, ns, builder, factory, generateNSDecl);
     }
 
     /**
@@ -167,8 +161,4 @@
         } 
 
     }
-
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return ((SOAPFactory)factory).createSOAPBody((SOAPEnvelope)targetParent);
-    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPElement.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPElement.java
index 9003a65..578bacd 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPElement.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPElement.java
@@ -20,6 +20,7 @@
 package org.apache.axiom.soap.impl.dom;
 
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
 import org.apache.axiom.om.impl.dom.ElementImpl;
@@ -48,17 +49,9 @@
         this.localName = localName;
     }
 
-
-    protected SOAPElement(OMElement parent,
-                          String localName,
-                          OMXMLParserWrapper builder,
-                          SOAPFactory factory) {
-        super((ParentNode) parent, localName, null, builder, factory, false);
-    }
-
-    protected SOAPElement(String localName, OMNamespace ns,
-                          SOAPFactory factory) {
-        super(null, localName, ns, null, factory, true);
+    public SOAPElement(ParentNode parentNode, String localName, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, localName, ns, builder, factory, generateNSDecl);
     }
 
     /** This has to be implemented by all the derived classes to check for the correct parent. */
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java
index 318ff71..bfd2458 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPEnvelopeImpl.java
@@ -21,15 +21,16 @@
 
 import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMConstants;
-import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.OMXMLParserWrapper;
 import org.apache.axiom.om.impl.MTOMXMLStreamWriter;
 import org.apache.axiom.om.impl.dom.DocumentImpl;
 import org.apache.axiom.om.impl.dom.NodeImpl;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.impl.util.OMSerializerUtil;
 import org.apache.axiom.soap.SOAP11Constants;
 import org.apache.axiom.soap.SOAP11Version;
@@ -55,14 +56,9 @@
 
     private static final QName HEADER_QNAME = new QName(SOAPConstants.HEADER_LOCAL_NAME);
 
-    /** @param builder  */
-    public SOAPEnvelopeImpl(OMXMLParserWrapper builder, SOAPFactory factory) {
-        super(null, SOAPConstants.SOAPENVELOPE_LOCAL_NAME, builder, factory);
-    }
-
-    /** @param ns  */
-    public SOAPEnvelopeImpl(OMNamespace ns, SOAPFactory factory) {
-        super(SOAPConstants.SOAPENVELOPE_LOCAL_NAME, ns, factory);
+    public SOAPEnvelopeImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, SOAPConstants.SOAPENVELOPE_LOCAL_NAME, ns, builder, factory, generateNSDecl);
     }
 
     public SOAPVersion getVersion() {
@@ -325,7 +321,7 @@
         return null;
     }
 
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return ((SOAPFactory)factory).createSOAPEnvelope(getNamespace());
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent, boolean generateNSDecl) {
+        return new SOAPEnvelopeImpl(targetParent, namespace, null, factory, generateNSDecl);
     }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultCodeImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultCodeImpl.java
index f8d51a1..cd40431 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultCodeImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultCodeImpl.java
@@ -19,10 +19,10 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.om.OMCloneOptions;
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.util.ElementHelper;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPFactory;
@@ -33,17 +33,10 @@
 import org.apache.axiom.soap.SOAPProcessingException;
 
 public abstract class SOAPFaultCodeImpl extends SOAPElement implements SOAPFaultCode {
-
-    /**
-     * Constructor OMElementImpl
-     *
-     * @param parent
-     * @param builder
-     */
-    public SOAPFaultCodeImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                             SOAPFactory factory) {
-        super(parent, factory.getSOAPVersion().getFaultCodeQName().getLocalPart(), builder,
-              factory);
+    public SOAPFaultCodeImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ((SOAPFactory)factory).getSOAPVersion().getFaultCodeQName().getLocalPart(),
+                ns, builder, factory, generateNSDecl);
     }
 
     /** @param parent  */
@@ -69,8 +62,4 @@
     public SOAPFaultSubCode getSubCode() {
         return (SOAPFaultSubCode)getFirstChildWithName(SOAP12Constants.QNAME_FAULT_SUBCODE);
     }
-
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return ((SOAPFactory)factory).createSOAPFaultCode((SOAPFault)targetParent);
-    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultDetailImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultDetailImpl.java
index 94cdc6f..2b5fbb8 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultDetailImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultDetailImpl.java
@@ -19,11 +19,11 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.om.OMCloneOptions;
-import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.impl.serialize.StreamWriterToContentHandlerConverter;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFault;
@@ -35,9 +35,10 @@
 import java.util.Iterator;
 
 public abstract class SOAPFaultDetailImpl extends SOAPElement implements SOAPFaultDetail {
-
-    protected SOAPFaultDetailImpl(OMNamespace ns, SOAPFactory factory) {
-        super(factory.getSOAPVersion().getFaultDetailQName().getLocalPart(), ns, factory);
+    public SOAPFaultDetailImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ((SOAPFactory)factory).getSOAPVersion().getFaultDetailQName().getLocalPart(),
+                ns, builder, factory, generateNSDecl);
     }
 
     protected SOAPFaultDetailImpl(SOAPFault parent,
@@ -48,13 +49,6 @@
                 extractNamespaceFromParent, factory);
     }
 
-    protected SOAPFaultDetailImpl(SOAPFault parent,
-                                  OMXMLParserWrapper builder,
-                                  SOAPFactory factory) {
-        super(parent, factory.getSOAPVersion().getFaultDetailQName().getLocalPart(), builder,
-                factory);
-    }
-
     public void addDetailEntry(OMElement detailElement) {
         this.addChild(detailElement);
     }
@@ -78,8 +72,4 @@
 
         super.internalSerialize(writer, cache);
     }
-
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return ((SOAPFactory)factory).createSOAPFaultDetail((SOAPFault)targetParent);
-    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultImpl.java
index e9ca25c..3f3eb52 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultImpl.java
@@ -19,11 +19,11 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMConstants;
-import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
 import org.apache.axiom.om.impl.dom.ElementImpl;
 import org.apache.axiom.om.impl.dom.ParentNode;
@@ -73,15 +73,9 @@
         super(parent, SOAPConstants.SOAPFAULT_LOCAL_NAME, true, factory);
     }
 
-    /**
-     * Constructor SOAPFaultImpl
-     *
-     * @param parent
-     * @param builder
-     */
-    public SOAPFaultImpl(SOAPBody parent, OMXMLParserWrapper builder,
-                         SOAPFactory factory) {
-        super(parent, SOAPConstants.SOAPFAULT_LOCAL_NAME, builder, factory);
+    public SOAPFaultImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, SOAPConstants.SOAPFAULT_LOCAL_NAME, ns, builder, factory, generateNSDecl);
     }
 
     protected abstract SOAPFaultDetail getNewSOAPFaultDetail(SOAPFault fault)
@@ -201,10 +195,4 @@
     protected abstract void serializeFaultNode(
             XMLStreamWriter writer)
             throws XMLStreamException;
-
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return e == null ?
-                ((SOAPFactory)factory).createSOAPFault((SOAPBody) targetParent):
-                ((SOAPFactory)factory).createSOAPFault((SOAPBody) targetParent, e);
-    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultNodeImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultNodeImpl.java
index fcb128c..28596da 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultNodeImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultNodeImpl.java
@@ -19,10 +19,10 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.om.OMCloneOptions;
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.impl.serialize.StreamWriterToContentHandlerConverter;
 import org.apache.axiom.om.impl.util.OMSerializerUtil;
 import org.apache.axiom.soap.SOAP12Constants;
@@ -41,10 +41,9 @@
         super(parent, SOAP12Constants.SOAP_FAULT_NODE_LOCAL_NAME, true, factory);
     }
 
-    public SOAPFaultNodeImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                             SOAPFactory factory) {
-        super(parent, SOAP12Constants.SOAP_FAULT_NODE_LOCAL_NAME, builder,
-              factory);
+    public SOAPFaultNodeImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, SOAP12Constants.SOAP_FAULT_NODE_LOCAL_NAME, ns, builder, factory, generateNSDecl);
     }
 
     public void setFaultNodeValue(String uri) {
@@ -107,8 +106,4 @@
 
 
     }
-
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return ((SOAPFactory)factory).createSOAPFaultNode((SOAPFault)targetParent);
-    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultReasonImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultReasonImpl.java
index 5698522..bfdbf12 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultReasonImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultReasonImpl.java
@@ -19,14 +19,14 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.om.OMCloneOptions;
-import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.util.ElementHelper;
 import org.apache.axiom.soap.SOAPFactory;
-import org.apache.axiom.soap.SOAPFault;
 import org.apache.axiom.soap.SOAPFaultReason;
 import org.apache.axiom.soap.SOAPFaultText;
 import org.apache.axiom.soap.SOAPProcessingException;
@@ -39,16 +39,10 @@
         SOAPFaultReason {
     protected SOAPFaultText text;
 
-    /**
-     * Constructor OMElementImpl
-     *
-     * @param parent
-     * @param builder
-     */
-    public SOAPFaultReasonImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                               SOAPFactory factory) {
-        super(parent, factory.getSOAPVersion().getFaultReasonQName().getLocalPart(), builder,
-              factory);
+    public SOAPFaultReasonImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ((SOAPFactory)factory).getSOAPVersion().getFaultReasonQName().getLocalPart(),
+                ns, builder, factory, generateNSDecl);
     }
 
     /** @param parent  */
@@ -80,8 +74,4 @@
         //TODO Ruchith
         throw new UnsupportedOperationException();
     }
-
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return ((SOAPFactory)factory).createSOAPFaultReason((SOAPFault)targetParent);
-    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultRoleImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultRoleImpl.java
index 11490c5..c3a9f77 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultRoleImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultRoleImpl.java
@@ -19,10 +19,10 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.om.OMCloneOptions;
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.impl.serialize.StreamWriterToContentHandlerConverter;
 import org.apache.axiom.om.impl.util.OMSerializerUtil;
 import org.apache.axiom.soap.SOAPFactory;
@@ -33,7 +33,6 @@
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
-
 public abstract class SOAPFaultRoleImpl extends SOAPElement implements
         SOAPFaultRole {
 
@@ -44,12 +43,9 @@
         super(parent, localName, extractNamespaceFromParent, factory);
     }
 
-    public SOAPFaultRoleImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                             SOAPFactory factory) {
-        super(parent,
-              factory.getSOAPVersion().getFaultRoleQName().getLocalPart(),
-              builder,
-              factory);
+    public SOAPFaultRoleImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ((SOAPFactory)factory).getSOAPVersion().getFaultRoleQName().getLocalPart(), ns, builder, factory, generateNSDecl);
     }
 
     public void setRoleValue(String uri) {
@@ -104,8 +100,4 @@
             // do not serialise the siblings
         }
     }
-
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return ((SOAPFactory)factory).createSOAPFaultRole((SOAPFault)targetParent);
-    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultSubCodeImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultSubCodeImpl.java
index 062dacf..2d55d2f 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultSubCodeImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultSubCodeImpl.java
@@ -19,14 +19,14 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.om.OMCloneOptions;
-import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.util.ElementHelper;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPFactory;
-import org.apache.axiom.soap.SOAPFaultCode;
 import org.apache.axiom.soap.SOAPFaultSubCode;
 import org.apache.axiom.soap.SOAPFaultValue;
 import org.apache.axiom.soap.SOAPProcessingException;
@@ -42,11 +42,9 @@
         super(parent, localName, true, factory);
     }
 
-    protected SOAPFaultSubCodeImpl(OMElement parent,
-                                   String localName,
-                                   OMXMLParserWrapper builder,
-                                   SOAPFactory factory) {
-        super(parent, localName, builder, factory);
+    public SOAPFaultSubCodeImpl(ParentNode parentNode, String localName, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, localName, ns, builder, factory, generateNSDecl);
     }
 
     public void setValue(SOAPFaultValue soapFaultSubCodeValue) throws SOAPProcessingException {
@@ -71,12 +69,4 @@
         }
         return subCode;
     }
-
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        if (targetParent instanceof SOAPFaultSubCode) {
-            return ((SOAPFactory)factory).createSOAPFaultSubCode((SOAPFaultSubCode)targetParent);
-        } else {
-            return ((SOAPFactory)factory).createSOAPFaultSubCode((SOAPFaultCode)targetParent);
-        }
-    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultTextImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultTextImpl.java
index 7ac7cf6..b77141b 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultTextImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultTextImpl.java
@@ -20,13 +20,12 @@
 package org.apache.axiom.soap.impl.dom;
 
 import org.apache.axiom.om.OMAttribute;
-import org.apache.axiom.om.OMCloneOptions;
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
 import org.apache.axiom.om.impl.dom.AttrImpl;
 import org.apache.axiom.om.impl.dom.DocumentImpl;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFaultReason;
@@ -49,16 +48,15 @@
                 SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_PREFIX);
     }
 
-    protected SOAPFaultTextImpl(SOAPFaultReason parent,
-                                OMXMLParserWrapper builder, SOAPFactory factory) {
-        super(parent, SOAP12Constants.SOAP_FAULT_TEXT_LOCAL_NAME, builder,
-              factory);
+    public SOAPFaultTextImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, SOAP12Constants.SOAP_FAULT_TEXT_LOCAL_NAME, ns, builder, factory, generateNSDecl);
+        // TODO Auto-generated constructor stub
         this.langNamespace = factory.createOMNamespace(
                 SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_URI,
                 SOAP12Constants.SOAP_FAULT_TEXT_LANG_ATTR_NS_PREFIX);
     }
 
-
     public void setLang(String lang) {
         langAttr =
                 new AttrImpl((DocumentImpl)getOwnerDocument(),
@@ -79,8 +77,4 @@
 
         return langAttr == null ? null : langAttr.getAttributeValue();
     }
-
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return ((SOAPFactory)factory).createSOAPFaultText((SOAPFaultReason)targetParent);
-    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultValueImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultValueImpl.java
index 4d9e0b5..47bdcd9 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultValueImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultValueImpl.java
@@ -19,13 +19,13 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.om.OMCloneOptions;
-import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPFactory;
-import org.apache.axiom.soap.SOAPFaultCode;
 import org.apache.axiom.soap.SOAPFaultValue;
 import org.apache.axiom.soap.SOAPProcessingException;
 
@@ -37,13 +37,8 @@
               factory);
     }
 
-    protected SOAPFaultValueImpl(OMElement parent, OMXMLParserWrapper builder,
-                                 SOAPFactory factory) {
-        super(parent, SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME, builder,
-              factory);
-    }
-
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return ((SOAPFactory)factory).createSOAPFaultValue((SOAPFaultCode)targetParent);
+    public SOAPFaultValueImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME, ns, builder, factory, generateNSDecl);
     }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderBlockImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderBlockImpl.java
index 9345775..b428320 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderBlockImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderBlockImpl.java
@@ -21,7 +21,6 @@
 
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMCloneOptions;
-import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMFactory;
@@ -34,8 +33,6 @@
 import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPCloneOptions;
 import org.apache.axiom.soap.SOAPConstants;
-import org.apache.axiom.soap.SOAPFactory;
-import org.apache.axiom.soap.SOAPHeader;
 import org.apache.axiom.soap.SOAPHeaderBlock;
 import org.apache.axiom.soap.SOAPProcessingException;
 
@@ -121,13 +118,7 @@
         }
     }
     
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        SOAPHeaderBlock clone = ((SOAPFactory)factory).createSOAPHeaderBlock(getLocalName(), getNamespace(), (SOAPHeader)targetParent);
-        copyData(options, clone);
-        return clone;
-    }
-
-    private void copyData(OMCloneOptions options, SOAPHeaderBlock targetSHB) {
+    protected final void copyData(OMCloneOptions options, SOAPHeaderBlock targetSHB) {
         // Copy the processed flag.  The other SOAPHeaderBlock information 
         // (e.g. role, mustUnderstand) are attributes on the tag and are copied elsewhere.
         Boolean processedFlag = options instanceof SOAPCloneOptions ? ((SOAPCloneOptions)options).getProcessedFlag() : null;
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderImpl.java
index 06aa8c3..1da24d7 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPHeaderImpl.java
@@ -19,14 +19,14 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.om.OMCloneOptions;
-import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.OMXMLParserWrapper;
 import org.apache.axiom.om.impl.OMNodeEx;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.RolePlayer;
 import org.apache.axiom.soap.SOAPConstants;
 import org.apache.axiom.soap.SOAPEnvelope;
@@ -51,15 +51,9 @@
 
     }
 
-    /**
-     * Constructor SOAPHeaderImpl
-     *
-     * @param envelope
-     * @param builder
-     */
-    public SOAPHeaderImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder,
-                          SOAPFactory factory) {
-        super(envelope, SOAPConstants.HEADER_LOCAL_NAME, builder, factory);
+    public SOAPHeaderImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, SOAPConstants.HEADER_LOCAL_NAME, ns, builder, factory, generateNSDecl);
     }
 
     public SOAPHeaderBlock addHeaderBlock(String localName, OMNamespace ns)
@@ -158,8 +152,4 @@
                             "parent. But received some other implementation");
         }
     }
-
-    protected OMElement createClone(OMCloneOptions options, OMContainer targetParent) {
-        return ((SOAPFactory)factory).createSOAPHeader((SOAPEnvelope)targetParent);
-    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/factory/DOMSOAPFactory.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/factory/DOMSOAPFactory.java
index 4fe3212..6564410 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/factory/DOMSOAPFactory.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/factory/DOMSOAPFactory.java
@@ -60,7 +60,7 @@
     }
 
     public SOAPEnvelope createSOAPEnvelope(OMXMLParserWrapper builder) {
-        return new SOAPEnvelopeImpl(builder, this);
+        return new SOAPEnvelopeImpl(null, null, builder, this, false);
     }
 
     public SOAPFault createSOAPFault(SOAPBody parent) throws SOAPProcessingException {
@@ -68,7 +68,7 @@
     }
 
     public final SOAPEnvelope getDefaultEnvelope() throws SOAPProcessingException {
-        SOAPEnvelopeImpl env = new SOAPEnvelopeImpl(getNamespace(), this);
+        SOAPEnvelopeImpl env = new SOAPEnvelopeImpl(null, getNamespace(), null, this, true);
         createSOAPHeader(env);
         createSOAPBody(env);
         return env;
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11BodyImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11BodyImpl.java
index e37d19b..8641231 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11BodyImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11BodyImpl.java
@@ -19,8 +19,13 @@
 
 package org.apache.axiom.soap.impl.dom.soap11;
 
+import org.apache.axiom.om.OMCloneOptions;
+import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFault;
@@ -34,15 +39,9 @@
         super(envelope, factory);
     }
 
-    /**
-     * Constructor SOAPBodyImpl
-     *
-     * @param envelope
-     * @param builder
-     */
-    public SOAP11BodyImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder,
-                          SOAPFactory factory) {
-        super(envelope, builder, factory);
+    public SOAP11BodyImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     public SOAPFault addFault(Exception e) throws OMException {
@@ -50,4 +49,8 @@
         this.hasSOAPFault = true;
         return soapFault;
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent, boolean generateNSDecl) {
+        return new SOAP11BodyImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11Factory.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11Factory.java
index 922e4af..dcfd24f 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11Factory.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11Factory.java
@@ -65,15 +65,15 @@
 
     public SOAPEnvelope createSOAPEnvelope() {
         return new SOAPEnvelopeImpl(
+                null,
                 new OMNamespaceImpl(
                         SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI,
                         SOAP11Constants.SOAP_DEFAULT_NAMESPACE_PREFIX),
-                this);
+                null, this, true);
     }
     
     public SOAPEnvelope createSOAPEnvelope(OMNamespace ns) {
-        return new SOAPEnvelopeImpl(ns,
-                                    this);
+        return new SOAPEnvelopeImpl(null, ns, null, this, true);
     }
 
     public SOAPHeader createSOAPHeader(SOAPEnvelope envelope)
@@ -83,7 +83,7 @@
 
     public SOAPHeader createSOAPHeader(SOAPEnvelope envelope,
                                        OMXMLParserWrapper builder) {
-        return new SOAP11HeaderImpl(envelope, builder, this);
+        return new SOAP11HeaderImpl((ParentNode)envelope, null, builder, this, false);
     }
 
 
@@ -117,7 +117,7 @@
 
     public SOAPFault createSOAPFault(SOAPBody parent,
                                      OMXMLParserWrapper builder) {
-        return new SOAP11FaultImpl(parent, builder, this);
+        return new SOAP11FaultImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPBody createSOAPBody(SOAPEnvelope envelope)
@@ -128,8 +128,7 @@
 
     public SOAPBody createSOAPBody(SOAPEnvelope envelope,
                                    OMXMLParserWrapper builder) {
-        return new SOAP11BodyImpl(envelope, builder, (SOAPFactory) envelope
-                .getOMFactory());
+        return new SOAP11BodyImpl((ParentNode)envelope, null, builder, this, false);
     }
 
     public SOAPFaultCode createSOAPFaultCode(SOAPFault parent)
@@ -139,7 +138,7 @@
 
     public SOAPFaultCode createSOAPFaultCode(SOAPFault parent,
                                              OMXMLParserWrapper builder) {
-        return new SOAP11FaultCodeImpl(parent, builder, this);
+        return new SOAP11FaultCodeImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent)
@@ -149,7 +148,7 @@
 
     public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent,
                                                OMXMLParserWrapper builder) {
-        return new SOAP11FaultValueImpl(parent, builder, this);
+        return new SOAP11FaultValueImpl((ParentNode)parent, null, builder, this, false);
     }
 
     //added
@@ -161,7 +160,7 @@
     //added
     public SOAPFaultValue createSOAPFaultValue(SOAPFaultSubCode parent,
                                                OMXMLParserWrapper builder) {
-        return new SOAP11FaultValueImpl(parent, builder, this);
+        return new SOAP11FaultValueImpl((ParentNode)parent, null, builder, this, false);
     }
 
     //changed
@@ -173,7 +172,7 @@
     //changed
     public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultCode parent,
                                                    OMXMLParserWrapper builder) {
-        return new SOAP11FaultSubCodeImpl(parent, builder, this);
+        return new SOAP11FaultSubCodeImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent)
@@ -183,7 +182,7 @@
 
     public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent,
                                                    OMXMLParserWrapper builder) {
-        return new SOAP11FaultSubCodeImpl(parent, builder, this);
+        return new SOAP11FaultSubCodeImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultReason createSOAPFaultReason(SOAPFault parent)
@@ -193,7 +192,7 @@
 
     public SOAPFaultReason createSOAPFaultReason(SOAPFault parent,
                                                  OMXMLParserWrapper builder) {
-        return new SOAP11FaultReasonImpl(parent, builder, this);
+        return new SOAP11FaultReasonImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent)
@@ -203,7 +202,7 @@
 
     public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent,
                                              OMXMLParserWrapper builder) {
-        return new SOAP11FaultTextImpl(parent, builder, this);
+        return new SOAP11FaultTextImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultNode createSOAPFaultNode(SOAPFault parent)
@@ -223,7 +222,7 @@
 
     public SOAPFaultRole createSOAPFaultRole(SOAPFault parent,
                                              OMXMLParserWrapper builder) {
-        return new SOAP11FaultRoleImpl(parent, builder, this);
+        return new SOAP11FaultRoleImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent)
@@ -233,11 +232,11 @@
 
     public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent,
                                                  OMXMLParserWrapper builder) {
-        return new SOAP11FaultDetailImpl(parent, builder, this);
+        return new SOAP11FaultDetailImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultDetail createSOAPFaultDetail() throws SOAPProcessingException {
-        return new SOAP11FaultDetailImpl(this);
+        return new SOAP11FaultDetailImpl(null, null, null, this, true);
     }
 
     public OMNamespace getNamespace() {
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultCodeImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultCodeImpl.java
index f61fbcc..1179444 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultCodeImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultCodeImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap11;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.impl.serialize.StreamWriterToContentHandlerConverter;
 import org.apache.axiom.om.impl.util.OMSerializerUtil;
 import org.apache.axiom.soap.SOAP11Constants;
@@ -36,15 +40,9 @@
 import javax.xml.stream.XMLStreamWriter;
 
 public class SOAP11FaultCodeImpl extends SOAPFaultCodeImpl {
-    /**
-     * Constructor OMElementImpl
-     *
-     * @param parent
-     * @param builder
-     */
-    public SOAP11FaultCodeImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                               SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP11FaultCodeImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     /** @param parent  */
@@ -110,4 +108,9 @@
     public void setValue(QName value) {
         setText(value);
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP11FaultCodeImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultDetailImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultDetailImpl.java
index af7b3f2..857fd2a 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultDetailImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultDetailImpl.java
@@ -19,16 +19,21 @@
 
 package org.apache.axiom.soap.impl.dom.soap11;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFault;
 import org.apache.axiom.soap.SOAPProcessingException;
 import org.apache.axiom.soap.impl.dom.SOAPFaultDetailImpl;
 
 public class SOAP11FaultDetailImpl extends SOAPFaultDetailImpl {
-    public SOAP11FaultDetailImpl(SOAPFactory factory) {
-        super(null, factory);
+    public SOAP11FaultDetailImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     public SOAP11FaultDetailImpl(SOAPFault parent, SOAPFactory factory)
@@ -36,11 +41,6 @@
         super(parent, false, factory);
     }
 
-    public SOAP11FaultDetailImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                                 SOAPFactory factory) {
-        super(parent, builder, factory);
-    }
-
     protected void checkParent(OMElement parent) throws SOAPProcessingException {
         if (!(parent instanceof SOAP11FaultImpl)) {
             throw new SOAPProcessingException(
@@ -48,4 +48,9 @@
                             "the parent. But received some other implementation");
         }
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP11FaultDetailImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultImpl.java
index 6975bcc..cd8173d 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap11;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAP11Constants;
 import org.apache.axiom.soap.SOAPBody;
 import org.apache.axiom.soap.SOAPFactory;
@@ -43,9 +47,9 @@
         super(parent, e, factory);
     }
 
-    public SOAP11FaultImpl(SOAPBody parent, OMXMLParserWrapper builder,
-                           SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP11FaultImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     /**
@@ -137,4 +141,13 @@
     public SOAPFaultNode getNode() {
         throw new UnsupportedOperationException("SOAP 1.1 has no Fault Node");
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        SOAPFault clone = new SOAP11FaultImpl(targetParent, namespace, null, factory, generateNSDecl);
+        if (e != null) {
+            clone.setException(e);
+        }
+        return clone;
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultReasonImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultReasonImpl.java
index 52092c9..2e64558 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultReasonImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultReasonImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap11;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.impl.serialize.StreamWriterToContentHandlerConverter;
 import org.apache.axiom.om.impl.util.OMSerializerUtil;
 import org.apache.axiom.soap.SOAP11Constants;
@@ -34,10 +38,9 @@
 import javax.xml.stream.XMLStreamWriter;
 
 public class SOAP11FaultReasonImpl extends SOAPFaultReasonImpl {
-
-    public SOAP11FaultReasonImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                                 SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP11FaultReasonImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     /** @param parent  */
@@ -88,4 +91,9 @@
     public SOAPFaultText getFirstSOAPText() {
         throw new UnsupportedOperationException("getFirstSOAPText() not supported for SOAP 1.1!");
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP11FaultReasonImpl(targetParent, namespace, builder, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultRoleImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultRoleImpl.java
index 1b47b85..efa9712 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultRoleImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultRoleImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap11;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.impl.serialize.StreamWriterToContentHandlerConverter;
 import org.apache.axiom.om.impl.util.OMSerializerUtil;
 import org.apache.axiom.soap.SOAP11Constants;
@@ -40,9 +44,9 @@
               factory);
     }
 
-    public SOAP11FaultRoleImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                               SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP11FaultRoleImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     protected void checkParent(OMElement parent) throws SOAPProcessingException {
@@ -75,4 +79,8 @@
         writer.writeEndElement();
     }
 
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP11FaultRoleImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultSubCodeImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultSubCodeImpl.java
index e1f4b1b..a096e9f 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultSubCodeImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultSubCodeImpl.java
@@ -21,9 +21,13 @@
 
 import javax.xml.namespace.QName;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMContainer;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFaultCode;
@@ -40,12 +44,9 @@
         super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, factory);
     }
 
-    //changed
-    public SOAP11FaultSubCodeImpl(SOAPFaultCode parent,
-                                  OMXMLParserWrapper builder,
-                                  SOAPFactory factory) {
-        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, builder,
-              factory);
+    public SOAP11FaultSubCodeImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, ns, builder, factory, generateNSDecl);
     }
 
     public SOAP11FaultSubCodeImpl(SOAPFaultSubCode parent, SOAPFactory factory)
@@ -53,13 +54,6 @@
         super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, factory);
     }
 
-    public SOAP11FaultSubCodeImpl(SOAPFaultSubCode parent,
-                                  OMXMLParserWrapper builder,
-                                  SOAPFactory factory) {
-        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, builder,
-              factory);
-    }
-
     protected void checkParent(OMElement parent) throws SOAPProcessingException {
         if (!(parent instanceof SOAP11FaultSubCodeImpl) ||
                 (parent instanceof SOAP11FaultCodeImpl)) {
@@ -95,4 +89,9 @@
         // TODO: AXIOM-394: SOAPFaultSubCode should not exist for SOAP 1.1
         throw new UnsupportedOperationException();
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP11FaultSubCodeImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultTextImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultTextImpl.java
index 0f25e20..628a3d8 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultTextImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultTextImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap11;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFaultReason;
 import org.apache.axiom.soap.SOAPProcessingException;
@@ -32,9 +36,9 @@
         super(parent, factory);
     }
 
-    public SOAP11FaultTextImpl(SOAPFaultReason parent,
-                               OMXMLParserWrapper builder, SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP11FaultTextImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     protected void checkParent(OMElement parent) throws SOAPProcessingException {
@@ -44,4 +48,9 @@
                             "as the parent. But received some other implementation");
         }
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP11FaultTextImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultValueImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultValueImpl.java
index d2f0564..822fbed 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultValueImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultValueImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap11;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPProcessingException;
 import org.apache.axiom.soap.impl.dom.SOAPFaultValueImpl;
@@ -32,12 +36,11 @@
         super(parent, factory);
     }
 
-    public SOAP11FaultValueImpl(OMElement parent, OMXMLParserWrapper builder,
-                                SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP11FaultValueImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
-
     protected void checkParent(OMElement parent) throws SOAPProcessingException {
         if (!((parent instanceof SOAP11FaultSubCodeImpl) ||
                 (parent instanceof SOAP11FaultCodeImpl))) {
@@ -48,4 +51,9 @@
                             parent.getClass());
         }
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP11FaultValueImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11HeaderBlockImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11HeaderBlockImpl.java
index 49b56af..ce22012 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11HeaderBlockImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11HeaderBlockImpl.java
@@ -19,6 +19,7 @@
 
 package org.apache.axiom.soap.impl.dom.soap11;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
@@ -26,6 +27,7 @@
 import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAP11Constants;
 import org.apache.axiom.soap.SOAPConstants;
+import org.apache.axiom.soap.SOAPHeaderBlock;
 import org.apache.axiom.soap.SOAPProcessingException;
 import org.apache.axiom.soap.SOAPVersion;
 import org.apache.axiom.soap.SOAP11Version;
@@ -126,4 +128,9 @@
         return SOAP11Version.getSingleton();
     }
 
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent, boolean generateNSDecl) {
+        SOAPHeaderBlock clone = new SOAP11HeaderBlockImpl(targetParent, getLocalName(), getNamespace(), null, factory, generateNSDecl);
+        copyData(options, clone);
+        return clone;
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11HeaderImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11HeaderImpl.java
index 317d46e..57f6030 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11HeaderImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11HeaderImpl.java
@@ -19,7 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap11;
 
+import org.apache.axiom.om.OMCloneOptions;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.impl.traverse.OMChildrenWithSpecificAttributeIterator;
 import org.apache.axiom.soap.SOAP11Constants;
 import org.apache.axiom.soap.SOAPEnvelope;
@@ -39,15 +44,9 @@
         super(envelope, factory);
     }
 
-    /**
-     * Constructor SOAPHeaderImpl
-     *
-     * @param envelope
-     * @param builder
-     */
-    public SOAP11HeaderImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder,
-                            SOAPFactory factory) {
-        super(envelope, builder, factory);
+    public SOAP11HeaderImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     public Iterator extractHeaderBlocks(String role) {
@@ -60,5 +59,8 @@
 
     }
 
-
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP11HeaderImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12BodyImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12BodyImpl.java
index 621dee4..6485253 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12BodyImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12BodyImpl.java
@@ -19,8 +19,13 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
+import org.apache.axiom.om.OMCloneOptions;
+import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFault;
@@ -34,15 +39,9 @@
         super(envelope, factory);
     }
 
-    /**
-     * Constructor SOAPBodyImpl
-     *
-     * @param envelope
-     * @param builder
-     */
-    public SOAP12BodyImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder,
-                          SOAPFactory factory) {
-        super(envelope, builder, factory);
+    public SOAP12BodyImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     public SOAPFault addFault(Exception e) throws OMException {
@@ -51,4 +50,8 @@
         this.hasSOAPFault = true;
         return soapFault;
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent, boolean generateNSDecl) {
+        return new SOAP12BodyImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12Factory.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12Factory.java
index 5e7fec2..56868bb 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12Factory.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12Factory.java
@@ -64,15 +64,15 @@
 
     public SOAPEnvelope createSOAPEnvelope() {
         return new SOAPEnvelopeImpl(
+                null,
                 new OMNamespaceImpl(
                         SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI,
                         SOAP12Constants.SOAP_DEFAULT_NAMESPACE_PREFIX),
-                this);
+                null, this, true);
     }
     
     public SOAPEnvelope createSOAPEnvelope(OMNamespace ns) {
-        return new SOAPEnvelopeImpl(ns,
-                                    this);
+        return new SOAPEnvelopeImpl(null, ns, null, this, true);
     }
 
     public SOAPHeader createSOAPHeader(SOAPEnvelope envelope) throws SOAPProcessingException {
@@ -81,7 +81,7 @@
 
     public SOAPHeader createSOAPHeader(SOAPEnvelope envelope,
                                        OMXMLParserWrapper builder) {
-        return new SOAP12HeaderImpl(envelope, builder, this);
+        return new SOAP12HeaderImpl((ParentNode)envelope, null, builder, this, false);
     }
 
     public SOAPHeaderBlock createSOAPHeaderBlock(String localName, OMNamespace ns)
@@ -112,7 +112,7 @@
 
     public SOAPFault createSOAPFault(SOAPBody parent,
                                      OMXMLParserWrapper builder) {
-        return new SOAP12FaultImpl(parent, builder, this);
+        return new SOAP12FaultImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPBody createSOAPBody(SOAPEnvelope envelope) throws SOAPProcessingException {
@@ -121,7 +121,7 @@
 
     public SOAPBody createSOAPBody(SOAPEnvelope envelope,
                                    OMXMLParserWrapper builder) {
-        return new SOAP12BodyImpl(envelope, builder, this);
+        return new SOAP12BodyImpl((ParentNode)envelope, null, builder, this, false);
     }
 
     public SOAPFaultCode createSOAPFaultCode(SOAPFault parent) throws SOAPProcessingException {
@@ -130,7 +130,7 @@
 
     public SOAPFaultCode createSOAPFaultCode(SOAPFault parent,
                                              OMXMLParserWrapper builder) {
-        return new SOAP12FaultCodeImpl(parent, builder, this);
+        return new SOAP12FaultCodeImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent)
@@ -140,7 +140,7 @@
 
     public SOAPFaultValue createSOAPFaultValue(SOAPFaultCode parent,
                                                OMXMLParserWrapper builder) {
-        return new SOAP12FaultValueImpl(parent, builder, this);
+        return new SOAP12FaultValueImpl((ParentNode)parent, null, builder, this, false);
     }
 
     //added
@@ -152,7 +152,7 @@
     //added
     public SOAPFaultValue createSOAPFaultValue(SOAPFaultSubCode parent,
                                                OMXMLParserWrapper builder) {
-        return new SOAP12FaultValueImpl(parent, builder, this);
+        return new SOAP12FaultValueImpl((ParentNode)parent, null, builder, this, false);
     }
 
     //changed
@@ -164,7 +164,7 @@
     //changed
     public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultCode parent,
                                                    OMXMLParserWrapper builder) {
-        return new SOAP12FaultSubCodeImpl(parent, builder, this);
+        return new SOAP12FaultSubCodeImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent)
@@ -174,7 +174,7 @@
 
     public SOAPFaultSubCode createSOAPFaultSubCode(SOAPFaultSubCode parent,
                                                    OMXMLParserWrapper builder) {
-        return new SOAP12FaultSubCodeImpl(parent, builder, this);
+        return new SOAP12FaultSubCodeImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultReason createSOAPFaultReason(SOAPFault parent) throws SOAPProcessingException {
@@ -183,7 +183,7 @@
 
     public SOAPFaultReason createSOAPFaultReason(SOAPFault parent,
                                                  OMXMLParserWrapper builder) {
-        return new SOAP12FaultReasonImpl(parent, builder, this);
+        return new SOAP12FaultReasonImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent)
@@ -193,7 +193,7 @@
 
     public SOAPFaultText createSOAPFaultText(SOAPFaultReason parent,
                                              OMXMLParserWrapper builder) {
-        return new SOAP12FaultTextImpl(parent, builder, this);
+        return new SOAP12FaultTextImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultNode createSOAPFaultNode(SOAPFault parent) throws SOAPProcessingException {
@@ -202,7 +202,7 @@
 
     public SOAPFaultNode createSOAPFaultNode(SOAPFault parent,
                                              OMXMLParserWrapper builder) {
-        return new SOAP12FaultNodeImpl(parent, builder, this);
+        return new SOAP12FaultNodeImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultRole createSOAPFaultRole(SOAPFault parent) throws SOAPProcessingException {
@@ -211,7 +211,7 @@
 
     public SOAPFaultRole createSOAPFaultRole(SOAPFault parent,
                                              OMXMLParserWrapper builder) {
-        return new SOAP12FaultRoleImpl(parent, builder, this);
+        return new SOAP12FaultRoleImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent) throws SOAPProcessingException {
@@ -220,11 +220,11 @@
 
     public SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent,
                                                  OMXMLParserWrapper builder) {
-        return new SOAP12FaultDetailImpl(parent, builder, this);
+        return new SOAP12FaultDetailImpl((ParentNode)parent, null, builder, this, false);
     }
 
     public SOAPFaultDetail createSOAPFaultDetail() throws SOAPProcessingException {
-        return new SOAP12FaultDetailImpl(this);
+        return new SOAP12FaultDetailImpl(null, getNamespace(), null, this, true);
     }
 
     public OMNamespace getNamespace() {
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultCodeImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultCodeImpl.java
index c65dab8..35b503c 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultCodeImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultCodeImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFault;
 import org.apache.axiom.soap.SOAPFaultSubCode;
@@ -31,15 +35,9 @@
 import javax.xml.namespace.QName;
 
 public class SOAP12FaultCodeImpl extends SOAPFaultCodeImpl {
-    /**
-     * Constructor OMElementImpl
-     *
-     * @param parent
-     * @param builder
-     */
-    public SOAP12FaultCodeImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                               SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP12FaultCodeImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     /** @param parent  */
@@ -89,4 +87,9 @@
         }
         valueElement.setText(value);
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP12FaultCodeImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultDetailImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultDetailImpl.java
index 9cf1c5d..8f0d743 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultDetailImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultDetailImpl.java
@@ -19,17 +19,21 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFault;
 import org.apache.axiom.soap.SOAPProcessingException;
 import org.apache.axiom.soap.impl.dom.SOAPFaultDetailImpl;
 
 public class SOAP12FaultDetailImpl extends SOAPFaultDetailImpl {
-
-    public SOAP12FaultDetailImpl(SOAPFactory factory) {
-        super(factory.getNamespace(), factory);
+    public SOAP12FaultDetailImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     public SOAP12FaultDetailImpl(SOAPFault parent, SOAPFactory factory)
@@ -37,11 +41,6 @@
         super(parent, true, factory);
     }
 
-    public SOAP12FaultDetailImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                                 SOAPFactory factory) {
-        super(parent, builder, factory);
-    }
-
     protected void checkParent(OMElement parent) throws SOAPProcessingException {
         if (!(parent instanceof SOAP12FaultImpl)) {
             throw new SOAPProcessingException(
@@ -49,4 +48,9 @@
                             "parent. But received some other implementation");
         }
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP12FaultDetailImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultImpl.java
index 4f25fc3..5d550f7 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPBody;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFault;
@@ -43,9 +47,9 @@
         super(parent, e, factory);
     }
 
-    public SOAP12FaultImpl(SOAPBody parent, OMXMLParserWrapper builder,
-                           SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP12FaultImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     /**
@@ -138,4 +142,13 @@
     public SOAPFaultRole getRole() {
         return (SOAPFaultRoleImpl)getFirstChildWithName(SOAP12Constants.QNAME_FAULT_ROLE);
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        SOAPFault clone = new SOAP12FaultImpl(targetParent, namespace, null, factory, generateNSDecl);
+        if (e != null) {
+            clone.setException(e);
+        }
+        return clone;
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultNodeImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultNodeImpl.java
index 60d085f..a41571d 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultNodeImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultNodeImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFault;
 import org.apache.axiom.soap.SOAPProcessingException;
@@ -32,9 +36,9 @@
         super(parent, factory);
     }
 
-    public SOAP12FaultNodeImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                               SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP12FaultNodeImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     protected void checkParent(OMElement parent) throws SOAPProcessingException {
@@ -44,4 +48,9 @@
                             "parent. But received some other implementation");
         }
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP12FaultNodeImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultReasonImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultReasonImpl.java
index c193d5e..bca1dfa 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultReasonImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultReasonImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFault;
 import org.apache.axiom.soap.SOAPFaultText;
@@ -29,10 +33,9 @@
 import org.apache.axiom.soap.impl.dom.SOAPFaultReasonImpl;
 
 public class SOAP12FaultReasonImpl extends SOAPFaultReasonImpl {
-
-    public SOAP12FaultReasonImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                                 SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP12FaultReasonImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     /** @param parent  */
@@ -62,4 +65,9 @@
     public SOAPFaultText getFirstSOAPText() {
         return (SOAPFaultText)getFirstChildWithName(SOAP12Constants.QNAME_FAULT_TEXT);
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP12FaultReasonImpl(targetParent, namespace, builder, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultRoleImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultRoleImpl.java
index 0efdc73..aa69087 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultRoleImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultRoleImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFault;
@@ -34,9 +38,9 @@
         super(parent, SOAP12Constants.SOAP_FAULT_ROLE_LOCAL_NAME, true, factory);
     }
 
-    public SOAP12FaultRoleImpl(SOAPFault parent, OMXMLParserWrapper builder,
-                               SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP12FaultRoleImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     protected void checkParent(OMElement parent) throws SOAPProcessingException {
@@ -46,4 +50,9 @@
                             "parent. But received some other implementation");
         }
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP12FaultRoleImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultSubCodeImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultSubCodeImpl.java
index deb2b40..c15032a 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultSubCodeImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultSubCodeImpl.java
@@ -21,8 +21,12 @@
 
 import javax.xml.namespace.QName;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFaultCode;
@@ -38,12 +42,9 @@
         super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, factory);
     }
 
-    //changed
-    public SOAP12FaultSubCodeImpl(SOAPFaultCode parent,
-                                  OMXMLParserWrapper builder,
-                                  SOAPFactory factory) {
-        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, builder,
-              factory);
+    public SOAP12FaultSubCodeImpl(ParentNode parentNode, OMNamespace ns,
+            OMXMLParserWrapper builder, OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, ns, builder, factory, generateNSDecl);
     }
 
     public SOAP12FaultSubCodeImpl(SOAPFaultSubCode parent, SOAPFactory factory)
@@ -51,13 +52,6 @@
         super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, factory);
     }
 
-    public SOAP12FaultSubCodeImpl(SOAPFaultSubCode parent,
-                                  OMXMLParserWrapper builder,
-                                  SOAPFactory factory) {
-        super(parent, SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME, builder,
-              factory);
-    }
-
     protected void checkParent(OMElement parent) throws SOAPProcessingException {
         if (!((parent instanceof SOAP12FaultSubCodeImpl) ||
                 (parent instanceof SOAP12FaultCodeImpl))) {
@@ -94,4 +88,9 @@
         }
         valueElement.setText(value);
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP12FaultSubCodeImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultTextImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultTextImpl.java
index e666b18..d75bd68 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultTextImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultTextImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFaultReason;
 import org.apache.axiom.soap.SOAPProcessingException;
@@ -33,10 +37,9 @@
         super(parent, factory);
     }
 
-    public SOAP12FaultTextImpl(SOAPFaultReason parent,
-                               OMXMLParserWrapper builder,
-                               SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP12FaultTextImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     protected void checkParent(OMElement parent) throws SOAPProcessingException {
@@ -46,4 +49,9 @@
                             "as the parent. But received some other implementation");
         }
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP12FaultTextImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
\ No newline at end of file
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultValueImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultValueImpl.java
index 62b2426..d9a0f44 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultValueImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultValueImpl.java
@@ -19,8 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPProcessingException;
 import org.apache.axiom.soap.impl.dom.SOAPFaultValueImpl;
@@ -32,8 +36,9 @@
         super(parent, factory);
     }
 
-    public SOAP12FaultValueImpl(OMElement parent, OMXMLParserWrapper builder, SOAPFactory factory) {
-        super(parent, builder, factory);
+    public SOAP12FaultValueImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     protected void checkParent(OMElement parent) throws SOAPProcessingException {
@@ -43,4 +48,9 @@
                     "Expecting SOAP 1.2 implementation of SOAP FaultSubCode or SOAP FaultCode as the parent. But received some other implementation");
         }
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP12FaultValueImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12HeaderBlockImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12HeaderBlockImpl.java
index c8e9a97..638a111 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12HeaderBlockImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12HeaderBlockImpl.java
@@ -19,6 +19,7 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
+import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
@@ -26,6 +27,7 @@
 import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPConstants;
+import org.apache.axiom.soap.SOAPHeaderBlock;
 import org.apache.axiom.soap.SOAPProcessingException;
 import org.apache.axiom.soap.SOAPVersion;
 import org.apache.axiom.soap.SOAP12Version;
@@ -122,4 +124,10 @@
     public SOAPVersion getVersion() {
         return SOAP12Version.getSingleton();
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent, boolean generateNSDecl) {
+        SOAPHeaderBlock clone = new SOAP12HeaderBlockImpl(targetParent, getLocalName(), getNamespace(), null, factory, generateNSDecl);
+        copyData(options, clone);
+        return clone;
+    }
 }
diff --git a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12HeaderImpl.java b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12HeaderImpl.java
index 116a61d..afd1829 100644
--- a/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12HeaderImpl.java
+++ b/modules/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12HeaderImpl.java
@@ -19,7 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
+import org.apache.axiom.om.OMCloneOptions;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.dom.ParentNode;
 import org.apache.axiom.om.impl.traverse.OMChildrenWithSpecificAttributeIterator;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPEnvelope;
@@ -37,15 +42,9 @@
         super(envelope, factory);
     }
 
-    /**
-     * Constructor SOAPHeaderImpl
-     *
-     * @param envelope
-     * @param builder
-     */
-    public SOAP12HeaderImpl(SOAPEnvelope envelope, OMXMLParserWrapper builder,
-                            SOAPFactory factory) {
-        super(envelope, builder, factory);
+    public SOAP12HeaderImpl(ParentNode parentNode, OMNamespace ns, OMXMLParserWrapper builder,
+            OMFactory factory, boolean generateNSDecl) {
+        super(parentNode, ns, builder, factory, generateNSDecl);
     }
 
     public Iterator extractHeaderBlocks(String role) {
@@ -56,4 +55,9 @@
                                                            role,
                                                            true);
     }
+
+    protected OMElement createClone(OMCloneOptions options, ParentNode targetParent,
+            boolean generateNSDecl) {
+        return new SOAP12HeaderImpl(targetParent, namespace, null, factory, generateNSDecl);
+    }
 }