diff --git a/code-coverage/pom.xml b/code-coverage/pom.xml
index ba6483a..f0c51bd 100644
--- a/code-coverage/pom.xml
+++ b/code-coverage/pom.xml
@@ -80,7 +80,6 @@
             <groupId>${project.groupId}</groupId>
             <artifactId>axiom-impl</artifactId>
             <version>${project.version}</version>
-            <classifier>original</classifier>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
@@ -100,7 +99,6 @@
             <groupId>${project.groupId}</groupId>
             <artifactId>axiom-dom</artifactId>
             <version>${project.version}</version>
-            <classifier>original</classifier>
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
@@ -169,6 +167,14 @@
         
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>spring-ws-tests</artifactId>
+            <version>${project.version}</version>
+            <classifier>jacoco</classifier>
+            <type>exec</type>
+        </dependency>
+        
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>axiom-samples</artifactId>
             <version>${project.version}</version>
             <classifier>jacoco</classifier>
diff --git a/devguide/src/docbkx/devguide.xml b/devguide/src/docbkx/devguide.xml
index 63815a3..c573300 100644
--- a/devguide/src/docbkx/devguide.xml
+++ b/devguide/src/docbkx/devguide.xml
@@ -170,7 +170,41 @@
     </chapter>
     
     <chapter>
-        <title>OSGi integration</title>
+        <title>OSGi integration and separation between API and implementation</title>
+        <section>
+            <title>Introduction</title>
+            <para>
+                This chapter addresses two related architectural questions:
+            </para>
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        OSGi support was originally introduced in Axiom 1.2.9, but the implementation had
+                        a couple of flaws. This chapter discusses the rationale behind the new OSGi
+                        support introduced in Axiom 1.2.13.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        Axiom is designed as a set of abstract APIs for which two implementations are
+                        provided: LLOM and DOOM. It is important to make a clear distinction between what
+                        is part of the public API and what should be considered implementation classes that
+                        must not be used by application code directly. This also implies that Axiom must
+                        provide the necessary APIs to allow application code to access all features without
+                        the need to access implementation classes directly. This chapter in particular
+                        discusses the question how application code can request factories that support DOM
+                        without the need to refer directly to DOOM.
+                    </para>
+                </listitem>
+            </itemizedlist>
+            <para>
+                These two questions are closely related because OSGi allows to enforce the distinction
+                between public API and implementation classes by carefully selecting the packages
+                exported by the different bundles: only classes belonging to the public API
+                should be exported, while implementation classes should be private to the bundles
+                containing them. This in turn has implications for the packaging of these artifacts.
+            </para>
+        </section>
         <section>
             <title>Requirements</title>
             <formalpara id="osgi-req-no-separate-bundles">
@@ -195,6 +229,13 @@
                     doesn't need to be rewritten.
                 </para>
             </formalpara>
+            <note>
+                <para>
+                    This requirement was already satisfied by the OSGi support introduced in Axiom 1.2.9.
+                    It therefore also ensures that the transition to the new OSGi support in Axiom 1.2.13
+                    is transparent for applications that already use Axiom in an OSGi container.
+                </para>
+            </note>
             <formalpara id="osgi-req-same-impl-selection">
                 <title>Requirement 3</title>
                 <para>
@@ -205,19 +246,12 @@
                     a system property is not meaningful.
                 </para>
             </formalpara>
-            <note>
-                <para>
-                    This is currently not the case. In a non OSGi environment, recent versions of Axiom
-                    use JDK 1.3 service discovery to locate the default implementation and fall back to
-                    LLOM if none is found. DOOM will never be selected as the default implementation.
-                    On the other hand, the current OSGi integration will select any Axiom implementation
-                    as default implementation, but gives priority to LLOM.
-                </para>
-            </note>
             <formalpara id="osgi-ref-impl-not-exported">
                 <title>Requirement 4</title>
                 <para>
-                    The bundles for the LLOM and DOOM implementations MUST NOT export any packages.
+                    Only classes belonging to the public API should be exported by the OSGi bundles.
+                    Implementation classes should not be exported. In particular,
+                    the bundles for the LLOM and DOOM implementations MUST NOT export any packages.
                     This is required to keep a clean separation between the public API and implementation
                     specific classes and to make sure that the implementations can be modified without the
                     risk of breaking existing code.
@@ -234,31 +268,32 @@
                     they should be used in scope <literal>runtime</literal>.
                 </para>
                 <para>
-                    Although this requirement is easy to implement for the Axiom project, there are
-                    currently a couple of issues in the downstreams project that need to be addressed
-                    to make this work:
+                    Although this requirement is easy to implement for the Axiom project, it requires
+                    changes to downstreams project to make this actually work:
                 </para>
                 <itemizedlist>
                     <listitem>
                         <para>
                             As explained in <ulink url="https://issues.apache.org/jira/browse/AXIS2-4902">AXIS2-4902</ulink>,
-                            there are many places in Axis2 that still refer directly to Axiom implementation classes.
-                        </para>
-                    </listitem>
-                    <listitem>
-                        <para>
-                            The <literal>axis2-saaj</literal> module is tightly coupled to <literal>axiom-dom</literal>.
-                            Making this work will probably require using <literal>maven-shade-plugin</literal> to
-                            include (a relocated copy of) the DOOM classes into <literal>axis2-saaj</literal>.
+                            there used to be many places in Axis2 that still referred directly to Axiom implementation classes.
+                            The same was true for Rampart and Sandesha2. This has now been fixed and all three projects
+                            use <literal>axiom-impl</literal> and <literal>axiom-dom</literal> as dependencies in scope
+                            <literal>runtime</literal>.
                         </para>
                     </listitem>
                     <listitem>
                         <para>
                             Abdera extends the LLOM implementation. Probably, some <literal>maven-shade-plugin</literal>
-                            magic will be required here as well to create Abdera OSGi bundles that work properly with
+                            magic will be required here to create Abdera OSGi bundles that work properly with
                             the Axiom bundles.
                         </para>
                     </listitem>
+                    <listitem>
+                        <para>
+                            For Spring Web Services this issue is addressed by
+                            <ulink url="https://jira.springsource.org/browse/SWS-822">SWS-822</ulink>.
+                        </para>
+                    </listitem>
                 </itemizedlist>
             </note>
             <formalpara id="osgi-req-dropin">
@@ -515,8 +550,9 @@
             <note>
                 <para>
                     DOOM is generally not considered suitable as a default implementation because it doesn't
