You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2021/11/28 22:04:24 UTC

[ws-axiom] branch master updated: Eliminate most usages of the old NodeFactory

This is an automated email from the ASF dual-hosted git repository.

veithen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git


The following commit(s) were added to refs/heads/master by this push:
     new fbe7421  Eliminate most usages of the old NodeFactory
fbe7421 is described below

commit fbe7421649a9596b50cc53778bfa7211f9a2185d
Author: Andreas Veithen <an...@gmail.com>
AuthorDate: Sun Nov 28 22:02:41 2021 +0000

    Eliminate most usages of the old NodeFactory
---
 implementations/axiom-dom/pom.xml                  |  28 ++++
 .../om/impl/dom/factory/OMDOMMetaFactory.java      |  13 +-
 implementations/axiom-impl/pom.xml                 |  24 +++
 .../impl/llom/factory/OMLinkedListMetaFactory.java |  13 +-
 .../java/org/apache/axiom/core/CoreElement.java    |   2 +-
 .../axiom/core/impl/builder/BuildableContext.java  |  32 ++--
 .../axiom/core/impl/builder/BuilderHandler.java    |   8 +-
 .../axiom/core/impl/builder/BuilderImpl.java       |   4 +-
 .../org/apache/axiom/core/impl/builder/Model.java  |  14 +-
 .../axiom/core/impl/builder/PlainXMLModel.java     |   8 +-
 .../axiom/core/impl/mixin/CoreElementMixin.java    |   4 +-
 mixins/om-mixins/pom.xml                           |  26 ++++
 .../om/impl/common/factory/OMFactoryImpl.java      |  60 ++++----
 .../common/factory/meta/AbstractOMMetaFactory.java |   6 +-
 .../impl/common/factory/meta/BuilderFactory.java   |  12 +-
 .../axiom/om/impl/intf/AxiomInformationItem.java   |   5 +
 .../AxiomElementType.java}                         |  10 +-
 .../om/impl/intf/factory/AxiomNodeFactory.java     | 166 +++++++++++++++++++++
 .../om/impl/mixin/AxiomSourcedElementMixin.java    |   4 +-
 .../soap/impl/common/SOAPHeaderBlockMapper.java    |   5 +-
 .../impl/common/builder/SOAP11BuilderHelper.java   |  24 ++-
 .../impl/common/builder/SOAP12BuilderHelper.java   |  38 ++---
 .../impl/common/builder/SOAPBuilderHelper.java     |   3 +-
 .../axiom/soap/impl/common/builder/SOAPModel.java  |  33 ++--
 .../axiom/soap/impl/factory/SOAP11Factory.java     |   4 +-
 .../axiom/soap/impl/factory/SOAP12Factory.java     |  16 +-
 .../axiom/soap/impl/factory/SOAPFactoryImpl.java   |  39 ++---
 .../apache/axiom/soap/impl/intf/SOAPHelper.java    |  91 +++++------
 .../axiom/soap/impl/intf/soap11/SOAP11Helper.java  |  19 +--
 .../axiom/soap/impl/intf/soap12/SOAP12Helper.java  |  19 +--
 30 files changed, 504 insertions(+), 226 deletions(-)

diff --git a/implementations/axiom-dom/pom.xml b/implementations/axiom-dom/pom.xml
index cb8410e..529836c 100644
--- a/implementations/axiom-dom/pom.xml
+++ b/implementations/axiom-dom/pom.xml
@@ -131,6 +131,7 @@
                                 <interface>org.apache.axiom.om.impl.dom.intf.DOOMProcessingInstruction</interface>
                                 <interface>org.apache.axiom.om.impl.dom.intf.DOOMSourcedElement</interface>
                                 <interface>org.apache.axiom.om.impl.dom.intf.DOOMText</interface>
+                                <interface>org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory</interface>
                                 <interface>org.apache.axiom.soap.impl.dom.intf.DOOMSOAPMessage</interface>
                                 <interface>org.apache.axiom.soap.impl.dom.intf.soap11.DOOMSOAP11Body</interface>
                                 <interface>org.apache.axiom.soap.impl.dom.intf.soap11.DOOMSOAP11Envelope</interface>
@@ -165,6 +166,10 @@
                                     <outputPackage>org.apache.axiom.om.impl.dom</outputPackage>
                                 </packageMapping>
                                 <packageMapping>
+                                    <interfacePackage>org.apache.axiom.om.impl.intf.factory</interfacePackage>
+                                    <outputPackage>org.apache.axiom.om.impl.dom.factory</outputPackage>
+                                </packageMapping>
+                                <packageMapping>
                                     <interfacePackage>org.apache.axiom.soap.impl.intf</interfacePackage>
                                     <outputPackage>org.apache.axiom.soap.impl.dom</outputPackage>
                                 </packageMapping>
@@ -231,6 +236,29 @@
                     </instructions>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>com.github.veithen.phos</groupId>
+                <artifactId>enforcer-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>enforce</goal>
+                        </goals>
+                        <configuration>
+                            <ignore>
+                                <!-- TODO: inject the reference to the singleton into mixins directly -->
+                                org.apache.axiom.om.impl.dom.CoreNodeImpl -&gt; org.apache.axiom.om.impl.dom.factory.DOOMNodeFactory,
+                                org.apache.axiom.om.impl.dom.CoreNodeImpl -&gt; org.apache.axiom.om.impl.dom.factory.OMDOMMetaFactory,
+                                org.apache.axiom.om.impl.dom.DOOMNSAwareElementImpl -&gt; org.apache.axiom.om.impl.dom.factory.AxiomNodeFactoryImpl,
+                                org.apache.axiom.om.impl.dom.CoreChildNodeImpl -&gt; org.apache.axiom.om.impl.dom.factory.AxiomNodeFactoryImpl,
+                                org.apache.axiom.om.impl.dom.AxiomCoreParentNodeImpl -&gt; org.apache.axiom.om.impl.dom.factory.AxiomNodeFactoryImpl,
+                                org.apache.axiom.om.impl.dom.DOOMNSAwareAttributeImpl -&gt; org.apache.axiom.om.impl.dom.factory.AxiomNodeFactoryImpl,
+                                org.apache.axiom.om.impl.dom.DOOMNamespaceDeclarationImpl -&gt; org.apache.axiom.om.impl.dom.factory.AxiomNodeFactoryImpl
+                            </ignore>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMMetaFactory.java b/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMMetaFactory.java
index 7386745..4d9b1a2 100644
--- a/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMMetaFactory.java
+++ b/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/factory/OMDOMMetaFactory.java
@@ -23,16 +23,27 @@ import javax.xml.parsers.DocumentBuilderFactory;
 
 import org.apache.axiom.om.dom.DOMMetaFactory;
 import org.apache.axiom.om.impl.common.factory.meta.AbstractOMMetaFactory;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 import org.w3c.dom.DOMImplementation;
 
 /**
  * Meta factory for the DOOM implementation.
  */
 public class OMDOMMetaFactory extends AbstractOMMetaFactory implements DOMMetaFactory {
+    private static final AxiomNodeFactory NODE_FACTORY;
+
+    static {
+        try {
+            NODE_FACTORY = (AxiomNodeFactory)OMDOMMetaFactory.class.getClassLoader().loadClass("org.apache.axiom.om.impl.dom.factory.AxiomNodeFactoryImpl").getField("INSTANCE").get(null);
+        } catch (ReflectiveOperationException ex) {
+            throw new Error(ex);
+        }
+    }
+
     public static final OMDOMMetaFactory INSTANCE = new OMDOMMetaFactory();
     
     private OMDOMMetaFactory() {
-        super(DOOMNodeFactory.INSTANCE);
+        super(NODE_FACTORY);
     }
 
     @Override
diff --git a/implementations/axiom-impl/pom.xml b/implementations/axiom-impl/pom.xml
index e79fe91..a7252c1 100644
--- a/implementations/axiom-impl/pom.xml
+++ b/implementations/axiom-impl/pom.xml
@@ -114,6 +114,7 @@
                                 <interface>org.apache.axiom.om.impl.intf.AxiomNamespaceDeclaration</interface>
                                 <interface>org.apache.axiom.om.impl.intf.AxiomProcessingInstruction</interface>
                                 <interface>org.apache.axiom.om.impl.intf.AxiomSourcedElement</interface>
+                                <interface>org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory</interface>
                                 <interface>org.apache.axiom.soap.impl.intf.AxiomSOAPMessage</interface>
                                 <interface>org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11Body</interface>
                                 <interface>org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11Envelope</interface>
@@ -148,6 +149,10 @@
                                     <outputPackage>org.apache.axiom.om.impl.llom</outputPackage>
                                 </packageMapping>
                                 <packageMapping>
+                                    <interfacePackage>org.apache.axiom.om.impl.intf.factory</interfacePackage>
+                                    <outputPackage>org.apache.axiom.om.impl.llom.factory</outputPackage>
+                                </packageMapping>
+                                <packageMapping>
                                     <interfacePackage>org.apache.axiom.soap.impl.intf</interfacePackage>
                                     <outputPackage>org.apache.axiom.soap.impl.llom</outputPackage>
                                 </packageMapping>
@@ -193,6 +198,25 @@
                     </instructions>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>com.github.veithen.phos</groupId>
+                <artifactId>enforcer-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>enforce</goal>
+                        </goals>
+                        <configuration>
+                            <ignore>
+                                <!-- TODO: inject the reference to the singleton into mixins directly -->
+                                org.apache.axiom.om.impl.llom.CoreNodeImpl -&gt; org.apache.axiom.om.impl.llom.factory.AxiomNodeFactoryImpl,
+                                org.apache.axiom.om.impl.llom.CoreNodeImpl -&gt; org.apache.axiom.om.impl.llom.factory.LLOMNodeFactory,
+                                org.apache.axiom.om.impl.llom.CoreNodeImpl -&gt; org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory
+                            </ignore>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
 
diff --git a/implementations/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/factory/OMLinkedListMetaFactory.java b/implementations/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/factory/OMLinkedListMetaFactory.java
index efa1a5e..a81e88a 100644
--- a/implementations/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/factory/OMLinkedListMetaFactory.java
+++ b/implementations/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/factory/OMLinkedListMetaFactory.java
@@ -20,14 +20,25 @@
 package org.apache.axiom.om.impl.llom.factory;
 
 import org.apache.axiom.om.impl.common.factory.meta.AbstractOMMetaFactory;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 
 /**
  * Meta factory for the linked list OM implementation.
  */
 public class OMLinkedListMetaFactory extends AbstractOMMetaFactory {
+    private static final AxiomNodeFactory NODE_FACTORY;
+
+    static {
+        try {
+            NODE_FACTORY = (AxiomNodeFactory)OMLinkedListMetaFactory.class.getClassLoader().loadClass("org.apache.axiom.om.impl.llom.factory.AxiomNodeFactoryImpl").getField("INSTANCE").get(null);
+        } catch (ReflectiveOperationException ex) {
+            throw new Error(ex);
+        }
+    }
+
     public static final OMLinkedListMetaFactory INSTANCE = new OMLinkedListMetaFactory();
     
     private OMLinkedListMetaFactory() {
-        super(LLOMNodeFactory.INSTANCE);
+        super(NODE_FACTORY);
     }
 }
diff --git a/mixins/core-mixins/src/main/java/org/apache/axiom/core/CoreElement.java b/mixins/core-mixins/src/main/java/org/apache/axiom/core/CoreElement.java
index e7512a3..48e86c9 100644
--- a/mixins/core-mixins/src/main/java/org/apache/axiom/core/CoreElement.java
+++ b/mixins/core-mixins/src/main/java/org/apache/axiom/core/CoreElement.java
@@ -154,7 +154,7 @@ public interface CoreElement extends CoreChildNode, CoreMixedContentContainer, C
     // TODO: we can support default namespaces!
     String coreLookupPrefix(String namespaceURI, Semantics semantics) throws CoreModelException;
     
-    <T extends CoreElement> T corePromote(Class<T> type, Semantics semantics) throws CoreModelException;
+    void corePromote(CoreElement newElement, Semantics semantics) throws CoreModelException;
 
     void internalSetFirstAttribute(CoreAttribute firstAttribute);
 }
diff --git a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuildableContext.java b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuildableContext.java
index 8f25d94..017da17 100644
--- a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuildableContext.java
+++ b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuildableContext.java
@@ -128,7 +128,7 @@ final class BuildableContext extends Context implements InputContext {
     
     private void addChild(CoreChildNode node) {
         if (pendingCharacterData != null) {
-            CoreCharacterDataNode cdataNode = builderHandler.nodeFactory.getFactory2().createCharacterDataNode();
+            CoreCharacterDataNode cdataNode = builderHandler.nodeFactory.createCharacterDataNode();
             cdataNode.coreSetCharacterData(pendingCharacterData);
             target.internalAppendChildWithoutBuild(cdataNode);
             pendingCharacterData = null;
@@ -142,7 +142,10 @@ final class BuildableContext extends Context implements InputContext {
     @Override
     void startDocument(String inputEncoding, String xmlVersion, String xmlEncoding,
             Boolean standalone) {
-        CoreDocument document = builderHandler.nodeFactory.createNode(builderHandler.model.getDocumentType());
+        CoreDocument document = builderHandler.model.createDocument();
+        if (document == null) {
+            document = builderHandler.nodeFactory.createDocument();
+        }
         document.coreSetInputEncoding(inputEncoding);
         document.coreSetXmlVersion(xmlVersion);
         document.coreSetXmlEncoding(xmlEncoding);
@@ -163,7 +166,7 @@ final class BuildableContext extends Context implements InputContext {
         if (passThroughHandler != null) {
             passThroughHandler.processDocumentTypeDeclaration(rootName, publicId, systemId, internalSubset);
         } else {
-            CoreDocumentTypeDeclaration node = builderHandler.nodeFactory.getFactory2().createDocumentTypeDeclaration();
+            CoreDocumentTypeDeclaration node = builderHandler.nodeFactory.createDocumentTypeDeclaration();
             node.coreSetRootName(rootName);
             node.coreSetPublicId(publicId);
             node.coreSetSystemId(systemId);
@@ -179,8 +182,11 @@ final class BuildableContext extends Context implements InputContext {
             passThroughHandler.startElement(namespaceURI, localName, prefix);
             return this;
         } else {
-            CoreNSAwareElement element = builderHandler.nodeFactory.createNode(builderHandler.model.determineElementType(
-                    target, depth+1, namespaceURI, localName));
+            CoreNSAwareElement element = builderHandler.model.createElement(
+                    target, depth+1, namespaceURI, localName);
+            if (element == null) {
+                element = builderHandler.nodeFactory.createNSAwareElement();
+            }
             element.coreSetState(CoreParentNode.ATTRIBUTES_PENDING);
             element.initName(namespaceURI, localName, prefix, builderHandler.namespaceHelper);
             addChild(element);
@@ -203,7 +209,7 @@ final class BuildableContext extends Context implements InputContext {
         if (passThroughHandler != null) {
             passThroughHandler.processAttribute(namespaceURI, localName, prefix, value, type, specified);
         } else {
-            CoreNSAwareAttribute attr = builderHandler.nodeFactory.getFactory2().createNSAwareAttribute();
+            CoreNSAwareAttribute attr = builderHandler.nodeFactory.createNSAwareAttribute();
             attr.initName(namespaceURI, localName, prefix, builderHandler.namespaceHelper);
             try {
                 attr.coreSetCharacterData(value, null);
@@ -221,7 +227,7 @@ final class BuildableContext extends Context implements InputContext {
         if (passThroughHandler != null) {
             passThroughHandler.processAttribute(name, value, type, specified);
         } else {
-            CoreNSUnawareAttribute attr = builderHandler.nodeFactory.getFactory2().createNSUnawareAttribute();
+            CoreNSUnawareAttribute attr = builderHandler.nodeFactory.createNSUnawareAttribute();
             attr.coreSetName(name);
             try {
                 attr.coreSetCharacterData(value, null);
@@ -239,7 +245,7 @@ final class BuildableContext extends Context implements InputContext {
         if (passThroughHandler != null) {
             passThroughHandler.processNamespaceDeclaration(prefix, namespaceURI);
         } else {
-            CoreNamespaceDeclaration decl = builderHandler.nodeFactory.getFactory2().createNamespaceDeclaration();
+            CoreNamespaceDeclaration decl = builderHandler.nodeFactory.createNamespaceDeclaration();
             decl.init(prefix, namespaceURI, builderHandler.namespaceHelper);
             ((CoreElement)target).coreAppendAttribute(decl);
         }
@@ -261,7 +267,7 @@ final class BuildableContext extends Context implements InputContext {
         } else if (!ignorable && pendingCharacterData == null && target.coreGetFirstChildIfAvailable() == null) {
             pendingCharacterData = data;
         } else {
-            CoreCharacterDataNode node = builderHandler.nodeFactory.getFactory2().createCharacterDataNode();
+            CoreCharacterDataNode node = builderHandler.nodeFactory.createCharacterDataNode();
             node.coreSetCharacterData(data);
             node.coreSetIgnorable(ignorable);
             addChild(node);
@@ -275,7 +281,7 @@ final class BuildableContext extends Context implements InputContext {
             passThroughHandler.startProcessingInstruction(piTarget);
             return this;
         } else {
-            CoreProcessingInstruction node = builderHandler.nodeFactory.getFactory2().createProcessingInstruction();
+            CoreProcessingInstruction node = builderHandler.nodeFactory.createProcessingInstruction();
             node.coreSetTarget(piTarget);
             addChild(node);
             return newContext(node);
@@ -299,7 +305,7 @@ final class BuildableContext extends Context implements InputContext {
             passThroughHandler.startComment();
             return this;
         } else {
-            CoreComment node = builderHandler.nodeFactory.getFactory2().createComment();
+            CoreComment node = builderHandler.nodeFactory.createComment();
             addChild(node);
             return newContext(node);
         }
@@ -322,7 +328,7 @@ final class BuildableContext extends Context implements InputContext {
             passThroughHandler.startCDATASection();
             return this;
         } else {
-            CoreCDATASection node = builderHandler.nodeFactory.getFactory2().createCDATASection();
+            CoreCDATASection node = builderHandler.nodeFactory.createCDATASection();
             addChild(node);
             return newContext(node);
         }
@@ -343,7 +349,7 @@ final class BuildableContext extends Context implements InputContext {
         if (passThroughHandler != null) {
             passThroughHandler.processEntityReference(name, replacementText);
         } else {
-            CoreEntityReference node = builderHandler.nodeFactory.getFactory2().createEntityReference();
+            CoreEntityReference node = builderHandler.nodeFactory.createEntityReference();
             node.coreSetName(name);
             node.coreSetReplacementText(replacementText);
             addChild(node);
diff --git a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuilderHandler.java b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuilderHandler.java
index cf45afe..c52fbbd 100644
--- a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuilderHandler.java
+++ b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuilderHandler.java
@@ -27,12 +27,12 @@ import org.apache.axiom.core.CoreDocument;
 import org.apache.axiom.core.CoreNSAwareElement;
 import org.apache.axiom.core.CoreNode;
 import org.apache.axiom.core.DeferredParsingException;
-import org.apache.axiom.core.NodeFactory;
+import org.apache.axiom.core.NodeFactory2;
 import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.XmlHandler;
 
 final class BuilderHandler implements XmlHandler {
-    final NodeFactory nodeFactory;
+    final NodeFactory2 nodeFactory;
     final Model model;
     final Builder builder;
     final Object namespaceHelper;
@@ -53,11 +53,11 @@ final class BuilderHandler implements XmlHandler {
     private ArrayList<BuilderListener> listeners;
     private Queue<DeferredAction> deferredActions;
 
-    BuilderHandler(NodeFactory nodeFactory, Model model, CoreNSAwareElement root, Builder builder) {
+    BuilderHandler(NodeFactory2 nodeFactory, Model model, CoreNSAwareElement root, Builder builder) {
         this.nodeFactory = nodeFactory;
         this.model = model;
         this.builder = builder;
-        namespaceHelper = nodeFactory.getFactory2().createNamespaceHelper();
+        namespaceHelper = nodeFactory.createNamespaceHelper();
         rootContext = root == null ? new BuildableContext(this, null, 0) : new UnwrappingContext(this, root);
         context = rootContext;
         activeContextCount = 1;
diff --git a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuilderImpl.java b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuilderImpl.java
index 3e56ed9..97ebcd8 100644
--- a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuilderImpl.java
+++ b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/BuilderImpl.java
@@ -22,7 +22,7 @@ import org.apache.axiom.core.Builder;
 import org.apache.axiom.core.CoreDocument;
 import org.apache.axiom.core.CoreNSAwareElement;
 import org.apache.axiom.core.DeferredParsingException;
-import org.apache.axiom.core.NodeFactory;
+import org.apache.axiom.core.NodeFactory2;
 import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.XmlInput;
 import org.apache.axiom.core.stream.XmlReader;
@@ -32,7 +32,7 @@ public final class BuilderImpl implements Builder {
     private final BuilderHandler builderHandler;
     private Object facade;
 
-    public BuilderImpl(XmlInput input, NodeFactory nodeFactory, Model model,
+    public BuilderImpl(XmlInput input, NodeFactory2 nodeFactory, Model model,
             CoreNSAwareElement root) {
         builderHandler = new BuilderHandler(nodeFactory, model, root, this);
         reader = input.createReader(builderHandler);
diff --git a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/Model.java b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/Model.java
index b046de6..27385ef 100644
--- a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/Model.java
+++ b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/Model.java
@@ -23,17 +23,23 @@ import org.apache.axiom.core.CoreNSAwareElement;
 import org.apache.axiom.core.CoreParentNode;
 
 public interface Model {
-    Class<? extends CoreDocument> getDocumentType();
+    /**
+     * Create the document node suitable for this model.
+     * 
+     * @return the document node, or {@code null} if a plain {@link CoreDocument} should be used
+     */
+    CoreDocument createDocument();
     
     /**
-     * Determine the element type to use for the current element.
+     * Create a model specific element node. The implementation must only create the element, but
+     * not set any of its properties.
      * 
      * @param parent
      *            the parent for the element
      * @param elementName
      *            the local name for the element
-     * @return the type of element to create; must not be <code>null</code>
+     * @return the element node, or {@code null} if a plain {@link CoreNSAwareElement} should be used
      */
-    Class<? extends CoreNSAwareElement> determineElementType(CoreParentNode parent, int elementLevel,
+    CoreNSAwareElement createElement(CoreParentNode parent, int elementLevel,
             String namespaceURI, String localName);
 }
diff --git a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/PlainXMLModel.java b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/PlainXMLModel.java
index de68ca3..2cb0d65 100644
--- a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/PlainXMLModel.java
+++ b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/builder/PlainXMLModel.java
@@ -28,13 +28,13 @@ public final class PlainXMLModel implements Model {
     private PlainXMLModel() {}
 
     @Override
-    public Class<? extends CoreDocument> getDocumentType() {
-        return CoreDocument.class;
+    public CoreDocument createDocument() {
+        return null;
     }
 
     @Override
-    public Class<? extends CoreNSAwareElement> determineElementType(CoreParentNode parent, int elementLevel,
+    public CoreNSAwareElement createElement(CoreParentNode parent, int elementLevel,
             String namespaceURI, String localName) {
-        return CoreNSAwareElement.class;
+        return null;
     }
 }
diff --git a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreElementMixin.java b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreElementMixin.java
index 37366cb..187d350 100644
--- a/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreElementMixin.java
+++ b/mixins/core-mixins/src/main/java/org/apache/axiom/core/impl/mixin/CoreElementMixin.java
@@ -241,8 +241,7 @@ public abstract class CoreElementMixin implements CoreElement {
     }
     
     @Override
-    public final <T extends CoreElement> T corePromote(Class<T> type, Semantics semantics) throws CoreModelException {
-        T newElement = coreCreateNode(type);
+    public final void corePromote(CoreElement newElement, Semantics semantics) throws CoreModelException {
         newElement.initName(this);
         newElement.internalSetFirstAttribute(firstAttribute);
         CoreAttribute attr = firstAttribute;
@@ -253,6 +252,5 @@ public abstract class CoreElementMixin implements CoreElement {
         firstAttribute = null;
         newElement.coreMoveChildrenFrom(this, semantics);
         coreReplaceWith(newElement, semantics);
-        return newElement;
     }
 }
diff --git a/mixins/om-mixins/pom.xml b/mixins/om-mixins/pom.xml
index 19353bf..6b4ce86 100644
--- a/mixins/om-mixins/pom.xml
+++ b/mixins/om-mixins/pom.xml
@@ -70,4 +70,30 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.github.veithen.phos</groupId>
+                <artifactId>enforcer-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>enforce</goal>
+                        </goals>
+                        <configuration>
+                            <ignore>
+                                <!-- TODO: inject the reference to the singleton into mixins directly -->
+                                org.apache.axiom.om.impl.intf.AxiomInformationItem -&gt; org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory,
+                                <!-- TODO: figure out how to break those cycles properly -->
+                                org.apache.axiom.soap.impl.intf.SOAPHelper -&gt; org.apache.axiom.om.impl.intf.factory.AxiomElementType,
+                                org.apache.axiom.soap.impl.intf.soap11.SOAP11Helper -&gt; org.apache.axiom.om.impl.intf.factory.AxiomElementType,
+                                org.apache.axiom.soap.impl.intf.soap12.SOAP12Helper -&gt; org.apache.axiom.om.impl.intf.factory.AxiomElementType
+                            </ignore>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
index 46f5a61..570e948 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
@@ -26,7 +26,6 @@ import javax.activation.DataHandler;
 import javax.xml.namespace.QName;
 
 import org.apache.axiom.core.CoreModelException;
-import org.apache.axiom.core.NodeFactory;
 import org.apache.axiom.ext.stax.datahandler.DataHandlerProvider;
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMComment;
@@ -49,7 +48,6 @@ import org.apache.axiom.om.impl.common.AxiomExceptionTranslator;
 import org.apache.axiom.om.impl.common.AxiomSemantics;
 import org.apache.axiom.om.impl.common.OMNamespaceImpl;
 import org.apache.axiom.om.impl.intf.AxiomAttribute;
-import org.apache.axiom.om.impl.intf.AxiomCDATASection;
 import org.apache.axiom.om.impl.intf.AxiomCharacterDataNode;
 import org.apache.axiom.om.impl.intf.AxiomChildNode;
 import org.apache.axiom.om.impl.intf.AxiomComment;
@@ -64,12 +62,14 @@ import org.apache.axiom.om.impl.intf.AxiomProcessingInstruction;
 import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
 import org.apache.axiom.om.impl.intf.AxiomText;
 import org.apache.axiom.om.impl.intf.TextContent;
+import org.apache.axiom.om.impl.intf.factory.AxiomElementType;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 
 public class OMFactoryImpl implements OMFactory {
     private final OMMetaFactory metaFactory;
-    protected final NodeFactory nodeFactory;
+    protected final AxiomNodeFactory nodeFactory;
     
-    public OMFactoryImpl(OMMetaFactory metaFactory, NodeFactory nodeFactory) {
+    public OMFactoryImpl(OMMetaFactory metaFactory, AxiomNodeFactory nodeFactory) {
         this.metaFactory = metaFactory;
         this.nodeFactory = nodeFactory;
     }
@@ -86,13 +86,13 @@ public class OMFactoryImpl implements OMFactory {
     
     @Override
     public final OMDocument createOMDocument() {
-        return nodeFactory.createNode(AxiomDocument.class);
+        return nodeFactory.createDocument();
     }
 
     @Override
     public final OMDocType createOMDocType(OMContainer parent, String rootName,
             String publicId, String systemId, String internalSubset) {
-        AxiomDocType node = nodeFactory.createNode(AxiomDocType.class);
+        AxiomDocType node = nodeFactory.createDocType();
         node.coreSetRootName(rootName);
         node.coreSetPublicId(publicId);
         node.coreSetSystemId(systemId);
@@ -107,17 +107,17 @@ public class OMFactoryImpl implements OMFactory {
         AxiomText node;
         switch (type) {
             case OMNode.TEXT_NODE: {
-                node = nodeFactory.createNode(AxiomCharacterDataNode.class);
+                node = nodeFactory.createCharacterDataNode();
                 break;
             }
             case OMNode.SPACE_NODE: {
-                AxiomCharacterDataNode cdata = nodeFactory.createNode(AxiomCharacterDataNode.class);
+                AxiomCharacterDataNode cdata = nodeFactory.createCharacterDataNode();
                 cdata.coreSetIgnorable(true);
                 node = cdata;
                 break;
             }
             case OMNode.CDATA_SECTION_NODE: {
-                node = nodeFactory.createNode(AxiomCDATASection.class);
+                node = nodeFactory.createCDATASection();
                 break;
             }
             default:
@@ -211,7 +211,7 @@ public class OMFactoryImpl implements OMFactory {
     @Override
     public final OMProcessingInstruction createOMProcessingInstruction(
             OMContainer parent, String piTarget, String piData) {
-        AxiomProcessingInstruction node = nodeFactory.createNode(AxiomProcessingInstruction.class);
+        AxiomProcessingInstruction node = nodeFactory.createProcessingInstruction();
         node.coreSetTarget(piTarget);
         try {
             node.coreSetCharacterData(piData, AxiomSemantics.INSTANCE);
@@ -226,7 +226,7 @@ public class OMFactoryImpl implements OMFactory {
 
     @Override
     public final OMEntityReference createOMEntityReference(OMContainer parent, String name) {
-        AxiomEntityReference node = nodeFactory.createNode(AxiomEntityReference.class);
+        AxiomEntityReference node = nodeFactory.createEntityReference();
         node.coreSetName(name);
         if (parent != null) {
             ((AxiomContainer)parent).addChild(node);
@@ -236,7 +236,7 @@ public class OMFactoryImpl implements OMFactory {
 
     @Override
     public final OMComment createOMComment(OMContainer parent, String content) {
-        AxiomComment node = nodeFactory.createNode(AxiomComment.class);
+        AxiomComment node = nodeFactory.createComment();
         try {
             node.coreSetCharacterData(content, AxiomSemantics.INSTANCE);
         } catch (CoreModelException ex) {
@@ -253,9 +253,9 @@ public class OMFactoryImpl implements OMFactory {
         return createOMElement(localName, ns, null);
     }
 
-    protected final <T extends AxiomElement> T createAxiomElement(Class<T> type,
+    protected final <T extends AxiomElement> T createAxiomElement(AxiomElementType<T> type,
             OMContainer parent, String localName, OMNamespace ns) {
-        T element = nodeFactory.createNode(type);
+        T element = type.create(nodeFactory);
         if (parent != null) {
             ((AxiomContainer)parent).addChild(element);
         }
@@ -265,12 +265,12 @@ public class OMFactoryImpl implements OMFactory {
 
     @Override
     public final OMElement createOMElement(String localName, OMNamespace ns, OMContainer parent) {
-        return createAxiomElement(AxiomElement.class, parent, localName, ns);
+        return createAxiomElement(AxiomNodeFactory::createElement, parent, localName, ns);
     }
 
     @Override
     public final OMElement createOMElement(QName qname, OMContainer parent) {
-        AxiomElement element = nodeFactory.createNode(AxiomElement.class);
+        AxiomElement element = nodeFactory.createElement();
         if (parent != null) {
             parent.addChild(element);
         }
@@ -321,21 +321,21 @@ public class OMFactoryImpl implements OMFactory {
 
     @Override
     public final OMSourcedElement createOMElement(OMDataSource source) {
-        AxiomSourcedElement element = nodeFactory.createNode(AxiomSourcedElement.class);
+        AxiomSourcedElement element = nodeFactory.createSourcedElement();
         element.init(source);
         return element;
     }
 
     @Override
     public final OMSourcedElement createOMElement(OMDataSource source, String localName, OMNamespace ns) {
-        AxiomSourcedElement element = nodeFactory.createNode(AxiomSourcedElement.class);
+        AxiomSourcedElement element = nodeFactory.createSourcedElement();
         element.init(localName, ns, source);
         return element;
     }
 
     @Override
     public final OMSourcedElement createOMElement(OMDataSource source, QName qname) {
-        AxiomSourcedElement element = nodeFactory.createNode(AxiomSourcedElement.class);
+        AxiomSourcedElement element = nodeFactory.createSourcedElement();
         element.init(qname, source);
         return element;
     }
@@ -361,7 +361,7 @@ public class OMFactoryImpl implements OMFactory {
                 throw new IllegalArgumentException("Cannot create an unprefixed attribute with a namespace");
             }
         }
-        AxiomAttribute attr = nodeFactory.createNode(AxiomAttribute.class);
+        AxiomAttribute attr = nodeFactory.createAttribute();
         attr.internalSetLocalName(localName);
         try {
             attr.coreSetCharacterData(value, AxiomSemantics.INSTANCE);
@@ -373,15 +373,15 @@ public class OMFactoryImpl implements OMFactory {
         return attr;
     }
 
-    protected final <T extends AxiomElement> T importElement(OMElement element, Class<T> type) {
-        T importedElement = nodeFactory.createNode(type);
+    protected final <T extends AxiomElement> T importElement(OMElement element, AxiomElementType<T> type) {
+        T importedElement = type.create(nodeFactory);
         copyName(element, importedElement);
         for (Iterator<OMAttribute> it = element.getAllAttributes(); it.hasNext(); ) {
             importedElement.coreAppendAttribute(importAttribute(it.next()));
         }
         for (Iterator<OMNamespace> it = element.getAllDeclaredNamespaces(); it.hasNext(); ) {
             OMNamespace ns = it.next();
-            AxiomNamespaceDeclaration nsDecl = nodeFactory.createNode(AxiomNamespaceDeclaration.class);
+            AxiomNamespaceDeclaration nsDecl = nodeFactory.createNamespaceDeclaration();
             nsDecl.coreSetDeclaredNamespace(ns.getPrefix(), ns.getNamespaceURI());
             importedElement.coreAppendAttribute(nsDecl);
         }
@@ -393,7 +393,7 @@ public class OMFactoryImpl implements OMFactory {
         int type = child.getType();
         switch (type) {
             case OMNode.ELEMENT_NODE:
-                return importElement((OMElement)child, AxiomElement.class);
+                return importElement((OMElement)child, AxiomNodeFactory::createElement);
             case OMNode.TEXT_NODE:
             case OMNode.SPACE_NODE:
             case OMNode.CDATA_SECTION_NODE: {
@@ -408,20 +408,20 @@ public class OMFactoryImpl implements OMFactory {
             }
             case OMNode.PI_NODE: {
                 OMProcessingInstruction pi = (OMProcessingInstruction)child;
-                AxiomProcessingInstruction importedPI = nodeFactory.createNode(AxiomProcessingInstruction.class);
+                AxiomProcessingInstruction importedPI = nodeFactory.createProcessingInstruction();
                 importedPI.setTarget(pi.getTarget());
                 importedPI.setValue(pi.getValue());
                 return importedPI;
             }
             case OMNode.COMMENT_NODE: {
                 OMComment comment = (OMComment)child;
-                AxiomComment importedComment = nodeFactory.createNode(AxiomComment.class);
+                AxiomComment importedComment = nodeFactory.createComment();
                 importedComment.setValue(comment.getValue());
                 return importedComment;
             }
             case OMNode.DTD_NODE: {
                 OMDocType docType = (OMDocType)child;
-                AxiomDocType importedDocType = nodeFactory.createNode(AxiomDocType.class);
+                AxiomDocType importedDocType = nodeFactory.createDocType();
                 importedDocType.coreSetRootName(docType.getRootName());
                 importedDocType.coreSetPublicId(docType.getPublicId());
                 importedDocType.coreSetSystemId(docType.getSystemId());
@@ -429,7 +429,7 @@ public class OMFactoryImpl implements OMFactory {
                 return importedDocType;
             }
             case OMNode.ENTITY_REFERENCE_NODE:
-                AxiomEntityReference importedEntityRef = nodeFactory.createNode(AxiomEntityReference.class);
+                AxiomEntityReference importedEntityRef = nodeFactory.createEntityReference();
                 importedEntityRef.coreSetName(((OMEntityReference)child).getName());
                 return importedEntityRef;
             default:
@@ -453,7 +453,7 @@ public class OMFactoryImpl implements OMFactory {
     }
 
     private AxiomAttribute importAttribute(OMAttribute attribute) {
-        AxiomAttribute importedAttribute = nodeFactory.createNode(AxiomAttribute.class);
+        AxiomAttribute importedAttribute = nodeFactory.createAttribute();
         copyName(attribute, importedAttribute);
         importedAttribute.setAttributeValue(attribute.getAttributeValue());
         return importedAttribute;
@@ -465,7 +465,7 @@ public class OMFactoryImpl implements OMFactory {
             return importChildNode((OMNode)node);
         } else if (node instanceof OMDocument) {
             OMDocument document = (OMDocument)node;
-            AxiomDocument importedDocument = nodeFactory.createNode(AxiomDocument.class);
+            AxiomDocument importedDocument = nodeFactory.createDocument();
             // TODO: other attributes
             importChildren(document, importedDocument);
             return importedDocument;
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/AbstractOMMetaFactory.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/AbstractOMMetaFactory.java
index 9177953..bb0c65d 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/AbstractOMMetaFactory.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/AbstractOMMetaFactory.java
@@ -25,7 +25,6 @@ import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.Source;
 import javax.xml.transform.sax.SAXSource;
 
-import org.apache.axiom.core.NodeFactory;
 import org.apache.axiom.mime.MultipartBody;
 import org.apache.axiom.om.OMAttachmentAccessor;
 import org.apache.axiom.om.OMFactory;
@@ -33,6 +32,7 @@ import org.apache.axiom.om.OMMetaFactory;
 import org.apache.axiom.om.OMMetaFactorySPI;
 import org.apache.axiom.om.OMXMLParserWrapper;
 import org.apache.axiom.om.impl.common.factory.OMFactoryImpl;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 import org.apache.axiom.om.util.StAXParserConfiguration;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPModelBuilder;
@@ -46,12 +46,12 @@ import org.xml.sax.InputSource;
  * ({@link org.apache.axiom.core.impl.builder.BuilderImpl} and its subclasses).
  */
 public abstract class AbstractOMMetaFactory implements OMMetaFactorySPI {
-    private final NodeFactory nodeFactory;
+    private final AxiomNodeFactory nodeFactory;
     private final OMFactory omFactory;
     private final SOAPFactory soap11Factory;
     private final SOAPFactory soap12Factory;
     
-    public AbstractOMMetaFactory(NodeFactory nodeFactory) {
+    public AbstractOMMetaFactory(AxiomNodeFactory nodeFactory) {
         this.nodeFactory = nodeFactory;
         omFactory = new OMFactoryImpl(this, nodeFactory);
         soap11Factory = new SOAP11Factory(this, nodeFactory);
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/BuilderFactory.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/BuilderFactory.java
index 9aa33ff..e482a42 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/BuilderFactory.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/common/factory/meta/BuilderFactory.java
@@ -19,7 +19,6 @@
 package org.apache.axiom.om.impl.common.factory.meta;
 
 import org.apache.axiom.core.CoreNode;
-import org.apache.axiom.core.NodeFactory;
 import org.apache.axiom.core.impl.builder.BuilderImpl;
 import org.apache.axiom.core.impl.builder.BuilderListener;
 import org.apache.axiom.core.impl.builder.DeferredAction;
@@ -27,6 +26,7 @@ import org.apache.axiom.core.impl.builder.PlainXMLModel;
 import org.apache.axiom.core.stream.FilteredXmlInput;
 import org.apache.axiom.om.OMXMLParserWrapper;
 import org.apache.axiom.om.impl.common.builder.OMXMLParserWrapperImpl;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPModelBuilder;
 import org.apache.axiom.soap.impl.common.builder.SOAPFilter;
@@ -38,16 +38,16 @@ import org.apache.axiom.soap.impl.intf.AxiomSOAPMessage;
 abstract class BuilderFactory<T extends OMXMLParserWrapper> {
     final static BuilderFactory<OMXMLParserWrapper> OM = new BuilderFactory<OMXMLParserWrapper>() {
         @Override
-        OMXMLParserWrapper createBuilder(NodeFactory nodeFactory, BuilderSpec spec) {
-            return new OMXMLParserWrapperImpl(new BuilderImpl(spec.getInput(), nodeFactory,
+        OMXMLParserWrapper createBuilder(AxiomNodeFactory nodeFactory, BuilderSpec spec) {
+            return new OMXMLParserWrapperImpl(new BuilderImpl(spec.getInput(), nodeFactory.getCoreNodeFactory(),
                     PlainXMLModel.INSTANCE, null), spec.getDetachable());
         }
     };
 
     final static BuilderFactory<SOAPModelBuilder> SOAP = new BuilderFactory<SOAPModelBuilder>() {
         @Override
-        SOAPModelBuilder createBuilder(NodeFactory nodeFactory, BuilderSpec spec) {
-            BuilderImpl builder = new BuilderImpl(new FilteredXmlInput(spec.getInput(), SOAPFilter.INSTANCE), nodeFactory, new SOAPModel(), null);
+        SOAPModelBuilder createBuilder(AxiomNodeFactory nodeFactory, BuilderSpec spec) {
+            BuilderImpl builder = new BuilderImpl(new FilteredXmlInput(spec.getInput(), SOAPFilter.INSTANCE), nodeFactory.getCoreNodeFactory(), new SOAPModel(nodeFactory), null);
             // The SOAPFactory instance linked to the SOAPMessage is unknown until we reach the
             // SOAPEnvelope. Register a post-processor that does the necessary updates on the
             // SOAPMessage.
@@ -68,5 +68,5 @@ abstract class BuilderFactory<T extends OMXMLParserWrapper> {
         }
     };
 
-    abstract T createBuilder(NodeFactory nodeFactory, BuilderSpec spec);
+    abstract T createBuilder(AxiomNodeFactory nodeFactory, BuilderSpec spec);
 }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/AxiomInformationItem.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/AxiomInformationItem.java
index 3147fa6..e992eb4 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/AxiomInformationItem.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/AxiomInformationItem.java
@@ -21,7 +21,12 @@ package org.apache.axiom.om.impl.intf;
 import org.apache.axiom.core.CoreNode;
 import org.apache.axiom.om.OMInformationItem;
 import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
+import org.apache.axiom.weaver.annotation.Inject;
 
 public interface AxiomInformationItem extends OMInformationItem, CoreNode {
+    @Inject
+    AxiomNodeFactory getNodeFactory();
+
     OMMetaFactory getMetaFactory();
 }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/AxiomInformationItem.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/factory/AxiomElementType.java
similarity index 74%
copy from mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/AxiomInformationItem.java
copy to mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/factory/AxiomElementType.java
index 3147fa6..94b49f8 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/AxiomInformationItem.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/factory/AxiomElementType.java
@@ -16,12 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.axiom.om.impl.intf;
+package org.apache.axiom.om.impl.intf.factory;
 
-import org.apache.axiom.core.CoreNode;
-import org.apache.axiom.om.OMInformationItem;
-import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.impl.intf.AxiomElement;
 
-public interface AxiomInformationItem extends OMInformationItem, CoreNode {
-    OMMetaFactory getMetaFactory();
+public interface AxiomElementType<T extends AxiomElement> {
+    T create(AxiomNodeFactory nodeFactory);
 }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/factory/AxiomNodeFactory.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/factory/AxiomNodeFactory.java
new file mode 100644
index 0000000..50a6614
--- /dev/null
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/intf/factory/AxiomNodeFactory.java
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.om.impl.intf.factory;
+
+import org.apache.axiom.core.NodeFactory2;
+import org.apache.axiom.om.impl.intf.AxiomAttribute;
+import org.apache.axiom.om.impl.intf.AxiomCDATASection;
+import org.apache.axiom.om.impl.intf.AxiomCharacterDataNode;
+import org.apache.axiom.om.impl.intf.AxiomComment;
+import org.apache.axiom.om.impl.intf.AxiomDocType;
+import org.apache.axiom.om.impl.intf.AxiomDocument;
+import org.apache.axiom.om.impl.intf.AxiomElement;
+import org.apache.axiom.om.impl.intf.AxiomEntityReference;
+import org.apache.axiom.om.impl.intf.AxiomNamespaceDeclaration;
+import org.apache.axiom.om.impl.intf.AxiomProcessingInstruction;
+import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
+import org.apache.axiom.soap.impl.intf.AxiomSOAPMessage;
+import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11Body;
+import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11Envelope;
+import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11Fault;
+import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11FaultCode;
+import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11FaultDetail;
+import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11FaultReason;
+import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11FaultRole;
+import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11Header;
+import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11HeaderBlock;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12Body;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12Envelope;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12Fault;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultCode;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultDetail;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultNode;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultReason;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultRole;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultSubCode;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultText;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultValue;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12Header;
+import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12HeaderBlock;
+import org.apache.axiom.weaver.annotation.FactoryMethod;
+import org.apache.axiom.weaver.annotation.Inject;
+import org.apache.axiom.weaver.annotation.Singleton;
+
+@Singleton
+public interface AxiomNodeFactory {
+    @Inject
+    NodeFactory2 getCoreNodeFactory();
+
+    @FactoryMethod
+    AxiomDocument createDocument();
+
+    @FactoryMethod
+    AxiomDocType createDocType();
+
+    @FactoryMethod
+    AxiomCharacterDataNode createCharacterDataNode();
+
+    @FactoryMethod
+    AxiomCDATASection createCDATASection();
+
+    @FactoryMethod
+    AxiomProcessingInstruction createProcessingInstruction();
+
+    @FactoryMethod
+    AxiomEntityReference createEntityReference();
+
+    @FactoryMethod
+    AxiomComment createComment();
+
+    @FactoryMethod
+    AxiomElement createElement();
+
+    @FactoryMethod
+    AxiomSourcedElement createSourcedElement();
+
+    @FactoryMethod
+    AxiomAttribute createAttribute();
+
+    @FactoryMethod
+    AxiomNamespaceDeclaration createNamespaceDeclaration();
+
+    @FactoryMethod
+    AxiomSOAPMessage createSOAPMessage();
+
+    @FactoryMethod
+    AxiomSOAP11Envelope createSOAP11Envelope();
+
+    @FactoryMethod
+    AxiomSOAP11Header createSOAP11Header();
+
+    @FactoryMethod
+    AxiomSOAP11HeaderBlock createSOAP11HeaderBlock();
+
+    @FactoryMethod
+    AxiomSOAP11Body createSOAP11Body();
+
+    @FactoryMethod
+    AxiomSOAP11Fault createSOAP11Fault();
+
+    @FactoryMethod
+    AxiomSOAP11FaultCode createSOAP11FaultCode();
+
+    @FactoryMethod
+    AxiomSOAP11FaultReason createSOAP11FaultReason();
+
+    @FactoryMethod
+    AxiomSOAP11FaultRole createSOAP11FaultRole();
+
+    @FactoryMethod
+    AxiomSOAP11FaultDetail createSOAP11FaultDetail();
+
+    @FactoryMethod
+    AxiomSOAP12Envelope createSOAP12Envelope();
+
+    @FactoryMethod
+    AxiomSOAP12Header createSOAP12Header();
+
+    @FactoryMethod
+    AxiomSOAP12HeaderBlock createSOAP12HeaderBlock();
+
+    @FactoryMethod
+    AxiomSOAP12Body createSOAP12Body();
+
+    @FactoryMethod
+    AxiomSOAP12Fault createSOAP12Fault();
+
+    @FactoryMethod
+    AxiomSOAP12FaultCode createSOAP12FaultCode();
+
+    @FactoryMethod
+    AxiomSOAP12FaultReason createSOAP12FaultReason();
+
+    @FactoryMethod
+    AxiomSOAP12FaultRole createSOAP12FaultRole();
+
+    @FactoryMethod
+    AxiomSOAP12FaultDetail createSOAP12FaultDetail();
+
+    @FactoryMethod
+    AxiomSOAP12FaultValue createSOAP12FaultValue();
+
+    @FactoryMethod
+    AxiomSOAP12FaultSubCode createSOAP12FaultSubCode();
+
+    @FactoryMethod
+    AxiomSOAP12FaultText createSOAP12FaultText();
+
+    @FactoryMethod
+    AxiomSOAP12FaultNode createSOAP12FaultNode();
+}
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementMixin.java b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementMixin.java
index 8d6acd0..eff5368 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementMixin.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementMixin.java
@@ -216,7 +216,7 @@ public abstract class AxiomSourcedElementMixin implements AxiomSourcedElement {
             if (OMDataSourceUtil.isPushDataSource(dataSource)) {
                 // Disable namespace repairing because the OMDataSource is required to produce well formed
                 // XML with respect to namespaces.
-                builder = new BuilderImpl(new PushOMDataSourceInput(this, dataSource), coreGetNodeFactory(), PlainXMLModel.INSTANCE, this);
+                builder = new BuilderImpl(new PushOMDataSourceInput(this, dataSource), coreGetNodeFactory().getFactory2(), PlainXMLModel.INSTANCE, this);
             } else {
                 // Get the XMLStreamReader
                 XMLStreamReader readerFromDS;
@@ -225,7 +225,7 @@ public abstract class AxiomSourcedElementMixin implements AxiomSourcedElement {
                 } catch (XMLStreamException ex) {
                     throw new OMException("Error obtaining parser from data source for element " + getPrintableName(), ex);
                 }
-                builder = new BuilderImpl(new FilteredXmlInput(new StAXPullInput(readerFromDS, AxiomXMLStreamReaderHelperFactory.INSTANCE), NamespaceRepairingFilter.DEFAULT), coreGetNodeFactory(), PlainXMLModel.INSTANCE, this);
+                builder = new BuilderImpl(new FilteredXmlInput(new StAXPullInput(readerFromDS, AxiomXMLStreamReaderHelperFactory.INSTANCE), NamespaceRepairingFilter.DEFAULT), coreGetNodeFactory().getFactory2(), PlainXMLModel.INSTANCE, this);
             }
             isExpanded = true;
             coreSetState(ATTRIBUTES_PENDING);
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/SOAPHeaderBlockMapper.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/SOAPHeaderBlockMapper.java
index dc6060c..9ec7251 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/SOAPHeaderBlockMapper.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/SOAPHeaderBlockMapper.java
@@ -24,6 +24,7 @@ import org.apache.axiom.om.impl.common.AxiomSemantics;
 import org.apache.axiom.om.impl.intf.AxiomElement;
 import org.apache.axiom.soap.SOAPHeaderBlock;
 import org.apache.axiom.soap.impl.intf.AxiomSOAPHeader;
+import org.apache.axiom.soap.impl.intf.AxiomSOAPHeaderBlock;
 
 public final class SOAPHeaderBlockMapper implements Mapper<SOAPHeaderBlock,AxiomElement> {
     public static final SOAPHeaderBlockMapper INSTANCE = new SOAPHeaderBlockMapper();
@@ -36,7 +37,9 @@ public final class SOAPHeaderBlockMapper implements Mapper<SOAPHeaderBlock,Axiom
             return (SOAPHeaderBlock)element;
         } else {
             try {
-                return element.corePromote(((AxiomSOAPHeader)element.coreGetParent()).getSOAPHelper().getHeaderBlockClass(), AxiomSemantics.INSTANCE);
+                AxiomSOAPHeaderBlock newElement = ((AxiomSOAPHeader)element.coreGetParent()).getSOAPHelper().getHeaderBlockType().create(element.getNodeFactory());
+                element.corePromote(newElement, AxiomSemantics.INSTANCE);
+                return newElement;
             } catch (CoreModelException ex) {
                 throw AxiomSemantics.INSTANCE.toUncheckedException(ex);
             }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAP11BuilderHelper.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAP11BuilderHelper.java
index 863969a..a5c438e 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAP11BuilderHelper.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAP11BuilderHelper.java
@@ -21,12 +21,10 @@ package org.apache.axiom.soap.impl.common.builder;
 
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.impl.intf.AxiomElement;
+import org.apache.axiom.om.impl.intf.factory.AxiomElementType;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 import org.apache.axiom.soap.SOAP11Constants;
 import org.apache.axiom.soap.SOAPProcessingException;
-import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11FaultCode;
-import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11FaultDetail;
-import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11FaultReason;
-import org.apache.axiom.soap.impl.intf.soap11.AxiomSOAP11FaultRole;
 import org.w3c.dom.Element;
 
 public class SOAP11BuilderHelper extends SOAPBuilderHelper implements SOAP11Constants {
@@ -34,26 +32,26 @@ public class SOAP11BuilderHelper extends SOAPBuilderHelper implements SOAP11Cons
     private boolean faultstringPresent = false;
 
     @Override
-    public Class<? extends AxiomElement> handleEvent(OMElement parent, int elementLevel,
+    public AxiomElementType<? extends AxiomElement> handleEvent(OMElement parent, int elementLevel,
             String namespaceURI, String localName) throws SOAPProcessingException {
-        Class<? extends AxiomElement> elementType = null;
+        AxiomElementType<? extends AxiomElement> elementType = null;
 
         if (elementLevel == 4) {
 
             if (SOAP_FAULT_CODE_LOCAL_NAME.equals(localName)) {
 
-                elementType = AxiomSOAP11FaultCode.class;
+                elementType = AxiomNodeFactory::createSOAP11FaultCode;
                 faultcodePresent = true;
             } else if (SOAP_FAULT_STRING_LOCAL_NAME.equals(localName)) {
 
-                elementType = AxiomSOAP11FaultReason.class;
+                elementType = AxiomNodeFactory::createSOAP11FaultReason;
                 faultstringPresent = true;
             } else if (SOAP_FAULT_ACTOR_LOCAL_NAME.equals(localName)) {
-                elementType = AxiomSOAP11FaultRole.class;
+                elementType = AxiomNodeFactory::createSOAP11FaultRole;
             } else if (SOAP_FAULT_DETAIL_LOCAL_NAME.equals(localName)) {
-                elementType = AxiomSOAP11FaultDetail.class;
+                elementType = AxiomNodeFactory::createSOAP11FaultDetail;
             } else {
-                elementType = AxiomElement.class;
+                elementType = AxiomNodeFactory::createElement;
             }
 
         } else if (elementLevel == 5) {
@@ -77,11 +75,11 @@ public class SOAP11BuilderHelper extends SOAPBuilderHelper implements SOAP11Cons
                 throw new SOAPProcessingException(
                         "faultactor element should not have children");
             } else {
-                elementType = AxiomElement.class;
+                elementType = AxiomNodeFactory::createElement;
             }
 
         } else if (elementLevel > 5) {
-            elementType = AxiomElement.class;
+            elementType = AxiomNodeFactory::createElement;
         }
 
         return elementType;
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAP12BuilderHelper.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAP12BuilderHelper.java
index dfe7af0..ddb995f 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAP12BuilderHelper.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAP12BuilderHelper.java
@@ -21,16 +21,10 @@ package org.apache.axiom.soap.impl.common.builder;
 
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.impl.intf.AxiomElement;
+import org.apache.axiom.om.impl.intf.factory.AxiomElementType;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPProcessingException;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultCode;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultDetail;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultNode;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultReason;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultRole;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultSubCode;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultText;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultValue;
 
 import java.util.Vector;
 
@@ -51,9 +45,9 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
     private Vector<String> detailElementNames;
 
     @Override
-    public Class<? extends AxiomElement> handleEvent(OMElement parent, int elementLevel,
+    public AxiomElementType<? extends AxiomElement> handleEvent(OMElement parent, int elementLevel,
             String namespaceURI, String localName) throws SOAPProcessingException {
-        Class<? extends AxiomElement> elementType = null;
+        AxiomElementType<? extends AxiomElement> elementType = null;
 
         if (elementLevel == 4) {
             if (localName.equals(SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME)) {
@@ -61,7 +55,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
                     throw new SOAPProcessingException(
                             "Multiple Code element encountered");
                 } else {
-                    elementType = AxiomSOAP12FaultCode.class;
+                    elementType = AxiomNodeFactory::createSOAP12FaultCode;
                     codePresent = true;
                     codeprocessing = true;
                 }
@@ -72,7 +66,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
                             throw new SOAPProcessingException(
                                     "Multiple Reason Element encountered");
                         } else {
-                            elementType = AxiomSOAP12FaultReason.class;
+                            elementType = AxiomNodeFactory::createSOAP12FaultReason;
                             reasonPresent = true;
                             reasonProcessing = true;
                         }
@@ -97,7 +91,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
                             throw new SOAPProcessingException(
                                     "Multiple Node element encountered");
                         } else {
-                            elementType = AxiomSOAP12FaultNode.class;
+                            elementType = AxiomNodeFactory::createSOAP12FaultNode;
                             nodePresent = true;
                         }
                     } else {
@@ -115,7 +109,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
                             throw new SOAPProcessingException(
                                     "Multiple Role element encountered");
                         } else {
-                            elementType = AxiomSOAP12FaultRole.class;
+                            elementType = AxiomNodeFactory::createSOAP12FaultRole;
                             rolePresent = true;
                         }
                     } else {
@@ -133,7 +127,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
                             throw new SOAPProcessingException(
                                     "Multiple detail element encountered");
                         } else {
-                            elementType = AxiomSOAP12FaultDetail.class;
+                            elementType = AxiomNodeFactory::createSOAP12FaultDetail;
                             detailPresent = true;
                         }
                     } else {
@@ -154,7 +148,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
                     SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME)) {
                 if (localName.equals(SOAP12Constants.SOAP_FAULT_VALUE_LOCAL_NAME)) {
                     if (!valuePresent) {
-                        elementType = AxiomSOAP12FaultValue.class;
+                        elementType = AxiomNodeFactory::createSOAP12FaultValue;
                         valuePresent = true;
                         codeprocessing = false;
                     } else {
@@ -165,7 +159,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
                 } else if (localName.equals(SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME)) {
                     if (!subcodePresent) {
                         if (valuePresent) {
-                            elementType = AxiomSOAP12FaultSubCode.class;
+                            elementType = AxiomNodeFactory::createSOAP12FaultSubCode;
                             subcodePresent = true;
                             subCodeProcessing = true;
                         } else {
@@ -185,7 +179,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
             } else if (parent.getLocalName().equals(
                     SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME)) {
                 if (localName.equals(SOAP12Constants.SOAP_FAULT_TEXT_LOCAL_NAME)) {
-                    elementType = AxiomSOAP12FaultText.class;
+                    elementType = AxiomNodeFactory::createSOAP12FaultText;
                     reasonProcessing = false;
                 } else {
                     throw new SOAPProcessingException(
@@ -193,7 +187,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
                 }
             } else if (parent.getLocalName().equals(
                     SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME)) {
-                elementType = AxiomElement.class;
+                elementType = AxiomNodeFactory::createElement;
                 processingDetailElements = true;
                 detailElementNames = new Vector<String>();
                 detailElementNames.add(localName);
@@ -213,7 +207,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
                         throw new SOAPProcessingException(
                                 "multiple subCode value encountered");
                     } else {
-                        elementType = AxiomSOAP12FaultValue.class;
+                        elementType = AxiomNodeFactory::createSOAP12FaultValue;
                         subcodeValuePresent = true;
                         subSubcodePresent = false;
                         subCodeProcessing = false;
@@ -221,7 +215,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
                 } else if (localName.equals(SOAP12Constants.SOAP_FAULT_SUB_CODE_LOCAL_NAME)) {
                     if (subcodeValuePresent) {
                         if (!subSubcodePresent) {
-                            elementType = AxiomSOAP12FaultSubCode.class;
+                            elementType = AxiomNodeFactory::createSOAP12FaultSubCode;
                             subcodeValuePresent = false;
                             subSubcodePresent = true;
                             subCodeProcessing = true;
@@ -249,7 +243,7 @@ public class SOAP12BuilderHelper extends SOAPBuilderHelper {
                 }
                 if (localNameExist) {
                     detailElementNames.setSize(detailElementLevel);
-                    elementType = AxiomElement.class;
+                    elementType = AxiomNodeFactory::createElement;
                     detailElementNames.add(localName);
                 }
 
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAPBuilderHelper.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAPBuilderHelper.java
index a9cda97..add7fd1 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAPBuilderHelper.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAPBuilderHelper.java
@@ -21,9 +21,10 @@ package org.apache.axiom.soap.impl.common.builder;
 
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.impl.intf.AxiomElement;
+import org.apache.axiom.om.impl.intf.factory.AxiomElementType;
 import org.apache.axiom.soap.SOAPProcessingException;
 
 public abstract class SOAPBuilderHelper {
-    public abstract Class<? extends AxiomElement> handleEvent(OMElement element, int elementLevel,
+    public abstract AxiomElementType<? extends AxiomElement> handleEvent(OMElement element, int elementLevel,
             String namespaceURI, String localName) throws SOAPProcessingException;
 }
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAPModel.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAPModel.java
index 26348ad..86895bc 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAPModel.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/common/builder/SOAPModel.java
@@ -24,12 +24,11 @@ import org.apache.axiom.core.CoreNSAwareElement;
 import org.apache.axiom.core.CoreParentNode;
 import org.apache.axiom.core.impl.builder.Model;
 import org.apache.axiom.om.OMElement;
-import org.apache.axiom.om.impl.intf.AxiomElement;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 import org.apache.axiom.soap.SOAP11Constants;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPConstants;
 import org.apache.axiom.soap.SOAPProcessingException;
-import org.apache.axiom.soap.impl.intf.AxiomSOAPMessage;
 import org.apache.axiom.soap.impl.intf.SOAPHelper;
 import org.apache.axiom.soap.impl.intf.soap11.SOAP11Helper;
 import org.apache.axiom.soap.impl.intf.soap12.SOAP12Helper;
@@ -37,6 +36,8 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 public final class SOAPModel implements Model {
+    private final AxiomNodeFactory nodeFactory;
+
     private SOAPHelper soapHelper;
 
     /** Field headerPresent */
@@ -52,15 +53,18 @@ public final class SOAPModel implements Model {
 
     private SOAPBuilderHelper builderHelper;
 
+    public SOAPModel(AxiomNodeFactory nodeFactory) {
+        this.nodeFactory = nodeFactory;
+    }
+
     @Override
-    public Class<? extends CoreDocument> getDocumentType() {
-        return AxiomSOAPMessage.class;
+    public CoreDocument createDocument() {
+        return nodeFactory.createSOAPMessage();
     }
 
     @Override
-    public Class<? extends CoreNSAwareElement> determineElementType(CoreParentNode parent,
+    public CoreNSAwareElement createElement(CoreParentNode parent,
             int elementLevel, String namespaceURI, String localName) {
-        Class<? extends AxiomElement> elementType;
         if (elementLevel == 1) {
 
             // Now I've found a SOAP Envelope, now create SOAPEnvelope here.
@@ -84,7 +88,7 @@ public final class SOAPModel implements Model {
                                 " system", SOAPConstants.FAULT_CODE_VERSION_MISMATCH);
             }
 
-            elementType = soapHelper.getEnvelopeClass();
+            return soapHelper.getEnvelopeType().create(nodeFactory);
         } else if (elementLevel == 2) {
             if (soapHelper.getEnvelopeURI().equals(namespaceURI)) {
                 // this is either a header or a body
@@ -98,20 +102,20 @@ public final class SOAPModel implements Model {
                                                           getSenderFaultCode());
                     }
                     headerPresent = true;
-                    elementType = soapHelper.getHeaderClass();
+                    return soapHelper.getHeaderType().create(nodeFactory);
                 } else if (localName.equals(SOAPConstants.BODY_LOCAL_NAME)) {
                     if (bodyPresent) {
                         throw new SOAPProcessingException("Multiple body elements encountered",
                                                           getSenderFaultCode());
                     }
                     bodyPresent = true;
-                    elementType = soapHelper.getBodyClass();
+                    return soapHelper.getBodyType().create(nodeFactory);
                 } else {
                     throw new SOAPProcessingException(localName + " is not supported here.",
                                                       getSenderFaultCode());
                 }
             } else if (soapHelper == SOAP11Helper.INSTANCE && bodyPresent) {
-                elementType = AxiomElement.class;
+                return null;
             } else {
                 throw new SOAPProcessingException("Disallowed element found inside Envelope : {"
                         + namespaceURI + "}" + localName);
@@ -122,7 +126,7 @@ public final class SOAPModel implements Model {
 
             // this is a headerblock
             try {
-                elementType = soapHelper.getHeaderBlockClass();
+                return soapHelper.getHeaderBlockType().create(nodeFactory);
             } catch (SOAPProcessingException e) {
                 throw new SOAPProcessingException("Can not create SOAPHeader block",
                                                   getReceiverFaultCode(), e);
@@ -132,21 +136,20 @@ public final class SOAPModel implements Model {
                 localName.equals(SOAPConstants.BODY_FAULT_LOCAL_NAME) &&
                 soapHelper.getEnvelopeURI().equals(namespaceURI)) {
             // this is a SOAP fault
-            elementType = soapHelper.getFaultClass();
             processingFault = true;
             if (soapHelper == SOAP12Helper.INSTANCE) {
                 builderHelper = new SOAP12BuilderHelper();
             } else if (soapHelper == SOAP11Helper.INSTANCE) {
                 builderHelper = new SOAP11BuilderHelper();
             }
+            return soapHelper.getFaultType().create(nodeFactory);
 
         } else if (elementLevel > 3 && processingFault) {
-            elementType = builderHelper.handleEvent((OMElement)parent, elementLevel, namespaceURI, localName);
+            return builderHelper.handleEvent((OMElement)parent, elementLevel, namespaceURI, localName).create(nodeFactory);
         } else {
             // this is neither of above. Just create an element
-            elementType = AxiomElement.class;
+            return null;
         }
-        return elementType;
     }
 
     private String getSenderFaultCode() {
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAP11Factory.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAP11Factory.java
index f35f295..8e5149e 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAP11Factory.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAP11Factory.java
@@ -18,8 +18,8 @@
  */
 package org.apache.axiom.soap.impl.factory;
 
-import org.apache.axiom.core.NodeFactory;
 import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPFault;
 import org.apache.axiom.soap.SOAPFaultCode;
@@ -32,7 +32,7 @@ import org.apache.axiom.soap.impl.intf.SOAPHelper;
 import org.apache.axiom.soap.impl.intf.soap11.SOAP11Helper;
 
 public class SOAP11Factory extends SOAPFactoryImpl {
-    public SOAP11Factory(OMMetaFactory metaFactory, NodeFactory nodeFactory) {
+    public SOAP11Factory(OMMetaFactory metaFactory, AxiomNodeFactory nodeFactory) {
         super(metaFactory, nodeFactory);
     }
 
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAP12Factory.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAP12Factory.java
index b68a0e2..07d54a1 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAP12Factory.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAP12Factory.java
@@ -18,8 +18,8 @@
  */
 package org.apache.axiom.soap.impl.factory;
 
-import org.apache.axiom.core.NodeFactory;
 import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPFault;
@@ -31,14 +31,10 @@ import org.apache.axiom.soap.SOAPFaultSubCode;
 import org.apache.axiom.soap.SOAPFaultText;
 import org.apache.axiom.soap.SOAPFaultValue;
 import org.apache.axiom.soap.impl.intf.SOAPHelper;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultNode;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultSubCode;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultText;
-import org.apache.axiom.soap.impl.intf.soap12.AxiomSOAP12FaultValue;
 import org.apache.axiom.soap.impl.intf.soap12.SOAP12Helper;
 
 public class SOAP12Factory extends SOAPFactoryImpl {
-    public SOAP12Factory(OMMetaFactory metaFactory, NodeFactory nodeFactory) {
+    public SOAP12Factory(OMMetaFactory metaFactory, AxiomNodeFactory nodeFactory) {
         super(metaFactory, nodeFactory);
     }
 
@@ -48,7 +44,7 @@ public class SOAP12Factory extends SOAPFactoryImpl {
     }
 
     public final SOAPFaultValue internalCreateSOAPFaultValue(SOAPFaultClassifier parent) {
-        return createSOAPElement(AxiomSOAP12FaultValue.class, parent, SOAP12Constants.QNAME_FAULT_VALUE);
+        return createSOAPElement(AxiomNodeFactory::createSOAP12FaultValue, parent, SOAP12Constants.QNAME_FAULT_VALUE);
     }
 
     @Override
@@ -67,7 +63,7 @@ public class SOAP12Factory extends SOAPFactoryImpl {
     }
 
     private SOAPFaultSubCode internalCreateSOAPFaultSubCode(SOAPFaultClassifier parent) {
-        return createSOAPElement(AxiomSOAP12FaultSubCode.class, parent, SOAP12Constants.QNAME_FAULT_SUBCODE);
+        return createSOAPElement(AxiomNodeFactory::createSOAP12FaultSubCode, parent, SOAP12Constants.QNAME_FAULT_SUBCODE);
     }
 
     @Override
@@ -87,7 +83,7 @@ public class SOAP12Factory extends SOAPFactoryImpl {
 
     @Override
     public final SOAPFaultText createSOAPFaultText(SOAPFaultReason parent) {
-        return createSOAPElement(AxiomSOAP12FaultText.class, parent, SOAP12Constants.QNAME_FAULT_TEXT);
+        return createSOAPElement(AxiomNodeFactory::createSOAP12FaultText, parent, SOAP12Constants.QNAME_FAULT_TEXT);
     }
 
     @Override
@@ -97,7 +93,7 @@ public class SOAP12Factory extends SOAPFactoryImpl {
 
     @Override
     public final SOAPFaultNode createSOAPFaultNode(SOAPFault parent) {
-        return createSOAPElement(AxiomSOAP12FaultNode.class, parent, SOAP12Constants.QNAME_FAULT_NODE);
+        return createSOAPElement(AxiomNodeFactory::createSOAP12FaultNode, parent, SOAP12Constants.QNAME_FAULT_NODE);
     }
 
     @Override
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAPFactoryImpl.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAPFactoryImpl.java
index 95f76c9..0f0e549 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAPFactoryImpl.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/factory/SOAPFactoryImpl.java
@@ -20,7 +20,6 @@ package org.apache.axiom.soap.impl.factory;
 
 import javax.xml.namespace.QName;
 
-import org.apache.axiom.core.NodeFactory;
 import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMMetaFactory;
@@ -28,6 +27,8 @@ import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.impl.common.factory.OMFactoryImpl;
 import org.apache.axiom.om.impl.intf.AxiomElement;
 import org.apache.axiom.om.impl.intf.Sequence;
+import org.apache.axiom.om.impl.intf.factory.AxiomElementType;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 import org.apache.axiom.soap.SOAPBody;
 import org.apache.axiom.soap.SOAPConstants;
 import org.apache.axiom.soap.SOAPEnvelope;
@@ -49,7 +50,7 @@ import org.apache.axiom.soap.impl.intf.SOAPHelper;
 public abstract class SOAPFactoryImpl extends OMFactoryImpl implements SOAPFactory {
     private static final Sequence envelopeSequence = new Sequence(SOAPHeader.class, SOAPBody.class);
     
-    public SOAPFactoryImpl(OMMetaFactory metaFactory, NodeFactory nodeFactory) {
+    public SOAPFactoryImpl(OMMetaFactory metaFactory, AxiomNodeFactory nodeFactory) {
         super(metaFactory, nodeFactory);
     }
     
@@ -70,12 +71,12 @@ public abstract class SOAPFactoryImpl extends OMFactoryImpl implements SOAPFacto
         return getSOAPHelper().getNamespace();
     }
     
-    protected final <T extends AxiomSOAPElement> T createSOAPElement(Class<T> type, OMElement parent, QName qname) {
+    protected final <T extends AxiomSOAPElement> T createSOAPElement(AxiomElementType<T> type, OMElement parent, QName qname) {
         return createSOAPElement(type, parent, qname, null, -1);
     }
     
-    protected final <T extends AxiomSOAPElement> T createSOAPElement(Class<T> type, OMElement parent, QName qname, Sequence sequence, int pos) {
-        T element = nodeFactory.createNode(type);
+    protected final <T extends AxiomSOAPElement> T createSOAPElement(AxiomElementType<T> type, OMElement parent, QName qname, Sequence sequence, int pos) {
+        T element = type.create(nodeFactory);
         if (parent != null) {
             if (sequence != null) {
                 ((AxiomElement)parent).insertChild(sequence, pos, element, false);
@@ -95,7 +96,7 @@ public abstract class SOAPFactoryImpl extends OMFactoryImpl implements SOAPFacto
 
     @Override
     public final SOAPMessage createSOAPMessage() {
-        AxiomSOAPMessage message = nodeFactory.createNode(AxiomSOAPMessage.class);
+        AxiomSOAPMessage message = nodeFactory.createSOAPMessage();
         message.initSOAPFactory(this);
         return message;
     }
@@ -107,13 +108,13 @@ public abstract class SOAPFactoryImpl extends OMFactoryImpl implements SOAPFacto
     
     @Override
     public final SOAPEnvelope createSOAPEnvelope(OMNamespace ns) {
-        return createAxiomElement(getSOAPHelper().getEnvelopeClass(), null, SOAPConstants.SOAPENVELOPE_LOCAL_NAME, ns);
+        return createAxiomElement(getSOAPHelper().getEnvelopeType(), null, SOAPConstants.SOAPENVELOPE_LOCAL_NAME, ns);
     }
 
     @Override
     public final SOAPHeader createSOAPHeader(SOAPEnvelope parent) {
         SOAPHelper helper = getSOAPHelper();
-        return createSOAPElement(helper.getHeaderClass(), parent, helper.getHeaderQName(), envelopeSequence, 0);
+        return createSOAPElement(helper.getHeaderType(), parent, helper.getHeaderQName(), envelopeSequence, 0);
     }
 
     @Override
@@ -123,37 +124,37 @@ public abstract class SOAPFactoryImpl extends OMFactoryImpl implements SOAPFacto
 
     @Override
     public final SOAPHeaderBlock createSOAPHeaderBlock(String localName, OMNamespace ns, SOAPHeader parent) {
-        return createAxiomElement(getSOAPHelper().getHeaderBlockClass(), parent, localName, ns);
+        return createAxiomElement(getSOAPHelper().getHeaderBlockType(), parent, localName, ns);
     }
 
     @Override
     public final SOAPHeaderBlock createSOAPHeaderBlock(String localName, OMNamespace ns) {
-        return createAxiomElement(getSOAPHelper().getHeaderBlockClass(), null, localName, ns);
+        return createAxiomElement(getSOAPHelper().getHeaderBlockType(), null, localName, ns);
     }
 
     @Override
     public final SOAPHeaderBlock createSOAPHeaderBlock(OMDataSource source) {
-        AxiomSOAPHeaderBlock element = nodeFactory.createNode(getSOAPHelper().getHeaderBlockClass());
+        AxiomSOAPHeaderBlock element = getSOAPHelper().getHeaderBlockType().create(nodeFactory);
         element.init(source);
         return element;
     }
 
     @Override
     public final SOAPHeaderBlock createSOAPHeaderBlock(String localName, OMNamespace ns, OMDataSource ds) {
-        AxiomSOAPHeaderBlock element = nodeFactory.createNode(getSOAPHelper().getHeaderBlockClass());
+        AxiomSOAPHeaderBlock element = getSOAPHelper().getHeaderBlockType().create(nodeFactory);
         element.init(localName, ns, ds);
         return element;
     }
 
     @Override
     public final SOAPHeaderBlock createSOAPHeaderBlock(OMElement element) {
-        return importElement(element, getSOAPHelper().getHeaderBlockClass());
+        return importElement(element, getSOAPHelper().getHeaderBlockType());
     }
 
     @Override
     public final SOAPBody createSOAPBody(SOAPEnvelope parent) {
         SOAPHelper helper = getSOAPHelper();
-        return createSOAPElement(helper.getBodyClass(), parent, helper.getBodyQName(), envelopeSequence, 1);
+        return createSOAPElement(helper.getBodyType(), parent, helper.getBodyQName(), envelopeSequence, 1);
     }
 
     @Override
@@ -164,7 +165,7 @@ public abstract class SOAPFactoryImpl extends OMFactoryImpl implements SOAPFacto
     @Override
     public final SOAPFault createSOAPFault(SOAPBody parent) {
         SOAPHelper helper = getSOAPHelper();
-        return createSOAPElement(helper.getFaultClass(), parent, helper.getFaultQName());
+        return createSOAPElement(helper.getFaultType(), parent, helper.getFaultQName());
     }
 
     @Override
@@ -182,7 +183,7 @@ public abstract class SOAPFactoryImpl extends OMFactoryImpl implements SOAPFacto
     @Override
     public final SOAPFaultCode createSOAPFaultCode(SOAPFault parent) {
         SOAPHelper helper = getSOAPHelper();
-        return createSOAPElement(helper.getFaultCodeClass(), parent, helper.getFaultCodeQName());
+        return createSOAPElement(helper.getFaultCodeType(), parent, helper.getFaultCodeQName());
     }
 
     @Override
@@ -193,7 +194,7 @@ public abstract class SOAPFactoryImpl extends OMFactoryImpl implements SOAPFacto
     @Override
     public final SOAPFaultReason createSOAPFaultReason(SOAPFault parent) {
         SOAPHelper helper = getSOAPHelper();
-        return createSOAPElement(helper.getFaultReasonClass(), parent, helper.getFaultReasonQName());
+        return createSOAPElement(helper.getFaultReasonType(), parent, helper.getFaultReasonQName());
     }
 
     @Override
@@ -204,7 +205,7 @@ public abstract class SOAPFactoryImpl extends OMFactoryImpl implements SOAPFacto
     @Override
     public final SOAPFaultRole createSOAPFaultRole(SOAPFault parent) {
         SOAPHelper helper = getSOAPHelper();
-        return createSOAPElement(helper.getFaultRoleClass(), parent, helper.getFaultRoleQName());
+        return createSOAPElement(helper.getFaultRoleType(), parent, helper.getFaultRoleQName());
     }
 
     @Override
@@ -215,7 +216,7 @@ public abstract class SOAPFactoryImpl extends OMFactoryImpl implements SOAPFacto
     @Override
     public final SOAPFaultDetail createSOAPFaultDetail(SOAPFault parent) {
         SOAPHelper helper = getSOAPHelper();
-        return createSOAPElement(helper.getFaultDetailClass(), parent, helper.getFaultDetailQName());
+        return createSOAPElement(helper.getFaultDetailType(), parent, helper.getFaultDetailQName());
     }
 
     @Override
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/SOAPHelper.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/SOAPHelper.java
index 161c33f..660691d 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/SOAPHelper.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/SOAPHelper.java
@@ -23,6 +23,7 @@ import javax.xml.namespace.QName;
 import org.apache.axiom.om.OMMetaFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.impl.common.OMNamespaceImpl;
+import org.apache.axiom.om.impl.intf.factory.AxiomElementType;
 import org.apache.axiom.soap.SOAPConstants;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPVersion;
@@ -36,52 +37,52 @@ public abstract class SOAPHelper {
     private final SOAPVersion version;
     private final OMNamespace namespace;
     private final String specName;
-    private final Class<? extends AxiomSOAPEnvelope> envelopeClass;
-    private final Class<? extends AxiomSOAPHeader> headerClass;
+    private final AxiomElementType<? extends AxiomSOAPEnvelope> envelopeType;
+    private final AxiomElementType<? extends AxiomSOAPHeader> headerType;
     private final QName headerQName;
-    private final Class<? extends AxiomSOAPHeaderBlock> headerBlockClass;
-    private final Class<? extends AxiomSOAPBody> bodyClass;
+    private final AxiomElementType<? extends AxiomSOAPHeaderBlock> headerBlockType;
+    private final AxiomElementType<? extends AxiomSOAPBody> bodyType;
     private final QName bodyQName;
-    private final Class<? extends AxiomSOAPFault> faultClass;
+    private final AxiomElementType<? extends AxiomSOAPFault> faultType;
     private final QName faultQName;
-    private final Class<? extends AxiomSOAPFaultCode> faultCodeClass;
-    private final Class<? extends AxiomSOAPFaultReason> faultReasonClass;
-    private final Class<? extends AxiomSOAPFaultRole> faultRoleClass;
-    private final Class<? extends AxiomSOAPFaultDetail> faultDetailClass;
+    private final AxiomElementType<? extends AxiomSOAPFaultCode> faultCodeType;
+    private final AxiomElementType<? extends AxiomSOAPFaultReason> faultReasonType;
+    private final AxiomElementType<? extends AxiomSOAPFaultRole> faultRoleType;
+    private final AxiomElementType<? extends AxiomSOAPFaultDetail> faultDetailType;
     private final QName mustUnderstandAttributeQName;
     private final QName roleAttributeQName;
     private final QName relayAttributeQName;
     
     protected SOAPHelper(SOAPVersion version, String specName,
-            Class<? extends AxiomSOAPEnvelope> envelopeClass,
-            Class<? extends AxiomSOAPHeader> headerClass,
-            Class<? extends AxiomSOAPHeaderBlock> headerBlockClass,
-            Class<? extends AxiomSOAPBody> bodyClass,
-            Class<? extends AxiomSOAPFault> faultClass,
-            Class<? extends AxiomSOAPFaultCode> faultCodeClass,
-            Class<? extends AxiomSOAPFaultReason> faultReasonClass,
-            Class<? extends AxiomSOAPFaultRole> faultRoleClass,
-            Class<? extends AxiomSOAPFaultDetail> faultDetailClass,
+            AxiomElementType<? extends AxiomSOAPEnvelope> envelopeType,
+            AxiomElementType<? extends AxiomSOAPHeader> headerType,
+            AxiomElementType<? extends AxiomSOAPHeaderBlock> headerBlockType,
+            AxiomElementType<? extends AxiomSOAPBody> bodyType,
+            AxiomElementType<? extends AxiomSOAPFault> faultType,
+            AxiomElementType<? extends AxiomSOAPFaultCode> faultCodeType,
+            AxiomElementType<? extends AxiomSOAPFaultReason> faultReasonType,
+            AxiomElementType<? extends AxiomSOAPFaultRole> faultRoleType,
+            AxiomElementType<? extends AxiomSOAPFaultDetail> faultDetailType,
             String roleAttributeLocalName, String relayAttributeLocalName) {
         this.version = version;
         namespace = new OMNamespaceImpl(version.getEnvelopeURI(),
                 SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX);
         this.specName = specName;
-        this.envelopeClass = envelopeClass;
-        this.headerClass = headerClass;
+        this.envelopeType = envelopeType;
+        this.headerType = headerType;
         headerQName = new QName(version.getEnvelopeURI(), SOAPConstants.HEADER_LOCAL_NAME,
                 SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX);
-        this.headerBlockClass = headerBlockClass;
-        this.bodyClass = bodyClass;
+        this.headerBlockType = headerBlockType;
+        this.bodyType = bodyType;
         bodyQName = new QName(version.getEnvelopeURI(), SOAPConstants.BODY_LOCAL_NAME,
                 SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX);
-        this.faultClass = faultClass;
+        this.faultType = faultType;
         faultQName = new QName(version.getEnvelopeURI(), SOAPConstants.SOAPFAULT_LOCAL_NAME,
                 SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX);
-        this.faultCodeClass = faultCodeClass;
-        this.faultReasonClass = faultReasonClass;
-        this.faultRoleClass = faultRoleClass;
-        this.faultDetailClass = faultDetailClass;
+        this.faultCodeType = faultCodeType;
+        this.faultReasonType = faultReasonType;
+        this.faultRoleType = faultRoleType;
+        this.faultDetailType = faultDetailType;
         mustUnderstandAttributeQName = new QName(
                 version.getEnvelopeURI(), SOAPConstants.ATTR_MUSTUNDERSTAND, SOAPConstants.SOAP_DEFAULT_NAMESPACE_PREFIX);
         roleAttributeQName = new QName(
@@ -108,64 +109,64 @@ public abstract class SOAPHelper {
         return specName;
     }
 
-    public final Class<? extends AxiomSOAPEnvelope> getEnvelopeClass() {
-        return envelopeClass;
+    public final AxiomElementType<? extends AxiomSOAPEnvelope> getEnvelopeType() {
+        return envelopeType;
     }
 
-    public final Class<? extends AxiomSOAPHeader> getHeaderClass() {
-        return headerClass;
+    public final AxiomElementType<? extends AxiomSOAPHeader> getHeaderType() {
+        return headerType;
     }
 
     public final QName getHeaderQName() {
         return headerQName;
     }
 
-    public final Class<? extends AxiomSOAPHeaderBlock> getHeaderBlockClass() {
-        return headerBlockClass;
+    public final AxiomElementType<? extends AxiomSOAPHeaderBlock> getHeaderBlockType() {
+        return headerBlockType;
     }
 
-    public final Class<? extends AxiomSOAPBody> getBodyClass() {
-        return bodyClass;
+    public final AxiomElementType<? extends AxiomSOAPBody> getBodyType() {
+        return bodyType;
     }
 
     public final QName getBodyQName() {
         return bodyQName;
     }
 
-    public final Class<? extends AxiomSOAPFault> getFaultClass() {
-        return faultClass;
+    public final AxiomElementType<? extends AxiomSOAPFault> getFaultType() {
+        return faultType;
     }
 
     public final QName getFaultQName() {
         return faultQName;
     }
 
-    public final Class<? extends AxiomSOAPFaultCode> getFaultCodeClass() {
-        return faultCodeClass;
+    public final AxiomElementType<? extends AxiomSOAPFaultCode> getFaultCodeType() {
+        return faultCodeType;
     }
 
     public final QName getFaultCodeQName() {
         return version.getFaultCodeQName();
     }
 
-    public final Class<? extends AxiomSOAPFaultReason> getFaultReasonClass() {
-        return faultReasonClass;
+    public final AxiomElementType<? extends AxiomSOAPFaultReason> getFaultReasonType() {
+        return faultReasonType;
     }
 
     public final QName getFaultReasonQName() {
         return version.getFaultReasonQName();
     }
 
-    public final Class<? extends AxiomSOAPFaultRole> getFaultRoleClass() {
-        return faultRoleClass;
+    public final AxiomElementType<? extends AxiomSOAPFaultRole> getFaultRoleType() {
+        return faultRoleType;
     }
 
     public final QName getFaultRoleQName() {
         return version.getFaultRoleQName();
     }
 
-    public final Class<? extends AxiomSOAPFaultDetail> getFaultDetailClass() {
-        return faultDetailClass;
+    public final AxiomElementType<? extends AxiomSOAPFaultDetail> getFaultDetailType() {
+        return faultDetailType;
     }
 
     public final QName getFaultDetailQName() {
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/soap11/SOAP11Helper.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/soap11/SOAP11Helper.java
index 86ba94f..25f6800 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/soap11/SOAP11Helper.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/soap11/SOAP11Helper.java
@@ -19,6 +19,7 @@
 package org.apache.axiom.soap.impl.intf.soap11;
 
 import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 import org.apache.axiom.soap.SOAP11Constants;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPVersion;
@@ -29,15 +30,15 @@ public final class SOAP11Helper extends SOAPHelper {
 
     private SOAP11Helper() {
         super(SOAPVersion.SOAP11, "SOAP 1.1",
-                AxiomSOAP11Envelope.class,
-                AxiomSOAP11Header.class,
-                AxiomSOAP11HeaderBlock.class,
-                AxiomSOAP11Body.class,
-                AxiomSOAP11Fault.class,
-                AxiomSOAP11FaultCode.class,
-                AxiomSOAP11FaultReason.class,
-                AxiomSOAP11FaultRole.class,
-                AxiomSOAP11FaultDetail.class,
+                AxiomNodeFactory::createSOAP11Envelope,
+                AxiomNodeFactory::createSOAP11Header,
+                AxiomNodeFactory::createSOAP11HeaderBlock,
+                AxiomNodeFactory::createSOAP11Body,
+                AxiomNodeFactory::createSOAP11Fault,
+                AxiomNodeFactory::createSOAP11FaultCode,
+                AxiomNodeFactory::createSOAP11FaultReason,
+                AxiomNodeFactory::createSOAP11FaultRole,
+                AxiomNodeFactory::createSOAP11FaultDetail,
                 SOAP11Constants.ATTR_ACTOR, null);
     }
 
diff --git a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/soap12/SOAP12Helper.java b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/soap12/SOAP12Helper.java
index 74a75ba..14b07cf 100644
--- a/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/soap12/SOAP12Helper.java
+++ b/mixins/om-mixins/src/main/java/org/apache/axiom/soap/impl/intf/soap12/SOAP12Helper.java
@@ -19,6 +19,7 @@
 package org.apache.axiom.soap.impl.intf.soap12;
 
 import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.impl.intf.factory.AxiomNodeFactory;
 import org.apache.axiom.soap.SOAP12Constants;
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPVersion;
@@ -29,15 +30,15 @@ public final class SOAP12Helper extends SOAPHelper {
 
     private SOAP12Helper() {
         super(SOAPVersion.SOAP12, "SOAP 1.2",
-            AxiomSOAP12Envelope.class,
-            AxiomSOAP12Header.class,
-            AxiomSOAP12HeaderBlock.class,
-            AxiomSOAP12Body.class,
-            AxiomSOAP12Fault.class,
-            AxiomSOAP12FaultCode.class,
-            AxiomSOAP12FaultReason.class,
-            AxiomSOAP12FaultRole.class,
-            AxiomSOAP12FaultDetail.class,
+            AxiomNodeFactory::createSOAP12Envelope,
+            AxiomNodeFactory::createSOAP12Header,
+            AxiomNodeFactory::createSOAP12HeaderBlock,
+            AxiomNodeFactory::createSOAP12Body,
+            AxiomNodeFactory::createSOAP12Fault,
+            AxiomNodeFactory::createSOAP12FaultCode,
+            AxiomNodeFactory::createSOAP12FaultReason,
+            AxiomNodeFactory::createSOAP12FaultRole,
+            AxiomNodeFactory::createSOAP12FaultDetail,
             SOAP12Constants.SOAP_ROLE, SOAP12Constants.SOAP_RELAY);
     }