-                    implement the complete Axiom API (e.g. it doesn't support <classname>OMSourcedElement</classname>)
-                    and because the factory classes are not stateless.
+                    implement the complete Axiom API (e.g. it doesn't support <classname>OMSourcedElement</classname>).
+                    In addition, in earlier versions of Axiom, the factory classes for DOOM were not stateless
+                    (see <ulink url="https://issues.apache.org/jira/browse/AXIOM-412">AXIOM-412</ulink>).
                 </para>
             </note>
             <para>
@@ -603,6 +639,119 @@
                 Axiom implementations (e.g. if the JAR is an uber-JAR repackaged from the standard Axiom JARs).
             </para>
         </section>
+        <section>
+            <title>Common implementation classes</title>
+            <para>
+                Obviously the LLOM and DOOM implementations share some amount of common code. Historically,
+                implementation classes reusable between LLOM and DOOM were placed in <literal>axiom-api</literal>.
+                This however tends to blur the distinction between the public API and implementation classes.
+                Starting with Axiom 1.2.13 such classes are placed into a separate module called
+                <literal>axiom-common-impl</literal>. However, <literal>axiom-common-impl</literal> cannot simply
+                be a dependency of <literal>axiom-impl</literal> and <literal>axiom-dom</literal>.
+                The reason is that in an OSGi environment, the <literal>axiom-common-impl</literal> bundle
+                would have to export these shared classes, which is in contradiction with <xref linkend="osgi-ref-impl-not-exported"/>.
+                Therefore the code from <literal>axiom-common-impl</literal> needs to be packaged into
+                <literal>axiom-impl</literal> and <literal>axiom-dom</literal> by the build process so that
+                the <literal>axiom-common-impl</literal> artifact is not required at runtime.
+                <xref linkend="osgi-req-no-separate-bundles"/> forbids using embedded JARs to achieve this.
+                Instead <literal>maven-shade-plugin</literal> is used to include the classes
+                from <literal>axiom-common-impl</literal> into <literal>axiom-impl</literal> and <literal>axiom-dom</literal>
+                (and to modify the POMs to remove the dependencies on <literal>axiom-common-impl</literal>).
+            </para>
+            <para>
+                This raises the question whether <literal>maven-shade-plugin</literal> should be configured to
+                simply copy the classes or to relocate them (i.e. to change their package names). There are a couple
+                of arguments in favor of relocating them:
+            </para>
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        According to <xref linkend="osgi-req-no-separate-bundles"/>, the Axiom artifacts should be
+                        usable both as normal JARs and as OSGi bundles. Obviously the expectation is that from the
+                        point of view of application code, they should work in the same in OSGi and non OSGi environments.
+                        Relocation is required if one wants to strictly satisfy this requirement even if different versions
+                        of <literal>axiom-impl</literal> and <literal>axiom-dom</literal> are mixed.
+                        Since the container creates separate class loaders for the <literal>axiom-impl</literal> and <literal>axiom-dom</literal> bundles,
+                        it is always possible to do that in an OSGi environment: even if the shared classes
+                        included in <literal>axiom-impl</literal> and <literal>axiom-dom</literal> are
+                        not relocated, but have the same names, this will not result in conflicts.
+                        The situation is different in a non OSGi environment where the classes in <literal>axiom-impl</literal>
+                        and <literal>axiom-dom</literal> are loaded by the same class loader. If the shared classes
+                        are not relocated, then there may be a conflict if the versions don't match.
+                    </para>
+                    <para>
+                        However, in practice it is unlikely that there are valid use case where one would use
+                        <literal>axiom-impl</literal> and <literal>axiom-dom</literal> artifacts from different Axiom versions.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        Relocation allows to preserve compatibility when duplicate code from
+                        <literal>axiom-impl</literal> and <literal>axiom-dom</literal> is merged and moved
+                        to <literal>axiom-common-impl</literal>. The <classname>OMNamespaceImpl</classname>,
+                        <classname>OMNavigator</classname> and <classname>OMStAXWrapper</classname> classes
+                        from <literal>axiom-impl</literal> and the <classname>NamespaceImpl</classname>,
+                        <classname>DOMNavigator</classname> and <classname>DOMStAXWrapper</classname>
+                        classes from <literal>axiom-dom</literal> that existed in earlier versions of Axiom
+                        are examples of this. The classes in <literal>axiom-dom</literal> were almost identical
+                        to the corresponding classes in <literal>axiom-impl</literal>. These classes have been
+                        merged and moved to <literal>axiom-common-impl</literal>. Relocation then allows them
+                        to retain their original name (including the original package name) in the
+                        <literal>axiom-impl</literal> and <literal>axiom-dom</literal> artifacts.
+                    </para>
+                    <para>
+                        However, this is only a concern if one wants to preserve compatibility with existing
+                        code that directly uses these implementation specific classes (which is something that is
+                        strongly discouraged). One example where this was relevant was the SAAJ implementation
+                        in Axis2 which used to be very strongly coupled to the DOOM implementation. This however
+                        has been fixed now.
+                    </para>
+                </listitem>
+            </itemizedlist>
+            <para>
+                Using relocation also has some serious disadvantages:
+            </para>
+            <itemizedlist>
+                <listitem>
+                    <para>
+                        Stack traces may contain class names that don't match class names in the Axiom source
+                        code, making debugging harder.
+                    </para>
+                </listitem>
+                <listitem>
+                    <para>
+                        Axiom now uses JaCoCo to produce code coverage reports. However these reports are
+                        incomplete if relocation is used. This doesn't affect test cases executed in
+                        the <literal>axiom-impl</literal> and <literal>axiom-dom</literal> modules
+                        (because they are executed with the original classes), but tests in separate modules
+                        (such as integration tests). There are actually two issues:
+                    </para>
+                    <itemizedlist>
+                        <listitem>
+                            <para>
+                                For the relocated classes, JaCoCo is unable to find the corresponding source code.
+                                This means that the reported code coverage is inaccurate for classes in
+                                <literal>axiom-common-impl</literal>.
+                            </para>
+                        </listitem>
+                        <listitem>
+                            <para>
+                                Relocation not only modifies the classes in <literal>axiom-common-impl</literal>, but
+                                also the classes in <literal>axiom-impl</literal> and <literal>axiom-dom</literal>
+                                that use them. JaCoCo <ulink url="https://github.com/jacoco/jacoco/issues/51">detects this</ulink>
+                                and excludes the data from the coverage analysis. This means that the
+                                reported code coverage will also be inaccurate for classes in
+                                <literal>axiom-impl</literal> and <literal>axiom-dom</literal>.
+                            </para>
+                        </listitem>
+                    </itemizedlist>
+                </listitem>
+            </itemizedlist>
+            <para>
+                In Axiom 1.2.14 relocation was used, but this has been changed in Axiom 1.2.15 because the disadvantages
+                outweigh the advantages.
+            </para>
+        </section>
     </chapter>
     
     <chapter>
diff --git a/modules/axiom-common-impl-testsuite/pom.xml b/modules/axiom-common-impl-testsuite/pom.xml
deleted file mode 100644
index cc127a1..0000000
--- a/modules/axiom-common-impl-testsuite/pom.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ 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.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.ws.commons.axiom</groupId>
-        <artifactId>axiom</artifactId>
-        <version>1.2.15-SNAPSHOT</version>
-        <relativePath>../../pom.xml</relativePath>
-    </parent>
-    <artifactId>axiom-common-impl-testsuite</artifactId>
-    <name>Axiom Common Implementation Test Suite</name>
-    <description>
-        Test suite containing test cases that apply only to implementations based on
-        axiom-common-impl.
-    </description>
-    <!-- This needs to be set explicitly because the project structure implies that the Maven calculated defaults are wrong -->
-    <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/axiom/modules/axiom-common-impl-testsuite</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/webservices/commons/trunk/modules/axiom/modules/axiom-common-impl-testsuite</developerConnection>
-        <url>http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-common-impl-testsuite</url>
-    </scm>
-    <!-- This also needs to be set explicitly because the Maven calculated URL would point to nowhere -->
-    <url>http://ws.apache.org/axiom/</url>
-    <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>axiom-common-impl</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>axiom-testutils</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>axiom-api</artifactId>
-            <classifier>tests</classifier>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>xmlunit</groupId>
-            <artifactId>xmlunit</artifactId>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-site-plugin</artifactId>
-                <configuration>
-                    <skip>true</skip>
-                    <skipDeploy>true</skipDeploy>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/CommonImplTestCase.java b/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/CommonImplTestCase.java
deleted file mode 100644
index d066da1..0000000
--- a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/CommonImplTestCase.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.ts;
-
-import org.apache.axiom.om.OMMetaFactory;
-import org.apache.axiom.testutils.suite.TestCaseEx;
-
-public abstract class CommonImplTestCase extends TestCaseEx {
-    protected final OMMetaFactory metaFactory;
-
-    public CommonImplTestCase(OMMetaFactory metaFactory) {
-        this.metaFactory = metaFactory;
-    }
-}
diff --git a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/CommonImplTestSuiteBuilder.java b/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/CommonImplTestSuiteBuilder.java
deleted file mode 100644
index 81fe7d4..0000000
--- a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/CommonImplTestSuiteBuilder.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.ts;
-
-import org.apache.axiom.om.OMMetaFactory;
-import org.apache.axiom.testutils.suite.TestSuiteBuilder;
-import org.apache.axiom.ts.om.navigator.TestFullyBuilt;
-import org.apache.axiom.ts.om.navigator.TestHalfBuilt;
-import org.apache.axiom.ts.om.navigator.TestHalfBuiltStep;
-
-public class CommonImplTestSuiteBuilder extends TestSuiteBuilder {
-    private final OMMetaFactory metaFactory;
-
-    public CommonImplTestSuiteBuilder(OMMetaFactory metaFactory) {
-        this.metaFactory = metaFactory;
-    }
-
-    protected void addTests() {
-        addTest(new TestFullyBuilt(metaFactory));
-        addTest(new TestHalfBuilt(metaFactory));
-        addTest(new TestHalfBuiltStep(metaFactory));
-    }
-}
diff --git a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/OMNavigatorTestCase.java b/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/OMNavigatorTestCase.java
deleted file mode 100644
index 096cdb3..0000000
--- a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/OMNavigatorTestCase.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.ts.om.navigator;
-
-import javax.xml.stream.XMLStreamReader;
-
-import org.apache.axiom.om.AbstractTestCase;
-import org.apache.axiom.om.OMMetaFactory;
-import org.apache.axiom.om.TestConstants;
-import org.apache.axiom.om.util.StAXUtils;
-import org.apache.axiom.soap.SOAPEnvelope;
-import org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder;
-import org.apache.axiom.ts.CommonImplTestCase;
-
-public abstract class OMNavigatorTestCase extends CommonImplTestCase {
-    protected SOAPEnvelope envelope;
-    protected StAXSOAPModelBuilder builder;
-
-    public OMNavigatorTestCase(OMMetaFactory metaFactory) {
-        super(metaFactory);
-    }
-
-    protected void setUp() throws Exception {
-        XMLStreamReader xmlStreamReader = StAXUtils.
-                createXMLStreamReader(AbstractTestCase.getTestResource(TestConstants.SOAP_SOAPMESSAGE1));
-        builder = new StAXSOAPModelBuilder(metaFactory, xmlStreamReader, null);
-        envelope = (SOAPEnvelope) builder.getDocumentElement();
-    }
-
-    protected void tearDown() throws Exception {
-        builder.close();
-    }
-}
diff --git a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/TestFullyBuilt.java b/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/TestFullyBuilt.java
deleted file mode 100644
index e6da5f9..0000000
--- a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/TestFullyBuilt.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.ts.om.navigator;
-
-import java.io.ByteArrayOutputStream;
-
-import javax.xml.stream.XMLStreamWriter;
-
-import org.apache.axiom.om.OMConstants;
-import org.apache.axiom.om.OMMetaFactory;
-import org.apache.axiom.om.OMSerializable;
-import org.apache.axiom.om.impl.common.OMNavigator;
-import org.apache.axiom.om.util.StAXUtils;
-
-public class TestFullyBuilt extends OMNavigatorTestCase {
-    public TestFullyBuilt(OMMetaFactory metaFactory) {
-        super(metaFactory);
-    }
-
-    protected void runTest() throws Throwable {
-        assertNotNull(envelope);
-        //dump the out put to a  temporary file
-        XMLStreamWriter output =
-            StAXUtils.createXMLStreamWriter(
-                    new ByteArrayOutputStream(), OMConstants.DEFAULT_CHAR_SET_ENCODING);
-        envelope.serialize(output);
-
-        //now the OM is fully created -> test the navigation
-        OMNavigator navigator = new OMNavigator(envelope);
-        OMSerializable node = null;
-        while (navigator.isNavigable()) {
-            node = navigator.next();
-            assertNotNull(node);
-        }
-    }
-}
diff --git a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/TestHalfBuilt.java b/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/TestHalfBuilt.java
deleted file mode 100644
index fb5b682..0000000
--- a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/TestHalfBuilt.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.ts.om.navigator;
-
-import org.apache.axiom.om.OMMetaFactory;
-import org.apache.axiom.om.OMSerializable;
-import org.apache.axiom.om.impl.common.OMNavigator;
-
-public class TestHalfBuilt extends OMNavigatorTestCase {
-    public TestHalfBuilt(OMMetaFactory metaFactory) {
-        super(metaFactory);
-    }
-
-    protected void runTest() throws Throwable {
-        assertNotNull(envelope);
-        //now the OM is not fully created. Try to navigate it
-        OMNavigator navigator = new OMNavigator(envelope);
-        OMSerializable node = null;
-        while (navigator.isNavigable()) {
-            node = navigator.next();
-            assertNotNull(node);
-        }
-    }
-}
diff --git a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/TestHalfBuiltStep.java b/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/TestHalfBuiltStep.java
deleted file mode 100644
index b7a6f32..0000000
--- a/modules/axiom-common-impl-testsuite/src/main/java/org/apache/axiom/ts/om/navigator/TestHalfBuiltStep.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.ts.om.navigator;
-
-import org.apache.axiom.om.OMMetaFactory;
-import org.apache.axiom.om.OMSerializable;
-import org.apache.axiom.om.impl.common.OMNavigator;
-
-public class TestHalfBuiltStep extends OMNavigatorTestCase {
-    public TestHalfBuiltStep(OMMetaFactory metaFactory) {
-        super(metaFactory);
-    }
-
-    protected void runTest() throws Throwable {
-        assertNotNull(envelope);
-
-        //now the OM is not fully created
-        OMNavigator navigator = new OMNavigator(envelope);
-        OMSerializable node = null;
-        while (!navigator.isCompleted()) {
-            if (navigator.isNavigable()) {
-                node = navigator.next();
-            } else {
-                builder.next();
-                navigator.step();
-                node = navigator.next();
-            }
-            assertNotNull(node);
-
-        }
-    }
-}
diff --git a/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/OMNavigator.java b/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/OMNavigator.java
deleted file mode 100644
index 1dd2687..0000000
--- a/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/OMNavigator.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * 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.common;
-
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMDocument;
-import org.apache.axiom.om.OMNode;
-import org.apache.axiom.om.OMSerializable;
-import org.apache.axiom.om.OMSourcedElement;
-import org.apache.axiom.om.impl.OMNodeEx;
-
-/**
- * Refer to the test, org.apache.axiom.om.OMNavigatorTest, to find out how to use features like
- * isNavigable, isComplete and step.
- */
-public class OMNavigator {
-    /** Field node */
-    protected OMSerializable node;
-
-    /** Field visited */
-    private boolean visited;
-
-    /** Field next */
-    private OMSerializable next;
-
-    // root is the starting element. Once the navigator comes back to the
-    // root, the traversal is terminated
-
-    /** Field root */
-    private OMContainer root;
-
-    /** Field backtracked */
-    private boolean backtracked;
-
-    // flags that tell the status of the navigator
-
-    /** Field end */
-    private boolean end = false;
-
-    /** Field start */
-    private boolean start = true;
-    
-    // Indicates if an OMSourcedElement with an OMDataSource should
-    // be considered as an interior node or a leaf node.
-    private boolean isDataSourceALeaf = false;
-
-    /**
-     * Constructor OMNavigator.
-     *
-     * @param node
-     */
-    public OMNavigator(OMContainer node) {
-        next = node;
-        root = node;
-        backtracked = false;
-    }
-
-    /**
-     * Indicate if an OMSourcedElement with a OMDataSource
-     * should be considered as an interior element node or as
-     * a leaf.  
-     * @param value boolean
-     */
-    public void setDataSourceIsLeaf(boolean value) {
-        isDataSourceALeaf = value;
-    }
-
-    /**
-     * Get the next information item.
-     * 
-     * @return the next information item in the sequence of preorder traversal. Note however that a
-     *         container (document or element) is treated slightly differently. Once the container
-     *         is passed it returns the same item in the next encounter as well.
-     */
-    public OMSerializable getNext() {
-        if (next == null) {
-            return null;
-        }
-        node = next;
-        visited = backtracked;
-        backtracked = false;
-        updateNextNode();
-
-        // set the starting and ending flags
-        if (root.equals(node)) {
-            if (!start) {
-                end = true;
-            } else {
-                start = false;
-            }
-        }
-        return node;
-    }
-    
-    /**
-     * Get the next node. This method only exists for compatibility with existing code. It may throw
-     * a {@link ClassCastException} if an attempt is made to use it on a navigator that was created
-     * from an {@link OMDocument}.
-     * 
-     * @return the next node
-     * @see #getNext()
-     */
-    public OMNode next() {
-        return (OMNode)getNext();
-    }
-
-    /** Private method to encapsulate the searching logic. */
-    private void updateNextNode() {
-        if (!isLeaf(next) && !visited) {
-            OMNode firstChild = _getFirstChild((OMContainer) next);
-            if (firstChild != null) {
-                next = firstChild;
-            } else if (next.isComplete()) {
-                backtracked = true;
-            } else {
-                next = null;
-            }
-        } else {
-            if (next instanceof OMDocument) {
-                next = null;
-            } else {
-                OMNode nextNode = (OMNode)next;
-                OMContainer parent = nextNode.getParent();
-                OMNode nextSibling = getNextSibling(nextNode);
-                if (nextSibling != null) {
-                    next = nextSibling;
-                } else if ((parent != null) && parent.isComplete()) {
-                    next = parent;
-                    backtracked = true;
-                } else {
-                    next = null;
-                }
-            }
-        }
-    }
-    
-    /**
-     * @param n OMNode
-     * @return true if this OMNode should be considered a leaf node
-     */
-    private boolean isLeaf(OMSerializable n) {
-        if (n instanceof OMContainer) {
-            return this.isDataSourceALeaf && isOMSourcedElement(n) && n != root;
-        } else {
-            return true;
-        }
-    }
-
-    private boolean isOMSourcedElement(OMSerializable node) {
-        if (node instanceof OMSourcedElement) {
-            try {
-                return ((OMSourcedElement)node).getDataSource() != null;
-            } catch (UnsupportedOperationException e) {
-                // Operation unsupported for some implementations
-                return false;
-            }
-        } else {
-            return false;
-        }
-    }
-    
-    /**
-     * @param node
-     * @return first child or null
-     */
-    private OMNode _getFirstChild(OMContainer node) {
-        // TODO: We have a problem if the tree has parts constructed by different builders; this is related to AXIOM-201 and AXIOM-431
-        if (node.getBuilder() != root.getBuilder()) {
-            OMNode first = node.getFirstOMChild();
-            OMNode sibling = first;
-            while (sibling != null) {
-                sibling = sibling.getNextOMSibling();
-            }
-            return first;
-        } else {
-            return ((IContainer)node).getFirstOMChildIfAvailable();
-        }
-    }
-
-    /**
-     * @param node
-     * @return next sibling or null
-     */
-    private OMNode getNextSibling(OMNode node) {
-        if (isOMSourcedElement(node)) {
-            return node.getNextOMSibling();
-        } else {
-            return ((OMNodeEx) node).getNextOMSiblingIfAvailable();
-        }
-    }
-
-    /**
-     * Method visited.
-     *
-     * @return Returns boolean.
-     */
-    public boolean visited() {
-        return visited;
-    }
-
-    /**
-     * This is a very special method. This allows the navigator to step once it has reached the
-     * existing OM. At this point the isNavigable method will return false but the isComplete method
-     * may return false which means that the navigating the given element is not complete and the
-     * navigator cannot proceed.
-     */
-    public void step() {
-        if (!end) {
-            next = node;
-            updateNextNode();
-        }
-    }
-
-    /**
-     * Returns the navigable status.
-     *
-     * @return Returns boolean.
-     */
-    public boolean isNavigable() {
-        if (end) {
-            return false;
-        } else {
-            return !(next == null);
-        }
-    }
-
-    /**
-     * Returns the completed status.
-     *
-     * @return Returns boolean.
-     */
-    public boolean isCompleted() {
-        return end;
-    }
-}
diff --git a/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/SwitchingWrapper.java b/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/SwitchingWrapper.java
index 1de241f..92ea5f0 100644
--- a/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/SwitchingWrapper.java
+++ b/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/SwitchingWrapper.java
@@ -26,7 +26,6 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.NoSuchElementException;
-import java.util.Stack;
 
 import javax.activation.DataHandler;
 import javax.xml.namespace.NamespaceContext;
@@ -46,7 +45,6 @@
 import org.apache.axiom.om.OMDocument;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMEntityReference;
-import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.OMProcessingInstruction;
@@ -54,6 +52,7 @@
 import org.apache.axiom.om.OMSourcedElement;
 import org.apache.axiom.om.OMText;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.OMNodeEx;
 import org.apache.axiom.om.impl.builder.StAXBuilder;
 import org.apache.axiom.om.impl.exception.OMStreamingException;
 import org.apache.axiom.util.namespace.MapBasedNamespaceContext;
@@ -70,8 +69,26 @@
     
     private static final Log log = LogFactory.getLog(SwitchingWrapper.class);
     
-    /** Field navigator */
-    private OMNavigator navigator;
+    /**
+     * The current node, corresponding to the current event.
+     */
+    private OMSerializable node;
+
+    /**
+     * If the current node is an {@link OMContainer}, then this flag indicates whether the current
+     * event is the start event ({@link XMLStreamConstants#START_DOCUMENT} or
+     * {@link XMLStreamConstants#START_ELEMENT}) or the end event
+     * ({@link XMLStreamConstants#END_DOCUMENT} or {@link XMLStreamConstants#END_ELEMENT}) for that
+     * node. In the latter case, we have already visited the node before, hence the name of the
+     * attribute.
+     */
+    private boolean visited;
+
+    /**
+     * Indicates if an OMSourcedElement with an OMDataSource should
+     * be considered as an interior node or a leaf node.
+     */
+    private boolean isDataSourceALeaf;
 
     /** Field builder */
     private OMXMLParserWrapper builder;
@@ -85,14 +102,13 @@
      */
     private DataHandlerReader dataHandlerReader;
     
-    private boolean _isClosed = false;              // Indicate if parser is closed
-    private boolean _releaseParserOnClose = false;  // Defaults to legacy behavior, which is keep the reference
+    private boolean isClosed = false;              // Indicate if parser is closed
+    private boolean releaseParserOnClose = false;  // Defaults to legacy behavior, which is keep the reference
 
-    /** Field rootNode */
-    private OMContainer rootNode;
-
-    /** Field isFirst */
-    private boolean isFirst = true;
+    /**
+     * The root node, i.e. the node from which the {@link XMLStreamReader} has been requested.
+     */
+    private final OMContainer rootNode;
 
     // Navigable means the output should be taken from the navigator.
     // As soon as the navigator returns a null navigable will be reset
@@ -101,7 +117,6 @@
 
     /** Field NAVIGABLE */
     private static final short NAVIGABLE = 0;
-    private static final short SWITCH_AT_NEXT = 1;
     
     /**
      * Indicates that the last event before the final {@link XMLStreamConstants#END_DOCUMENT} event
@@ -137,27 +152,6 @@
      */
     private final boolean preserveNamespaceContext;
     
-    /** Field elementStack */
-    private Stack nodeStack = null;
-
-    // keeps the next event. The parser actually keeps one step ahead to
-    // detect the end of navigation. (at the end of the stream the navigator
-    // returns a null
-
-    /** Field nextNode */
-    private OMSerializable nextNode = null;
-
-    // holder for the current node. Needs this to generate events from the
-    // current node
-
-    /** Field currentNode */
-    private OMSerializable currentNode = null;
-
-    // needs this to refer to the last known node
-
-    /** Field lastNode */
-    private OMSerializable lastNode = null;
-
     /** Track depth to ensure we stop generating events when we are done with the root node. */
     int depth = 0;
 
@@ -181,29 +175,18 @@
     public SwitchingWrapper(OMXMLParserWrapper builder, OMContainer startNode,
                             boolean cache, boolean preserveNamespaceContext) {
 
-        // create a navigator
-        this.navigator = new OMNavigator(startNode);
         this.builder = builder;
         this.rootNode = startNode;
         this.cache = cache;
         this.preserveNamespaceContext = preserveNamespaceContext;
 
-        // initiate the next and current nodes
-        // Note - navigator is written in such a way that it first
-        // returns the starting node at the first call to it
-        
-        currentNode = navigator.getNext();
-        updateNextNode(!cache);
+        // If the start node is a document it become the current node. If the start node
+        // is an element, then there is no current node, because there is no node
+        // corresponding to the current event (START_DOCUMENT).
         if (startNode instanceof OMDocument) {
-            currentEvent = -1;
-            try {
-                next();
-            } catch (XMLStreamException ex) {
-                throw new OMException(ex);
-            }
-        } else {
-            currentEvent = START_DOCUMENT;
+            node = startNode;
         }
+        currentEvent = START_DOCUMENT;
     }
 
     /**
@@ -216,7 +199,7 @@
         } else {
             if ((currentEvent == START_ELEMENT)
                     || (currentEvent == END_ELEMENT)) {
-                return ((OMElement)lastNode).getPrefix();
+                return ((OMElement)node).getPrefix();
             } else {
                 throw new IllegalStateException();
             }
@@ -233,7 +216,7 @@
         } else {
             if ((currentEvent == START_ELEMENT)
                     || (currentEvent == END_ELEMENT)) {
-                return ((OMElement)lastNode).getNamespaceURI();
+                return ((OMElement)node).getNamespaceURI();
             } else {
                 throw new IllegalStateException();
             }
@@ -264,9 +247,9 @@
             switch (currentEvent) {
                 case START_ELEMENT:
                 case END_ELEMENT:
-                    return ((OMElement)lastNode).getLocalName();
+                    return ((OMElement)node).getLocalName();
                 case ENTITY_REFERENCE:
-                    return ((OMEntityReference)lastNode).getName();
+                    return ((OMEntityReference)node).getName();
                 default:
                     throw new IllegalStateException();
             }
@@ -283,7 +266,7 @@
         } else {
             if ((currentEvent == START_ELEMENT)
                     || (currentEvent == END_ELEMENT)) {
-                return ((OMElement)lastNode).getQName();
+                return ((OMElement)node).getQName();
             } else {
                 throw new IllegalStateException();
             }
@@ -368,11 +351,11 @@
             // and the other ones in getTextFromNode().
             switch (currentEvent) {
                 case DTD:
-                    String internalSubset = ((OMDocType)lastNode).getInternalSubset();
+                    String internalSubset = ((OMDocType)node).getInternalSubset();
                     // Woodstox returns the empty string if there is no internal subset
                     return internalSubset != null ? internalSubset : "";
                 case ENTITY_REFERENCE:
-                    return ((OMEntityReference)lastNode).getReplacementText();
+                    return ((OMEntityReference)node).getReplacementText();
                 default:
                     return getTextFromNode();
             }
@@ -391,9 +374,9 @@
             case CHARACTERS:
             case CDATA:
             case SPACE:
-                return ((OMText)lastNode).getText();
+                return ((OMText)node).getText();
             case COMMENT:
-                return ((OMComment)lastNode).getValue();
+                return ((OMComment)node).getValue();
             default:
                 throw new IllegalStateException();
         }
@@ -407,7 +390,7 @@
                 case CHARACTERS:
                 case CDATA:
                 case SPACE:
-                    OMText text = (OMText)lastNode;
+                    OMText text = (OMText)node;
                     if (text.isCharacters()) {
                         writer.write(text.getTextCharacters());
                     } else {
@@ -416,7 +399,7 @@
                     }
                     break;
                 case COMMENT:
-                    writer.write(((OMComment)lastNode).getValue());
+                    writer.write(((OMComment)node).getValue());
                     break;
                 default:
                     throw new IllegalStateException();
@@ -437,7 +420,7 @@
     private void loadAttributes() {
         if (attributeCount == -1) {
             attributeCount = 0;
-            for (Iterator it = ((OMElement)lastNode).getAllAttributes(); it.hasNext(); ) {
+            for (Iterator it = ((OMElement)node).getAllAttributes(); it.hasNext(); ) {
                 OMAttribute attr = (OMAttribute)it.next();
                 if (attributeCount == attributes.length) {
                     OMAttribute[] newAttributes = new OMAttribute[attributes.length*2];
@@ -458,11 +441,11 @@
     private void loadNamespaces() {
         if (namespaceCount == -1) {
             namespaceCount = 0;
-            for (Iterator it = ((OMElement)lastNode).getAllDeclaredNamespaces(); it.hasNext(); ) {
+            for (Iterator it = ((OMElement)node).getAllDeclaredNamespaces(); it.hasNext(); ) {
                 addNamespace((OMNamespace)it.next());
             }
-            if (preserveNamespaceContext && lastNode == rootNode) {
-                OMElement element = (OMElement)lastNode;
+            if (preserveNamespaceContext && node == rootNode) {
+                OMElement element = (OMElement)node;
                 while (true) {
                     OMContainer container = element.getParent();
                     if (container instanceof OMElement) {
@@ -736,7 +719,7 @@
         } else {
             if (isStartElement()) {
                 QName qname = new QName(s, s1);
-                OMAttribute attrib = ((OMElement) lastNode).getAttribute(qname);
+                OMAttribute attrib = ((OMElement) node).getAttribute(qname);
                 if (attrib != null) {
                     returnString = attrib.getAttributeValue();
                 }
@@ -819,9 +802,9 @@
         } else {
             if (isStartElement() || isEndElement()) {
 
-                if (lastNode instanceof OMElement) {
+                if (node instanceof OMElement) {
                     OMNamespace namespaceURI =
-                            ((OMElement) lastNode).findNamespaceURI(prefix);
+                            ((OMElement) node).findNamespaceURI(prefix);
                     return namespaceURI != null ? namespaceURI.getNamespaceURI() : null;
                 }
             }
@@ -848,9 +831,9 @@
                         parser.close();
                     }
                 } finally {
-                    _isClosed = true;
+                    isClosed = true;
                     // Release the parser so that it can be GC'd or reused.
-                    if (_releaseParserOnClose) {
+                    if (releaseParserOnClose) {
                         setParser(null);
                     }
                 }
@@ -883,6 +866,94 @@
         }
     }
 
+    /** Private method to encapsulate the searching logic. */
+    private void nextNode() {
+        if (node == null) {
+            // We get here if rootNode is an element and the current event is START_DOCUMENT
+            node = rootNode;
+        } else if (!isLeaf(node) && !visited) {
+            OMNode firstChild = _getFirstChild((OMContainer) node);
+            if (firstChild != null) {
+                node = firstChild;
+                visited = false;
+            } else if (node.isComplete()) {
+                visited = true;
+            } else {
+                node = null;
+            }
+        } else {
+            OMNode nextNode = (OMNode)node;
+            OMContainer parent = nextNode.getParent();
+            OMNode nextSibling = getNextSibling(nextNode);
+            if (nextSibling != null) {
+                node = nextSibling;
+                visited = false;
+            } else if (parent.isComplete()) {
+                node = parent;
+                visited = true;
+            } else {
+                node = null;
+            }
+        }
+    }
+    
+    /**
+     * @param n OMNode
+     * @return true if this OMNode should be considered a leaf node
+     */
+    private boolean isLeaf(OMSerializable n) {
+        if (n instanceof OMContainer) {
+            return this.isDataSourceALeaf && isOMSourcedElement(n) && n != rootNode;
+        } else {
+            return true;
+        }
+    }
+
+    private boolean isOMSourcedElement(OMSerializable node) {
+        if (node instanceof OMSourcedElement) {
+            try {
+                return ((OMSourcedElement)node).getDataSource() != null;
+            } catch (UnsupportedOperationException e) {
+                // Operation unsupported for some implementations
+                return false;
+            }
+        } else {
+            return false;
+        }
+    }
+    
+    /**
+     * @param node
+     * @return first child or null
+     */
+    private OMNode _getFirstChild(OMContainer node) {
+        if (cache) {
+            return node.getFirstOMChild();
+        } else if (node.getBuilder() != rootNode.getBuilder()) {
+            // TODO: We have a problem if the tree has parts constructed by different builders; this is related to AXIOM-201 and AXIOM-431
+            OMNode first = node.getFirstOMChild();
+            OMNode sibling = first;
+            while (sibling != null) {
+                sibling = sibling.getNextOMSibling();
+            }
+            return first;
+        } else {
+            return ((IContainer)node).getFirstOMChildIfAvailable();
+        }
+    }
+
+    /**
+     * @param node
+     * @return next sibling or null
+     */
+    private OMNode getNextSibling(OMNode node) {
+        if (cache || isOMSourcedElement(node)) {
+            return node.getNextOMSibling();
+        } else {
+            return ((OMNodeEx) node).getNextOMSiblingIfAvailable();
+        }
+    }
+
     /**
      * Method next.
      *
@@ -897,35 +968,32 @@
                 state = DOCUMENT_COMPLETE;
                 currentEvent = END_DOCUMENT;
                 break;
-            case SWITCH_AT_NEXT:
-                state = SWITCHED;
-
-                // load the parser
-                try {
-                    setParser((XMLStreamReader) builder.getParser());
-                } catch (Exception e) {
-                    throw new XMLStreamException("problem accessing the parser. " + e.getMessage(),
-                                                 e);
-                }
-
-                // We should throw an END_DOCUMENT
-                if ((currentEvent == START_DOCUMENT)
-                        && (currentEvent == parser.getEventType())) {
-                    currentEvent = parser.next();
-                } else {
-                    currentEvent = parser.getEventType();
-                }
-                updateCompleteStatus();
-                break;
             case NAVIGABLE:
-                currentEvent = generateEvents(currentNode);
+                nextNode();
+                if (node != null) {
+                    currentEvent = generateEvents(node);
+                    attributeCount = -1;
+                    namespaceCount = -1;
+                } else {
+                    // reset caching (the default is ON so it was not needed in the
+                    // earlier case!
+                    builder.setCache(false);
+                    state = SWITCHED;
+
+                    // load the parser
+                    try {
+                        setParser((XMLStreamReader) builder.getParser());
+                    } catch (Exception e) {
+                        throw new XMLStreamException("problem accessing the parser. " + e.getMessage(),
+                                                     e);
+                    }
+
+                    currentEvent = parser.next();
+                }
                 updateCompleteStatus();
-                updateLastNode();
                 break;
             case SWITCHED:
-                if (parser.hasNext()) {
-                    currentEvent = parser.next();
-                }
+                currentEvent = parser.next();
                 updateCompleteStatus();
                 break;
             default:
@@ -970,57 +1038,6 @@
         return null;
     }
 
-    /**
-     * This is a very important method. It keeps the navigator one step ahead and pushes it one
-     * event ahead. If the nextNode is null then navigable is set to false. At the same time the
-     * parser and builder are set up for the upcoming event generation.
-     *
-     * @throws XMLStreamException
-     */
-    private void updateLastNode() throws XMLStreamException {
-        lastNode = currentNode;
-        attributeCount = -1;
-        namespaceCount = -1;
-        currentNode = nextNode;
-        updateNextNode(!cache);
-    }
-
-    /** Method updateNextNode. */
-    private void updateNextNode(boolean switchingAllowed) {
-        if (navigator.isNavigable()) {
-            nextNode = navigator.getNext();
-        } else {
-            if (!switchingAllowed) {
-                if (navigator.isCompleted() || builder == null || builder.isCompleted()) {
-                    nextNode = null;
-                    if (log.isDebugEnabled()) {
-                        if (builder == null || builder.isCompleted()) {
-                            log.debug("Builder is complete.  Next node is set to null.");
-                        }
-                    }
-                } else {
-                    builder.next();
-                    navigator.step();
-                    nextNode = navigator.getNext();
-                }
-            } else {
-                //at this point check whether the navigator is done
-                //if the navigator is done then we are fine and can directly
-                // jump to the complete state ?
-                if (navigator.isCompleted()) {
-                    nextNode = null;
-                } else {
-                    // reset caching (the default is ON so it was not needed in the
-                    // earlier case!
-                    if (builder != null) {
-                        builder.setCache(false);
-                    }
-                    state = SWITCH_AT_NEXT;
-                }
-            }
-        }
-    }
-
     /** Method updateCompleteStatus. */
     private void updateCompleteStatus() {
         if (currentEvent == START_ELEMENT) {
@@ -1029,10 +1046,8 @@
             depth--;
         }
         if (state == NAVIGABLE) {
-            if (rootNode == currentNode) {
-                if (isFirst) {
-                    isFirst = false;
-                } else if (currentEvent == END_DOCUMENT) {
+            if (rootNode == node && visited) {
+                if (currentEvent == END_DOCUMENT) {
                     state = DOCUMENT_COMPLETE;
                 } else {
                     state = COMPLETED;
@@ -1061,7 +1076,7 @@
             return currentEvent == END_DOCUMENT ? new MapBasedNamespaceContext(Collections.EMPTY_MAP) : parser.getNamespaceContext();
         } else {
             return new MapBasedNamespaceContext(
-                    currentEvent == END_DOCUMENT ? Collections.EMPTY_MAP : getAllNamespaces(lastNode));
+                    currentEvent == END_DOCUMENT ? Collections.EMPTY_MAP : getAllNamespaces(node));
         }
     }
 
@@ -1075,8 +1090,8 @@
             return parser.getEncoding();
         } else {
             if (currentEvent == START_DOCUMENT) {
-                if (lastNode instanceof OMDocument) {
-                    return ((OMDocument)lastNode).getCharsetEncoding();
+                if (node instanceof OMDocument) {
+                    return ((OMDocument)node).getCharsetEncoding();
                 } else {
                     return null;
                 }
@@ -1123,8 +1138,8 @@
             return parser.getCharacterEncodingScheme();
         } else {
             if (currentEvent == START_DOCUMENT) {
-                if (lastNode instanceof OMDocument) {
-                    return ((OMDocument)lastNode).getXMLEncoding();
+                if (node instanceof OMDocument) {
+                    return ((OMDocument)node).getXMLEncoding();
                 } else {
                     return null;
                 }
@@ -1144,7 +1159,7 @@
             return parser.getPITarget();
         } else {
             if (currentEvent == PROCESSING_INSTRUCTION) {
-                return ((OMProcessingInstruction)lastNode).getTarget();
+                return ((OMProcessingInstruction)node).getTarget();
             } else {
                 throw new IllegalStateException();
             }
@@ -1161,7 +1176,7 @@
             return parser.getPIData();
         } else {
             if (currentEvent == PROCESSING_INSTRUCTION) {
-                return ((OMProcessingInstruction)lastNode).getValue();
+                return ((OMProcessingInstruction)node).getValue();
             } else {
                 throw new IllegalStateException();
             }
@@ -1184,8 +1199,8 @@
                 return false;
             }
         } else {
-            if (lastNode instanceof OMText) {
-                return ((OMText)lastNode).isBinary();
+            if (node instanceof OMText) {
+                return ((OMText)node).isBinary();
             } else {
                 return false;
             }
@@ -1200,8 +1215,8 @@
                 throw new IllegalStateException();
             }
         } else {
-            if (lastNode instanceof OMText) {
-                return ((OMText)lastNode).isOptimized();
+            if (node instanceof OMText) {
+                return ((OMText)node).isOptimized();
             } else {
                 throw new IllegalStateException();
             }
@@ -1216,7 +1231,7 @@
                 throw new IllegalStateException();
             }
         } else {
-            if (lastNode instanceof OMText) {
+            if (node instanceof OMText) {
                 // TODO: we should support deferred building of the DataHandler
                 return false;
             } else {
@@ -1233,8 +1248,8 @@
                 throw new IllegalStateException();
             }
         } else {
-            if (lastNode instanceof OMText) {
-                return ((OMText)lastNode).getContentID();
+            if (node instanceof OMText) {
+                return ((OMText)node).getContentID();
             } else {
                 throw new IllegalStateException();
             }
@@ -1249,8 +1264,8 @@
                 throw new IllegalStateException();
             }
         } else {
-            if (lastNode instanceof OMText) {
-                return (DataHandler)((OMText)lastNode).getDataHandler();
+            if (node instanceof OMText) {
+                return (DataHandler)((OMText)node).getDataHandler();
             } else {
                 throw new IllegalStateException();
             }
@@ -1284,34 +1299,15 @@
      * @return Returns int.
      */
     private int generateEvents(OMSerializable node) {
-        if (node == null) {
-            if (log.isDebugEnabled()) {
-                log.debug("Node is null...returning END_DOCUMENT");
-            }
-            return END_DOCUMENT;
-        }
-        if (node instanceof OMDocument) {
-            return generateContainerEvents((OMDocument)node, true);
-        } else {
-            int nodeType = ((OMNode)node).getType();
-            if (nodeType == OMNode.ELEMENT_NODE) {
-                return generateContainerEvents((OMElement)node, false);
+        if (node instanceof OMContainer) {
+            OMContainer container = (OMContainer)node;
+            if (visited) {
+                return container instanceof OMDocument ? END_DOCUMENT : END_ELEMENT;
             } else {
-                return nodeType;
+                return container instanceof OMDocument ? START_DOCUMENT : START_ELEMENT;
             }
-        }
-    }
-
-    private int generateContainerEvents(OMContainer container, boolean isDocument) {
-        if (nodeStack == null) {
-            nodeStack = new Stack();
-        }
-        if (!nodeStack.isEmpty() && nodeStack.peek().equals(container)) {
-            nodeStack.pop();
-            return isDocument ? END_DOCUMENT : END_ELEMENT;
         } else {
-            nodeStack.push(container);
-            return isDocument ? START_DOCUMENT : START_ELEMENT;
+            return ((OMNode)node).getType();
         }
     }
 
@@ -1373,7 +1369,7 @@
         if (builder != null && builder instanceof StAXBuilder) {
            return ((StAXBuilder) builder).isClosed();
         } else {
-            return _isClosed;
+            return isClosed;
         }
     }
     
@@ -1395,7 +1391,7 @@
             if (isClosed() && value) {
                 setParser(null);
             }
-            _releaseParserOnClose = value;
+            releaseParserOnClose = value;
         }
         
     }
@@ -1405,15 +1401,14 @@
      */
     public OMDataSource getDataSource() {
         if (getEventType() != XMLStreamReader.START_ELEMENT ||
-                !(state == NAVIGABLE || 
-                  state == SWITCH_AT_NEXT)) {
+                state != NAVIGABLE) {
             return null;
         }
         OMDataSource ds = null;
-        if (lastNode != null &&
-            lastNode instanceof OMSourcedElement) {
+        if (node != null &&
+            node instanceof OMSourcedElement) {
             try {
-                ds = ((OMSourcedElement) lastNode).getDataSource();
+                ds = ((OMSourcedElement) node).getDataSource();
             } catch (UnsupportedOperationException e) {
                 // Some implementations throw an UnsupportedOperationException.
                 ds =null;
@@ -1436,6 +1431,6 @@
      * @param value boolean
      */
     public void enableDataSourceEvents(boolean value) {
-        navigator.setDataSourceIsLeaf(value);
+        isDataSourceALeaf = value;
     }
 }
diff --git a/modules/axiom-dom/pom.xml b/modules/axiom-dom/pom.xml
index 4789059..69cc1d6 100644
--- a/modules/axiom-dom/pom.xml
+++ b/modules/axiom-dom/pom.xml
@@ -144,31 +144,6 @@
                                     <include>${project.groupId}:axiom-common-impl</include>
                                 </includes>
                             </artifactSet>
-                            <relocations>
-                                <!-- We try to preserve as much as possible the class names from previous releases in
-                                     order to support old code and code that is tightly coupled to the DOOM implementation
-                                     (such as the SAAJ implementation in Axis2). -->
-                                <relocation>
-                                    <pattern>org.apache.axiom.om.impl.common.OMNamespaceImpl</pattern>
-                                    <shadedPattern>org.apache.axiom.om.impl.dom.NamespaceImpl</shadedPattern>
-                                </relocation>
-                                <relocation>
-                                    <pattern>org.apache.axiom.om.impl.common.OMNavigator</pattern>
-                                    <shadedPattern>org.apache.axiom.om.impl.dom.DOMNavigator</shadedPattern>
-                                </relocation>
-                                <relocation>
-                                    <pattern>org.apache.axiom.om.impl.common.OMStAXWrapper</pattern>
-                                    <shadedPattern>org.apache.axiom.om.impl.dom.DOMStAXWrapper</shadedPattern>
-                                </relocation>
-                                <relocation>
-                                    <pattern>org.apache.axiom.om.impl.common</pattern>
-                                    <shadedPattern>org.apache.axiom.om.impl.dom</shadedPattern>
-                                </relocation>
-                                <relocation>
-                                    <pattern>org.apache.axiom.soap.impl.common</pattern>
-                                    <shadedPattern>org.apache.axiom.soap.impl.dom</shadedPattern>
-                                </relocation>
-                            </relocations>
                             <transformers>
                                 <transformer implementation="org.apache.axiom.buildutils.OSGiManifestResourceTransformer" />
                             </transformers>
@@ -183,27 +158,6 @@
                     </dependency>
                 </dependencies>
             </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>attach-original-jar</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>attach-artifact</goal>
-                        </goals>
-                        <configuration>
-                            <artifacts>
-                                <artifact>
-                                    <file>${project.build.directory}/original-${project.build.finalName}.jar</file>
-                                    <classifier>original</classifier>
-                                </artifact>
-                            </artifacts>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
             <!-- Attach a JAR with the test classes so that we can reuse them in other modules
                  (see http://maven.apache.org/guides/mini/guide-attached-tests.html). -->
             <plugin>
diff --git a/modules/axiom-dom/src/test/java/org/apache/axiom/om/impl/dom/CommonImplTest.java b/modules/axiom-dom/src/test/java/org/apache/axiom/om/impl/dom/CommonImplTest.java
deleted file mode 100644
index f4905d1..0000000
--- a/modules/axiom-dom/src/test/java/org/apache/axiom/om/impl/dom/CommonImplTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.dom;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.apache.axiom.om.impl.dom.factory.OMDOMMetaFactory;
-import org.apache.axiom.ts.CommonImplTestSuiteBuilder;
-
-public class CommonImplTest extends TestCase {
-    public static TestSuite suite() {
-        return new CommonImplTestSuiteBuilder(new OMDOMMetaFactory()).build();
-    }
-}
diff --git a/modules/axiom-impl/pom.xml b/modules/axiom-impl/pom.xml
index 9022063..867803e 100644
--- a/modules/axiom-impl/pom.xml
+++ b/modules/axiom-impl/pom.xml
@@ -142,16 +142,6 @@
                                     <include>${project.groupId}:axiom-common-impl</include>
                                 </includes>
                             </artifactSet>
-                            <relocations>
-                                <relocation>
-                                    <pattern>org.apache.axiom.om.impl.common</pattern>
-                                    <shadedPattern>org.apache.axiom.om.impl.llom</shadedPattern>
-                                </relocation>
-                                <relocation>
-                                    <pattern>org.apache.axiom.soap.impl.common</pattern>
-                                    <shadedPattern>org.apache.axiom.soap.impl.llom</shadedPattern>
-                                </relocation>
-                            </relocations>
                             <transformers>
                                 <transformer implementation="org.apache.axiom.buildutils.OSGiManifestResourceTransformer" />
                             </transformers>
@@ -166,27 +156,6 @@
                     </dependency>
                 </dependencies>
             </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>attach-original-jar</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>attach-artifact</goal>
-                        </goals>
-                        <configuration>
-                            <artifacts>
-                                <artifact>
-                                    <file>${project.build.directory}/original-${project.build.finalName}.jar</file>
-                                    <classifier>original</classifier>
-                                </artifact>
-                            </artifacts>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
             <!-- Attach a JAR with the test classes so that we can reuse them in other modules
                  (see http://maven.apache.org/guides/mini/guide-attached-tests.html). -->
             <plugin>
diff --git a/modules/axiom-impl/src/test/java/org/apache/axiom/om/impl/llom/CommonImplTest.java b/modules/axiom-impl/src/test/java/org/apache/axiom/om/impl/llom/CommonImplTest.java
deleted file mode 100644
index 0799773..0000000
--- a/modules/axiom-impl/src/test/java/org/apache/axiom/om/impl/llom/CommonImplTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.llom;
-
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory;
-import org.apache.axiom.ts.CommonImplTestSuiteBuilder;
-
-public class CommonImplTest extends TestCase {
-    public static TestSuite suite() {
-        return new CommonImplTestSuiteBuilder(new OMLinkedListMetaFactory()).build();
-    }
-}
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
index 1027f60..691aee9 100644
--- a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
+++ b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
@@ -292,6 +292,7 @@
             addTest(new org.apache.axiom.ts.om.element.TestGetXMLStreamReaderWithOMSourcedElementDescendant(metaFactory));
         }
         addTest(new org.apache.axiom.ts.om.element.TestGetXMLStreamReaderWithoutCachingPartiallyBuilt(metaFactory));
+        addTest(new org.apache.axiom.ts.om.element.TestGetXMLStreamReaderWithoutCachingPartiallyBuiltModified(metaFactory));
         addTest(new org.apache.axiom.ts.om.element.TestGetXMLStreamReaderWithPreserveNamespaceContext(metaFactory));
         addTest(new org.apache.axiom.ts.om.element.TestIsCompleteAfterAddingIncompleteChild(metaFactory));
         addTest(new org.apache.axiom.ts.om.element.TestMultipleDefaultNS(metaFactory));
diff --git a/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/TestGetXMLStreamReaderWithoutCachingPartiallyBuiltModified.java b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/TestGetXMLStreamReaderWithoutCachingPartiallyBuiltModified.java
new file mode 100644
index 0000000..4f53183
--- /dev/null
+++ b/modules/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/element/TestGetXMLStreamReaderWithoutCachingPartiallyBuiltModified.java
@@ -0,0 +1,65 @@
+/*
+ * 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.ts.om.element;
+
+import java.io.StringReader;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axiom.om.OMContainer;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMMetaFactory;
+import org.apache.axiom.om.OMXMLBuilderFactory;
+import org.apache.axiom.ts.AxiomTestCase;
+
+/**
+ * Tests the behavior of {@link OMContainer#getXMLStreamReaderWithoutCaching()} in the specific case
+ * where the element is partially built and the last created node has been modified. In Axiom 1.2.14
+ * the information returned for that node was incorrect because the builder switched too early to
+ * pull through mode.
+ */
+public class TestGetXMLStreamReaderWithoutCachingPartiallyBuiltModified extends AxiomTestCase {
+    public TestGetXMLStreamReaderWithoutCachingPartiallyBuiltModified(OMMetaFactory metaFactory) {
+        super(metaFactory);
+    }
+
+    protected void runTest() throws Throwable {
+        OMElement root = OMXMLBuilderFactory.createOMBuilder(metaFactory.getOMFactory(),
+                new StringReader("<root><a/><b/><c/></root>")).getDocumentElement();
+        
+        OMElement b = root.getFirstChildWithName(new QName("b"));
+        b.addAttribute("att", "value", null);
+        assertFalse(b.isComplete());
+        
+        XMLStreamReader reader = root.getXMLStreamReaderWithoutCaching();
+        
+        // Skip to the START_ELEMENT event corresponding to b
+        for (int i=0; i<4; i++) {
+            reader.next();
+        }
+        assertEquals(XMLStreamReader.START_ELEMENT, reader.getEventType());
+        assertEquals("b", reader.getLocalName());
+        
+        // The previously added attribute must be visible
+        assertEquals(1, reader.getAttributeCount());
+        assertEquals("att", reader.getAttributeLocalName(0));
+        assertEquals("value", reader.getAttributeValue(0));
+    }
+}
diff --git a/pom.xml b/pom.xml
index 98f2dcd..3a889f6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -736,7 +736,6 @@
         <module>modules/axiom-api</module>
         <module>modules/axiom-testsuite</module>
         <module>modules/axiom-common-impl</module>
-        <module>modules/axiom-common-impl-testsuite</module>
         <module>modules/axiom-impl</module>
         <module>modules/axiom-dom</module>
         <module>modules/axiom-compat</module>
