[maven-release-plugin] copy for tag 1.2.16
diff --git a/apidocs/pom.xml b/apidocs/pom.xml
index 7cccfc5..1eba8b7 100644
--- a/apidocs/pom.xml
+++ b/apidocs/pom.xml
@@ -108,12 +108,7 @@
                         <link>http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/api/</link>
                         <link>http://jaxen.codehaus.org/apidocs/</link>
                     </links>
-                    <breakiterator>true</breakiterator>
-                    <!-- The notimestamp, windowtitle and bottom parameters are chosen to minimize the number
-                         of changes between releases (to avoid mass changes when committing the site for a new release) -->
-                    <notimestamp>true</notimestamp>
                     <windowtitle>Apache Axiom</windowtitle>
-                    <bottom>Copyright © {organizationName}. All Rights Reserved.</bottom>
                     <!-- doctitle only appears in the summary and we should include the version there -->
                     <doctitle>Apache Axiom ${project.version}</doctitle>
                 </configuration>
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/AbstractNodeIterator.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/AbstractNodeIterator.java
index af38d5c..76fedac 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/AbstractNodeIterator.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/AbstractNodeIterator.java
@@ -26,7 +26,7 @@
     private final Axis axis;
     private final Class<T> type;
     private final ExceptionTranslator exceptionTranslator;
-    private final DetachPolicy detachPolicy;
+    private final Semantics semantics;
     private CoreNode currentNode;
     
     /**
@@ -38,12 +38,12 @@
     private boolean hasNext;
     private int depth;
     
-    public AbstractNodeIterator(CoreParentNode startNode, Axis axis, Class<T> type, ExceptionTranslator exceptionTranslator, DetachPolicy detachPolicy) {
+    public AbstractNodeIterator(CoreParentNode startNode, Axis axis, Class<T> type, ExceptionTranslator exceptionTranslator, Semantics semantics) {
         this.startNode = startNode;
         this.axis = axis;
         this.type = type;
         this.exceptionTranslator = exceptionTranslator;
-        this.detachPolicy = detachPolicy;
+        this.semantics = semantics;
     }
 
     protected abstract boolean matches(CoreNode node) throws CoreModelException;
@@ -130,7 +130,7 @@
         hasNext();
         if (currentNode instanceof CoreChildNode) {
 //            try {
-                ((CoreChildNode)currentNode).coreDetach(detachPolicy);
+                ((CoreChildNode)currentNode).coreDetach(semantics);
 //            } catch (CoreModelException ex) {
 //                throw exceptionTranslator.toUncheckedException(ex);
 //            }
@@ -141,6 +141,6 @@
     public final void replace(CoreChildNode newNode) throws CoreModelException {
         // Move to next node before replacing the current one
         hasNext();
-        ((CoreChildNode)currentNode).coreReplaceWith(newNode, detachPolicy);
+        ((CoreChildNode)currentNode).coreReplaceWith(newNode, semantics);
     }
 }
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/AttributeIterator.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/AttributeIterator.java
index 3a921fb..1499fd8 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/AttributeIterator.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/AttributeIterator.java
@@ -25,20 +25,20 @@
 final class AttributeIterator<T extends CoreAttribute,S> implements Iterator<S> {
     private final Class<T> type;
     private final Mapper<T,S> mapper;
-    private final DetachPolicy detachPolicy;
+    private final Semantics semantics;
     private CoreAttribute currentAttribute;
     private CoreAttribute nextAttribute;
     private boolean nextAttributeSet;
     
-    private AttributeIterator(CoreAttribute firstAttribute, Class<T> type, Mapper<T,S> mapper, DetachPolicy detachPolicy) {
+    private AttributeIterator(CoreAttribute firstAttribute, Class<T> type, Mapper<T,S> mapper, Semantics semantics) {
         this.type = type;
         this.mapper = mapper;
-        this.detachPolicy = detachPolicy;
+        this.semantics = semantics;
         nextAttribute = firstAttribute;
         nextAttributeSet = true;
     }
     
-    static <T extends CoreAttribute,S> Iterator<S> create(CoreElement element, Class<T> type, Mapper<T,S> mapper, DetachPolicy detachPolicy) {
+    static <T extends CoreAttribute,S> Iterator<S> create(CoreElement element, Class<T> type, Mapper<T,S> mapper, Semantics semantics) {
         CoreAttribute attribute = element.coreGetFirstAttribute();
         while (attribute != null && !type.isInstance(attribute)) {
             attribute = attribute.coreGetNextAttribute();
@@ -46,7 +46,7 @@
         if (attribute == null) {
             return Collections.<S>emptyList().iterator();
         } else {
-            return new AttributeIterator<T,S>(attribute, type, mapper, detachPolicy);
+            return new AttributeIterator<T,S>(attribute, type, mapper, semantics);
         }
     }
     
@@ -80,7 +80,7 @@
         } else {
             // Ensure that the next attribute is known before we remove the current one.
             hasNext();
-            currentAttribute.coreRemove(detachPolicy);
+            currentAttribute.coreRemove(semantics);
             currentAttribute = null;
         }
     }
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/AttributeMatcher.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/AttributeMatcher.java
index 954ecae..d67f2cf 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/AttributeMatcher.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/AttributeMatcher.java
@@ -29,7 +29,7 @@
      * {@link CoreElement#coreSetAttribute(AttributeMatcher, String, String, String, String)}, or
      * they are determined by the return values of {@link #getNamespaceURI(CoreAttribute)} and
      * {@link #getName(CoreAttribute)} if
-     * {@link CoreElement#coreSetAttribute(AttributeMatcher, CoreAttribute, DetachPolicy)}
+     * {@link CoreElement#coreSetAttribute(AttributeMatcher, CoreAttribute, Semantics)}
      * is used. It is
      * not required that these parameters strictly represent the namespace URI and local name of the
      * attribute. Their exact meaning is defined by the particular {@link AttributeMatcher}
@@ -47,7 +47,7 @@
 
     /**
      * Get the <tt>namespaceURI</tt> parameter for an existing attribute. This method is used by
-     * {@link CoreElement#coreSetAttribute(AttributeMatcher, CoreAttribute, DetachPolicy)}
+     * {@link CoreElement#coreSetAttribute(AttributeMatcher, CoreAttribute, Semantics)}
      * which passes its return value as parameter to {@link #matches(CoreAttribute, String, String)}.
      * 
      * @param attr the attribute
@@ -57,7 +57,7 @@
     
     /**
      * Get the <tt>name</tt> parameter for an existing attribute. This method is used by
-     * {@link CoreElement#coreSetAttribute(AttributeMatcher, CoreAttribute, DetachPolicy)}
+     * {@link CoreElement#coreSetAttribute(AttributeMatcher, CoreAttribute, Semantics)}
      * which passes its return value as parameter to {@link #matches(CoreAttribute, String, String)}.
      * 
      * @param attr the attribute
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreAttribute.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreAttribute.java
index 546a0e2..6f25206 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreAttribute.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreAttribute.java
@@ -36,13 +36,13 @@
     /**
      * Remove this attribute from its owner element.
      * 
-     * @param detachPolicy
-     *            the detach policy that determines the new owner document for the attribute
+     * @param semantics
+     *            the API semantics to use; determines the new owner document for the attribute
      * @return <code>true</code> if the attribute had an owner element and has been removed from
      *         that element; <code>false</code> if the attribute didn't have an owner element and no
      *         changes have been made
      */
-    boolean coreRemove(DetachPolicy detachPolicy);
+    boolean coreRemove(Semantics semantics);
     
     /**
      * Get the attribute immediately following the current attribute.
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreAttributeSupport.aj b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreAttributeSupport.aj
index c465215..722db90 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreAttributeSupport.aj
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreAttributeSupport.aj
@@ -96,11 +96,15 @@
         nextAttribute = attr;
     }
 
-    public final boolean CoreAttribute.coreRemove(DetachPolicy detachPolicy) {
+    public final boolean CoreAttribute.coreRemove(Semantics semantics) {
+        return internalRemove(semantics, null);
+    }
+    
+    public final boolean CoreAttribute.internalRemove(Semantics semantics, CoreElement newOwner) {
         if (owner instanceof CoreElement) {
             CoreElement ownerElement = (CoreElement)owner;
             CoreAttribute previousAttr = coreGetPreviousAttribute();
-            owner = detachPolicy.getNewOwnerDocument(ownerElement);
+            owner = newOwner != null ? newOwner : semantics.getDetachPolicy().getNewOwnerDocument(ownerElement);
             if (previousAttr == null) {
                 ownerElement.internalSetFirstAttribute(nextAttribute);
             } else {
@@ -109,6 +113,9 @@
             nextAttribute = null;
             return true;
         } else {
+            if (newOwner != null) {
+                owner = newOwner;
+            }
             return false;
         }
     }
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataNodeSupport.aj b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataNodeSupport.aj
index bbb2604..e8605be 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataNodeSupport.aj
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataNodeSupport.aj
@@ -44,7 +44,7 @@
         this.data = data;
     }
     
-    public final void CoreCharacterDataNode.coreSetCharacterData(Object data, DetachPolicy detachPolicy) {
+    public final void CoreCharacterDataNode.coreSetCharacterData(Object data, Semantics semantics) {
         this.data = data;
     }
     
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataSinkNode.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataSinkNode.java
index bbdd57f..76d40b7 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataSinkNode.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreCharacterDataSinkNode.java
@@ -19,5 +19,5 @@
 package org.apache.axiom.core;
 
 public interface CoreCharacterDataSinkNode {
-    void coreSetCharacterData(Object data, DetachPolicy detachPolicy);
+    void coreSetCharacterData(Object data, Semantics semantics);
 }
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNode.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNode.java
index 02ecc5b..2065319 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNode.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNode.java
@@ -39,7 +39,7 @@
      */
     CoreChildNode coreGetNextSiblingIfAvailable();
 
-    void coreDetach(DetachPolicy detachPolicy);
+    void coreDetach(Semantics semantics);
 
     /**
      * Clone this node according to the provided policy.
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNodeSupport.aj b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNodeSupport.aj
index bb8cc6d..0ec6e24 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNodeSupport.aj
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreChildNodeSupport.aj
@@ -195,11 +195,11 @@
     
     void CoreChildNode.beforeDetach() {}
     
-    public final void CoreChildNode.coreDetach(DetachPolicy detachPolicy) {
-        internalDetach(detachPolicy, null);
+    public final void CoreChildNode.coreDetach(Semantics semantics) {
+        internalDetach(semantics, null);
     }
     
-    final void CoreChildNode.internalDetach(DetachPolicy detachPolicy, CoreParentNode newParent) {
+    final void CoreChildNode.internalDetach(Semantics semantics, CoreParentNode newParent) {
         CoreParentNode parent = coreGetParent();
         if (parent != null) {
             beforeDetach();
@@ -216,7 +216,7 @@
             nextSibling = null;
             previousSibling = null;
             if (newParent == null) {
-                internalUnsetParent(detachPolicy.getNewOwnerDocument(parent));
+                internalUnsetParent(semantics.getDetachPolicy().getNewOwnerDocument(parent));
             }
         }
         if (newParent != null) {
@@ -224,10 +224,10 @@
         }
     }
 
-    public final void CoreChildNode.coreReplaceWith(CoreChildNode newNode, DetachPolicy detachPolicy) {
-        newNode.coreDetach(DetachPolicy.NEW_DOCUMENT);
+    public final void CoreChildNode.coreReplaceWith(CoreChildNode newNode, Semantics semantics) {
         CoreParentNode parent = coreGetParent();
         if (parent != null) {
+            newNode.internalDetach(null, parent);
             beforeDetach();
             if (previousSibling == null) {
                 parent.getContent(true).firstChild = newNode;
@@ -243,8 +243,7 @@
                 newNode.nextSibling = nextSibling;
                 nextSibling = null;
             }
-            internalUnsetParent(detachPolicy.getNewOwnerDocument(parent));
-            newNode.internalSetParent(parent);
+            internalUnsetParent(semantics.getDetachPolicy().getNewOwnerDocument(parent));
         }
     }
 
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElement.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElement.java
index a9581b7..a5dd131 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElement.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElement.java
@@ -86,12 +86,12 @@
      *            the {@link AttributeMatcher} implementation to use
      * @param attr
      *            the new attribute to add
-     * @param detachPolicy
+     * @param semantics
      *            determines the new owner document for the replaced attribute
      * @return the attribute that was replaced by the new attribute, or <code>null</code> if no
      *         matching attribute existed.
      */
-    CoreAttribute coreSetAttribute(AttributeMatcher matcher, CoreAttribute attr, DetachPolicy detachPolicy);
+    CoreAttribute coreSetAttribute(AttributeMatcher matcher, CoreAttribute attr, Semantics semantics);
 
     /**
      * Append an attribute to this element. The attribute is simply added at the end of the list of
@@ -117,9 +117,9 @@
      * @return <code>true</code> if a matching attribute was found (and has been removed),
      *         <code>false</code> if no matching attribute was found
      */
-    boolean coreRemoveAttribute(AttributeMatcher matcher, String namespaceURI, String name, DetachPolicy detachPolicy);
+    boolean coreRemoveAttribute(AttributeMatcher matcher, String namespaceURI, String name, Semantics semantics);
     
-    <T extends CoreAttribute,S> Iterator<S> coreGetAttributesByType(Class<T> type, Mapper<T,S> mapper, DetachPolicy detachPolicy);
+    <T extends CoreAttribute,S> Iterator<S> coreGetAttributesByType(Class<T> type, Mapper<T,S> mapper, Semantics semantics);
     
     /**
      * Look up the namespace URI associated to the given prefix.
@@ -127,17 +127,14 @@
      * @param prefix
      *            The prefix to look for. If this parameter is the empty string, then the URI of the
      *            default namespace will be returned.
-     * @param strict
-     *            If this parameter is set to <code>true</code>, only namespace declarations will be
-     *            taken into account. If set to <code>false</code> the prefixes of the element and
-     *            its ancestors are also taken into account (limited to instanced of
-     *            {@link CoreNSAwareElement}), even if no explicit namespace declarations exists for
-     *            these prefixes.
+     * @param semantics
+     *            The API semantics to use.
      * @return the namespace URI or <code>null</code> if the prefix is not bound; if the prefix is
      *         the empty string and no default namespace declaration exists, then an empty string is
      *         returned
+     * @see Semantics#isUseStrictNamespaceLookup()
      */
-    String coreLookupNamespaceURI(String prefix, boolean strict);
+    String coreLookupNamespaceURI(String prefix, Semantics semantics);
     
     /**
      * Find a prefix associated to the given namespace URI. Default namespaces are not taken into
@@ -146,17 +143,14 @@
      * @param namespaceURI
      *            The namespace URI to look for. This parameter must not be <code>null</code> (XML
      *            forbids to bind a prefix to the null namespace).
-     * @param strict
-     *            If this parameter is set to <code>true</code>, only namespace declarations will be
-     *            taken into account. If set to <code>false</code> the prefixes of the element and
-     *            its ancestors are also taken into account (limited to instanced of
-     *            {@link CoreNSAwareElement}), even if no explicit namespace declarations exists for
-     *            these prefixes.
+     * @param semantics
+     *            The API semantics to use.
      * @return a prefix bound to the given namespace URI or <code>null</code> if none is found
      * @throws IllegalArgumentException
      *             if <code>namespaceURI</code> is <code>null</code>
+     * @see Semantics#isUseStrictNamespaceLookup()
      */
     // TODO: wrong Javadoc: null vs. empty string
     // TODO: we can support default namespaces!
-    String coreLookupPrefix(String namespaceURI, boolean strict);
+    String coreLookupPrefix(String namespaceURI, Semantics semantics);
 }
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj
index f335abf..2a271d2 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreElementSupport.aj
@@ -57,18 +57,13 @@
     }
 
     public final void CoreElement.coreAppendAttribute(CoreAttribute attr) {
-        attr.coreRemove(DetachPolicy.NEW_DOCUMENT);
-        internalAppendAttribute(attr);
-    }
-
-    private void CoreElement.internalAppendAttribute(CoreAttribute attr) {
         // TODO: we should probably check if the attribute is already owned by the element
-        attr.internalSetOwnerElement(this);
+        attr.internalRemove(null, this);
         CoreAttribute lastAttribute = coreGetLastAttribute();
         if (lastAttribute == null) {
             firstAttribute = attr;
         } else {
-            lastAttribute.insertAttributeAfter(attr);
+            lastAttribute.internalSetNextAttribute(attr);
         }
     }
 
@@ -82,7 +77,7 @@
         if (attr == null) {
             CoreAttribute newAttr = matcher.createAttribute(this, namespaceURI, name, prefix, value);
             if (previousAttr == null) {
-                internalAppendAttribute(newAttr);
+                coreAppendAttribute(newAttr);
             } else {
                 previousAttr.insertAttributeAfter(newAttr);
             }
@@ -91,12 +86,12 @@
         }
     }
     
-    public final CoreAttribute CoreElement.coreSetAttribute(AttributeMatcher matcher, CoreAttribute attr, DetachPolicy detachPolicy) {
+    public final CoreAttribute CoreElement.coreSetAttribute(AttributeMatcher matcher, CoreAttribute attr, Semantics semantics) {
         if (attr.coreGetOwnerElement() == this) {
             // TODO: document this and add assertion
             return attr;
         }
-        attr.coreRemove(DetachPolicy.NEW_DOCUMENT);
+        attr.internalRemove(null, this);
         String namespaceURI = matcher.getNamespaceURI(attr);
         String name = matcher.getName(attr); 
         CoreAttribute existingAttr = coreGetFirstAttribute();
@@ -105,7 +100,6 @@
             previousAttr = existingAttr;
             existingAttr = existingAttr.coreGetNextAttribute();
         }
-        attr.internalSetOwnerElement(this);
         if (existingAttr == null) {
             if (previousAttr == null) {
                 firstAttribute = attr;
@@ -118,31 +112,31 @@
             } else {
                 previousAttr.internalSetNextAttribute(attr);
             }
-            existingAttr.internalUnsetOwnerElement(detachPolicy.getNewOwnerDocument(this));
+            existingAttr.internalUnsetOwnerElement(semantics.getDetachPolicy().getNewOwnerDocument(this));
             attr.internalSetNextAttribute(existingAttr.coreGetNextAttribute());
             existingAttr.internalSetNextAttribute(null);
         }
         return existingAttr;
     }
 
-    public final boolean CoreElement.coreRemoveAttribute(AttributeMatcher matcher, String namespaceURI, String name, DetachPolicy detachPolicy) {
+    public final boolean CoreElement.coreRemoveAttribute(AttributeMatcher matcher, String namespaceURI, String name, Semantics semantics) {
         CoreAttribute att = coreGetAttribute(matcher, namespaceURI, name);
         if (att != null) {
-            att.coreRemove(detachPolicy);
+            att.coreRemove(semantics);
             return true;
         } else {
             return false;
         }
     }
 
-    public final <T extends CoreAttribute,S> Iterator<S> CoreElement.coreGetAttributesByType(Class<T> type, Mapper<T,S> mapper, DetachPolicy detachPolicy) {
-        return AttributeIterator.create(this, type, mapper, detachPolicy);
+    public final <T extends CoreAttribute,S> Iterator<S> CoreElement.coreGetAttributesByType(Class<T> type, Mapper<T,S> mapper, Semantics semantics) {
+        return AttributeIterator.create(this, type, mapper, semantics);
     }
 
     public abstract String CoreElement.getImplicitNamespaceURI(String prefix);
     
-    public final String CoreElement.coreLookupNamespaceURI(String prefix, boolean strict) {
-        if (!strict) {
+    public final String CoreElement.coreLookupNamespaceURI(String prefix, Semantics semantics) {
+        if (!semantics.isUseStrictNamespaceLookup()) {
             String namespaceURI = getImplicitNamespaceURI(prefix);
             if (namespaceURI != null) {
                 return namespaceURI;
@@ -158,7 +152,7 @@
         }
         CoreElement parentElement = coreGetParentElement();
         if (parentElement != null) {
-            return parentElement.coreLookupNamespaceURI(prefix, strict);
+            return parentElement.coreLookupNamespaceURI(prefix, semantics);
         } else if (prefix.length() == 0) {
             return "";
         } else {
@@ -168,11 +162,11 @@
 
     public abstract String CoreElement.getImplicitPrefix(String namespaceURI);
     
-    public final String CoreElement.coreLookupPrefix(String namespaceURI, boolean strict) {
+    public final String CoreElement.coreLookupPrefix(String namespaceURI, Semantics semantics) {
         if (namespaceURI == null) {
             throw new IllegalArgumentException("namespaceURI must not be null");
         }
-        if (!strict) {
+        if (!semantics.isUseStrictNamespaceLookup()) {
             String prefix = getImplicitPrefix(namespaceURI);
             if (prefix != null) {
                 return prefix;
@@ -188,10 +182,10 @@
         }
         CoreElement parentElement = coreGetParentElement();
         if (parentElement != null) {
-            String prefix = parentElement.coreLookupPrefix(namespaceURI, strict);
+            String prefix = parentElement.coreLookupPrefix(namespaceURI, semantics);
             // The prefix declared on one of the ancestors may be masked by another
             // namespace declaration on this element (or one of its descendants).
-            if (!strict && getImplicitNamespaceURI(prefix) != null) {
+            if (!semantics.isUseStrictNamespaceLookup() && getImplicitNamespaceURI(prefix) != null) {
                 return null;
             }
             for (CoreAttribute attr = coreGetFirstAttribute(); attr != null; attr = attr.coreGetNextAttribute()) {
@@ -215,7 +209,7 @@
         if (isExpanded()) {
             CoreAttribute attr = o.coreGetFirstAttribute();
             while (attr != null) {
-                internalAppendAttribute((CoreAttribute)attr.coreClone(policy, options));
+                coreAppendAttribute((CoreAttribute)attr.coreClone(policy, options));
                 // TODO: needed?
 //                clonedAttr.coreSetSpecified(attr.coreGetSpecified());
                 attr = attr.coreGetNextAttribute();
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNode.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNode.java
index c5dba8a..22e6d7f 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNode.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNode.java
@@ -35,5 +35,5 @@
     void coreSetState(int state);
     void build();
 
-    <T extends CoreElement> NodeIterator<T> coreGetElements(Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, ExceptionTranslator exceptionTranslator, DetachPolicy detachPolicy);
+    <T extends CoreElement> NodeIterator<T> coreGetElements(Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, ExceptionTranslator exceptionTranslator, Semantics semantics);
 }
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNodeSupport.aj b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNodeSupport.aj
index c2a746e..efefad7 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNodeSupport.aj
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/CoreParentNodeSupport.aj
@@ -186,7 +186,7 @@
         fragmentContent.lastChild = null;
     }
 
-    public final void CoreParentNode.coreRemoveChildren(DetachPolicy detachPolicy) {
+    public final void CoreParentNode.coreRemoveChildren(Semantics semantics) {
         if (getState() == COMPACT) {
             coreSetState(COMPLETE);
             content = null;
@@ -205,7 +205,7 @@
                 updateState = false;
             }
             if (child != null) {
-                CoreDocument newOwnerDocument = detachPolicy.getNewOwnerDocument(this);
+                CoreDocument newOwnerDocument = semantics.getDetachPolicy().getNewOwnerDocument(this);
                 do {
                     CoreChildNode nextSibling = child.nextSibling;
                     child.previousSibling = null;
@@ -288,16 +288,16 @@
         }
     }
     
-    public final void CoreParentNode.coreSetCharacterData(Object data, DetachPolicy detachPolicy) {
-        coreRemoveChildren(detachPolicy);
+    public final void CoreParentNode.coreSetCharacterData(Object data, Semantics semantics) {
+        coreRemoveChildren(semantics);
         if (data != null && (data instanceof CharacterData || ((String)data).length() > 0)) {
             coreSetState(COMPACT);
             content = data;
         }
     }
     
-    public final <T> NodeIterator<T> CoreParentNode.coreGetNodes(Axis axis, Class<T> type, ExceptionTranslator exceptionTranslator, DetachPolicy detachPolicy) {
-        return new AbstractNodeIterator<T>(this, axis, type, exceptionTranslator, detachPolicy) {
+    public final <T> NodeIterator<T> CoreParentNode.coreGetNodes(Axis axis, Class<T> type, ExceptionTranslator exceptionTranslator, Semantics semantics) {
+        return new AbstractNodeIterator<T>(this, axis, type, exceptionTranslator, semantics) {
             @Override
             protected boolean matches(CoreNode node) throws CoreModelException {
                 return true;
@@ -305,8 +305,8 @@
         };
     }
     
-    public final <T extends CoreElement> NodeIterator<T> CoreParentNode.coreGetElements(Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, ExceptionTranslator exceptionTranslator, DetachPolicy detachPolicy) {
-        return new ElementsIterator<T>(this, axis, type, matcher, namespaceURI, name, exceptionTranslator, detachPolicy);
+    public final <T extends CoreElement> NodeIterator<T> CoreParentNode.coreGetElements(Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, ExceptionTranslator exceptionTranslator, Semantics semantics) {
+        return new ElementsIterator<T>(this, axis, type, matcher, namespaceURI, name, exceptionTranslator, semantics);
     }
 
     public final <T> void CoreParentNode.cloneChildrenIfNecessary(ClonePolicy<T> policy, T options, CoreNode clone) {
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementMatcher.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementMatcher.java
index 40eb673..577a2fd 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementMatcher.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementMatcher.java
@@ -101,7 +101,7 @@
     /**
      * Check if the given element matches. The values of the <code>namespaceURI</code> and
      * <code>name</code> parameters are those passed to
-     * {@link CoreParentNode#coreGetElements(Axis, Class, ElementMatcher, String, String, ExceptionTranslator, DetachPolicy)}.
+     * {@link CoreParentNode#coreGetElements(Axis, Class, ElementMatcher, String, String, ExceptionTranslator, Semantics)}.
      * 
      * @param element
      *            the element to check
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementsIterator.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementsIterator.java
index dac3a54..c6826bd 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementsIterator.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/ElementsIterator.java
@@ -24,8 +24,8 @@
     private final String namespaceURI;
     private final String name;
 
-    public ElementsIterator(CoreParentNode startNode, Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, ExceptionTranslator exceptionTranslator, DetachPolicy detachPolicy) {
-        super(startNode, axis, type, exceptionTranslator, detachPolicy);
+    public ElementsIterator(CoreParentNode startNode, Axis axis, Class<T> type, ElementMatcher<? super T> matcher, String namespaceURI, String name, ExceptionTranslator exceptionTranslator, Semantics semantics) {
+        super(startNode, axis, type, exceptionTranslator, semantics);
         this.type = type;
         this.matcher = matcher;
         this.namespaceURI = namespaceURI;
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/NSAwareAttributeMatcher.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/NSAwareAttributeMatcher.java
index 7dd0292..3abb932 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/NSAwareAttributeMatcher.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/NSAwareAttributeMatcher.java
@@ -36,15 +36,15 @@
  * {@link NamespaceDeclarationMatcher} can be used).
  */
 public final class NSAwareAttributeMatcher implements AttributeMatcher {
-    private final DetachPolicy detachPolicy;
+    private final Semantics semantics;
     private final boolean matchNSUnawareAttributes;
     private final boolean updatePrefix;
     
     /**
      * Constructor.
      * 
-     * @param detachPolicy
-     *            Specifies the {@link DetachPolicy} to be used by
+     * @param semantics
+     *            Specifies the {@link Semantics} to be used by
      *            {@link #update(CoreAttribute, String, String)}.
      * @param matchNSUnawareAttributes
      *            Specifies if {@link CoreNSUnawareAttribute} instances can also be matched. Only
@@ -55,9 +55,9 @@
      *            <code>prefix</code> is only used when creating new attributes and prefixes of
      *            existing attributes are preserved (i.e. only their value is updated).
      */
-    public NSAwareAttributeMatcher(DetachPolicy detachPolicy, boolean matchNSUnawareAttributes,
+    public NSAwareAttributeMatcher(Semantics semantics, boolean matchNSUnawareAttributes,
             boolean updatePrefix) {
-        this.detachPolicy = detachPolicy;
+        this.semantics = semantics;
         this.matchNSUnawareAttributes = matchNSUnawareAttributes;
         this.updatePrefix = updatePrefix;
     }
@@ -92,7 +92,7 @@
     }
 
     public void update(CoreAttribute attr, String prefix, String value) {
-        attr.coreSetCharacterData(value, detachPolicy);
+        attr.coreSetCharacterData(value, semantics);
         if (updatePrefix && attr instanceof CoreNSAwareAttribute) {
             ((CoreNSAwareAttribute)attr).coreSetPrefix(prefix);
         }
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/NamespaceDeclarationMatcher.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/NamespaceDeclarationMatcher.java
index d87b5cd..749c818 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/NamespaceDeclarationMatcher.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/NamespaceDeclarationMatcher.java
@@ -34,10 +34,10 @@
  * </dl>
  */
 public final class NamespaceDeclarationMatcher implements AttributeMatcher {
-    private final DetachPolicy detachPolicy;
+    private final Semantics semantics;
     
-    public NamespaceDeclarationMatcher(DetachPolicy detachPolicy) {
-        this.detachPolicy = detachPolicy;
+    public NamespaceDeclarationMatcher(Semantics semantics) {
+        this.semantics = semantics;
     }
 
     public boolean matches(CoreAttribute attr, String namespaceURI, String name) {
@@ -64,6 +64,6 @@
     }
 
     public void update(CoreAttribute attr, String prefix, String value) {
-        attr.coreSetCharacterData(value, detachPolicy);
+        attr.coreSetCharacterData(value, semantics);
     }
 }
\ No newline at end of file
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/NodeIterator.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/NodeIterator.java
index 6cbb0de..9198784 100644
--- a/aspects/core-aspects/src/main/java/org/apache/axiom/core/NodeIterator.java
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/NodeIterator.java
@@ -32,7 +32,7 @@
  * allowed to throw {@link UnsupportedOperationException}.
  * <li>A {@link ConcurrentModificationException} MUST be thrown when the iterator is used after the
  * last node returned by {@link Iterator#next()} has been removed using a method other than
- * {@link Iterator#remove()} (e.g. {@link CoreChildNode#coreDetach(DetachPolicy)}).
+ * {@link Iterator#remove()} (e.g. {@link CoreChildNode#coreDetach(Semantics)}).
  * <li>If a {@link CoreModelException} occurs inside {@link Iterator#hasNext()},
  * {@link Iterator#next()} or {@link Iterator#remove()}, then the implementation MUST use the
  * supplied {@link ExceptionTranslator} to translate that checked exception into an unchecked
diff --git a/aspects/core-aspects/src/main/java/org/apache/axiom/core/Semantics.java b/aspects/core-aspects/src/main/java/org/apache/axiom/core/Semantics.java
new file mode 100644
index 0000000..3e2cb90
--- /dev/null
+++ b/aspects/core-aspects/src/main/java/org/apache/axiom/core/Semantics.java
@@ -0,0 +1,36 @@
+/*
+ * 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.core;
+
+/**
+ * Defines the semantics of a particular API.
+ */
+public interface Semantics {
+    DetachPolicy getDetachPolicy();
+    
+    /**
+     * Determine how namespace lookups are performed.
+     * 
+     * @return {@code true} if only namespace declarations are taken into account. {@code false} if
+     *         the prefixes of the element and its ancestors are also taken into account (limited to
+     *         instanced of {@link CoreNSAwareElement}), even if no explicit namespace declarations
+     *         exists for these prefixes.
+     */
+    boolean isUseStrictNamespaceLookup();
+}
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMAttributeSupport.aj b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMAttributeSupport.aj
index 80736b3..bab37c6 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMAttributeSupport.aj
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMAttributeSupport.aj
@@ -66,7 +66,7 @@
     }
     
     public final void DOMAttribute.setValue(String value) {
-        coreSetCharacterData(value, Policies.DETACH_POLICY);
+        coreSetCharacterData(value, DOMSemantics.INSTANCE);
     }
     
     public final CoreElement DOMAttribute.getNamespaceContext() {
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMCDATASectionSupport.aj b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMCDATASectionSupport.aj
index 69a98bc..f6997db 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMCDATASectionSupport.aj
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMCDATASectionSupport.aj
@@ -30,6 +30,6 @@
     }
 
     public final void DOMCDATASection.setData(String data) {
-        coreSetCharacterData(data, Policies.DETACH_POLICY);
+        coreSetCharacterData(data, DOMSemantics.INSTANCE);
     }
 }
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMCommentSupport.aj b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMCommentSupport.aj
index 5aabc7e..4299b3b 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMCommentSupport.aj
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMCommentSupport.aj
@@ -34,6 +34,6 @@
     }
 
     public final void DOMComment.setData(String data) {
-        coreSetCharacterData(data, Policies.DETACH_POLICY);
+        coreSetCharacterData(data, DOMSemantics.INSTANCE);
     }
 }
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMDocumentFragmentSupport.aj b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMDocumentFragmentSupport.aj
index 4f65eb1..549222f 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMDocumentFragmentSupport.aj
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMDocumentFragmentSupport.aj
@@ -80,6 +80,6 @@
     }
 
     public final void DOMDocumentFragment.setTextContent(String textContent) {
-        coreSetCharacterData(textContent, Policies.DETACH_POLICY);
+        coreSetCharacterData(textContent, DOMSemantics.INSTANCE);
     }
 }
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMDocumentSupport.aj b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMDocumentSupport.aj
index 3da3976..bbcab4c 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMDocumentSupport.aj
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMDocumentSupport.aj
@@ -146,7 +146,7 @@
     public final CDATASection DOMDocument.createCDATASection(String data) {
         DOMCDATASection cdataSection = coreGetNodeFactory().createNode(DOMCDATASection.class);
         cdataSection.coreSetOwnerDocument(this);
-        cdataSection.coreSetCharacterData(data, Policies.DETACH_POLICY);
+        cdataSection.coreSetCharacterData(data, DOMSemantics.INSTANCE);
         return cdataSection;
     }
     
@@ -216,7 +216,7 @@
         DOMProcessingInstruction pi = coreGetNodeFactory().createNode(DOMProcessingInstruction.class);
         pi.coreSetOwnerDocument(this);
         pi.coreSetTarget(target);
-        pi.coreSetCharacterData(data, Policies.DETACH_POLICY);
+        pi.coreSetCharacterData(data, DOMSemantics.INSTANCE);
         return pi;
     }
 
@@ -230,7 +230,7 @@
     public final Comment DOMDocument.createComment(String data) {
         DOMComment node = coreGetNodeFactory().createNode(DOMComment.class);
         node.coreSetOwnerDocument(this);
-        node.coreSetCharacterData(data, Policies.DETACH_POLICY);
+        node.coreSetCharacterData(data, DOMSemantics.INSTANCE);
         return node;
     }
 
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMElementSupport.aj b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMElementSupport.aj
index 06e0c23..c6ee235 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMElementSupport.aj
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMElementSupport.aj
@@ -76,14 +76,14 @@
     }
     
     public final Attr DOMElement.getAttributeNode(String name) {
-        return (DOMAttribute)coreGetAttribute(Policies.DOM1_ATTRIBUTE_MATCHER, null, name);
+        return (DOMAttribute)coreGetAttribute(DOMSemantics.DOM1_ATTRIBUTE_MATCHER, null, name);
     }
 
     public final Attr DOMElement.getAttributeNodeNS(String namespaceURI, String localName) {
         if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI)) {
-            return (DOMAttribute)coreGetAttribute(Policies.NAMESPACE_DECLARATION_MATCHER, null, localName.equals(XMLConstants.XMLNS_ATTRIBUTE) ? "" : localName);
+            return (DOMAttribute)coreGetAttribute(DOMSemantics.NAMESPACE_DECLARATION_MATCHER, null, localName.equals(XMLConstants.XMLNS_ATTRIBUTE) ? "" : localName);
         } else {
-            return (DOMAttribute)coreGetAttribute(Policies.DOM2_ATTRIBUTE_MATCHER, namespaceURI == null ? "" : namespaceURI, localName);
+            return (DOMAttribute)coreGetAttribute(DOMSemantics.DOM2_ATTRIBUTE_MATCHER, namespaceURI == null ? "" : namespaceURI, localName);
         }
     }
     
@@ -107,7 +107,7 @@
 
     public final void DOMElement.setAttribute(String name, String value) {
         NSUtil.validateName(name);
-        coreSetAttribute(Policies.DOM1_ATTRIBUTE_MATCHER, null, name, null, value);
+        coreSetAttribute(DOMSemantics.DOM1_ATTRIBUTE_MATCHER, null, name, null, value);
     }
 
     public final void DOMElement.setAttributeNS(String namespaceURI, String qualifiedName, String value) throws DOMException {
@@ -122,11 +122,11 @@
             localName = qualifiedName.substring(i+1);
         }
         if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI)) {
-            coreSetAttribute(Policies.NAMESPACE_DECLARATION_MATCHER, null, NSUtil.getDeclaredPrefix(localName, prefix), null, value);
+            coreSetAttribute(DOMSemantics.NAMESPACE_DECLARATION_MATCHER, null, NSUtil.getDeclaredPrefix(localName, prefix), null, value);
         } else {
             namespaceURI = NSUtil.normalizeNamespaceURI(namespaceURI);
             NSUtil.validateAttributeName(namespaceURI, localName, prefix);
-            coreSetAttribute(Policies.DOM2_ATTRIBUTE_MATCHER, namespaceURI, localName, prefix, value);
+            coreSetAttribute(DOMSemantics.DOM2_ATTRIBUTE_MATCHER, namespaceURI, localName, prefix, value);
         }
     }
 
@@ -152,14 +152,14 @@
             }
             AttributeMatcher matcher;
             if (newAttr instanceof CoreNSAwareAttribute) {
-                matcher = Policies.DOM2_ATTRIBUTE_MATCHER;
+                matcher = DOMSemantics.DOM2_ATTRIBUTE_MATCHER;
             } else if (newAttr instanceof CoreNamespaceDeclaration) {
-                matcher = Policies.NAMESPACE_DECLARATION_MATCHER;
+                matcher = DOMSemantics.NAMESPACE_DECLARATION_MATCHER;
             } else {
                 // Must be a DOM1 (namespace unaware) attribute
-                matcher = Policies.DOM1_ATTRIBUTE_MATCHER;
+                matcher = DOMSemantics.DOM1_ATTRIBUTE_MATCHER;
             }
-            return (DOMAttribute)coreSetAttribute(matcher, newAttr, Policies.DETACH_POLICY);
+            return (DOMAttribute)coreSetAttribute(matcher, newAttr, DOMSemantics.INSTANCE);
         }
     }
 
@@ -169,7 +169,7 @@
             if (attr.coreGetOwnerElement() != this) {
                 throw DOMExceptionTranslator.newDOMException(DOMException.NOT_FOUND_ERR);
             } else {
-                attr.coreRemove(Policies.DETACH_POLICY);
+                attr.coreRemove(DOMSemantics.INSTANCE);
             }
             return attr;
         } else {
@@ -179,15 +179,15 @@
 
     public final void DOMElement.removeAttribute(String name) throws DOMException {
         // Specs: "If no attribute with this name is found, this method has no effect."
-        coreRemoveAttribute(Policies.DOM1_ATTRIBUTE_MATCHER, null, name, Policies.DETACH_POLICY);
+        coreRemoveAttribute(DOMSemantics.DOM1_ATTRIBUTE_MATCHER, null, name, DOMSemantics.INSTANCE);
     }
 
     public final void DOMElement.removeAttributeNS(String namespaceURI, String localName) throws DOMException {
         // Specs: "If no attribute with this local name and namespace URI is found, this method has no effect."
         if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceURI)) {
-            coreRemoveAttribute(Policies.NAMESPACE_DECLARATION_MATCHER, null, localName.equals(XMLConstants.XMLNS_ATTRIBUTE) ? "" : localName, Policies.DETACH_POLICY);
+            coreRemoveAttribute(DOMSemantics.NAMESPACE_DECLARATION_MATCHER, null, localName.equals(XMLConstants.XMLNS_ATTRIBUTE) ? "" : localName, DOMSemantics.INSTANCE);
         } else {
-            coreRemoveAttribute(Policies.DOM2_ATTRIBUTE_MATCHER, namespaceURI == null ? "" : namespaceURI, localName, Policies.DETACH_POLICY);
+            coreRemoveAttribute(DOMSemantics.DOM2_ATTRIBUTE_MATCHER, namespaceURI == null ? "" : namespaceURI, localName, DOMSemantics.INSTANCE);
         }
     }
     
@@ -196,7 +196,7 @@
     }
 
     public final void DOMElement.setTextContent(String textContent) {
-        coreSetCharacterData(textContent, Policies.DETACH_POLICY);
+        coreSetCharacterData(textContent, DOMSemantics.INSTANCE);
     }
 
     public final NodeList DOMElement.getElementsByTagName(String tagname) {
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMNodeSupport.aj b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMNodeSupport.aj
index bbb32f5..6117191 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMNodeSupport.aj
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMNodeSupport.aj
@@ -41,7 +41,7 @@
         } else if (prefix.length() == 0) {
             return null;
         }
-        String namespaceURI = context.coreLookupNamespaceURI(prefix, false);
+        String namespaceURI = context.coreLookupNamespaceURI(prefix, DOMSemantics.INSTANCE);
         return namespaceURI == null || namespaceURI.length() == 0 ? null : namespaceURI;
     }
 
@@ -53,7 +53,7 @@
         if (namespaceURI == null) {
             return null;
         } else {
-            String prefix = context.coreLookupPrefix(namespaceURI, false);
+            String prefix = context.coreLookupPrefix(namespaceURI, DOMSemantics.INSTANCE);
             return prefix == null || prefix.length() == 0 ? null : prefix;
         }
     }
@@ -66,11 +66,11 @@
         if (namespaceURI == null) {
             namespaceURI = "";
         }
-        return namespaceURI.equals(context.coreLookupNamespaceURI("", false));
+        return namespaceURI.equals(context.coreLookupNamespaceURI("", DOMSemantics.INSTANCE));
     }
 
     public final Node DOMNode.cloneNode(boolean deep) {
-        DOMNode clone = (DOMNode)coreClone(deep ? Policies.DEEP_CLONE : Policies.SHALLOW_CLONE, null);
+        DOMNode clone = (DOMNode)coreClone(deep ? DOMSemantics.DEEP_CLONE : DOMSemantics.SHALLOW_CLONE, null);
         if (!(clone instanceof DOMDocument)) {
             clone.coreSetOwnerDocument(coreGetOwnerDocument(true));
         }
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMParentNodeSupport.aj b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMParentNodeSupport.aj
index 9ec55b3..4614182 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMParentNodeSupport.aj
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMParentNodeSupport.aj
@@ -68,7 +68,7 @@
 
     public final Node DOMParentNode.removeChild(Node oldChild) throws DOMException {
         if (oldChild.getParentNode() == this) {
-            ((CoreChildNode)oldChild).coreDetach(Policies.DETACH_POLICY);
+            ((CoreChildNode)oldChild).coreDetach(DOMSemantics.INSTANCE);
             return oldChild;
         } else {
             throw newDOMException(DOMException.NOT_FOUND_ERR);
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMProcessingInstructionSupport.aj b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMProcessingInstructionSupport.aj
index f6cc26a..5eec56d 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMProcessingInstructionSupport.aj
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMProcessingInstructionSupport.aj
@@ -30,7 +30,7 @@
     }
     
     public final void DOMProcessingInstruction.setData(String data) {
-        coreSetCharacterData(data, Policies.DETACH_POLICY);
+        coreSetCharacterData(data, DOMSemantics.INSTANCE);
     }
     
     public final String DOMProcessingInstruction.getNodeName() {
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/Policies.java b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMSemantics.java
similarity index 89%
rename from aspects/dom-aspects/src/main/java/org/apache/axiom/dom/Policies.java
rename to aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMSemantics.java
index 78c5ad9..679014c 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/Policies.java
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMSemantics.java
@@ -28,12 +28,21 @@
 import org.apache.axiom.core.NSAwareAttributeMatcher;
 import org.apache.axiom.core.NamespaceDeclarationMatcher;
 import org.apache.axiom.core.NodeType;
+import org.apache.axiom.core.Semantics;
 
-public final class Policies {
-    private Policies() {}
+public final class DOMSemantics implements Semantics {
+    public static final DOMSemantics INSTANCE = new DOMSemantics();
     
-    public static final DetachPolicy DETACH_POLICY = DetachPolicy.SAME_DOCUMENT;
+    private DOMSemantics() {}
     
+    public DetachPolicy getDetachPolicy() {
+        return DetachPolicy.SAME_DOCUMENT;
+    }
+    
+    public boolean isUseStrictNamespaceLookup() {
+        return false;
+    }
+
     /**
      * {@link AttributeMatcher} implementation that matches attributes based on their name, i.e.
      * based on the prefix and local name for namespace aware attributes. Parameters are defined as
@@ -74,13 +83,13 @@
         }
 
         public void update(CoreAttribute attr, String prefix, String value) {
-            attr.coreSetCharacterData(value, DETACH_POLICY);
+            attr.coreSetCharacterData(value, INSTANCE);
         }
     };
     
-    public static final AttributeMatcher DOM2_ATTRIBUTE_MATCHER = new NSAwareAttributeMatcher(DETACH_POLICY, true, true);
+    public static final AttributeMatcher DOM2_ATTRIBUTE_MATCHER = new NSAwareAttributeMatcher(INSTANCE, true, true);
 
-    public static final AttributeMatcher NAMESPACE_DECLARATION_MATCHER = new NamespaceDeclarationMatcher(DETACH_POLICY);
+    public static final AttributeMatcher NAMESPACE_DECLARATION_MATCHER = new NamespaceDeclarationMatcher(INSTANCE);
     
     public static final ClonePolicy<Void> DEEP_CLONE = new ClonePolicy<Void>() {
         public Class<? extends CoreNode> getTargetNodeClass(Void options, CoreNode node) {
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMTextNodeSupport.aj b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMTextNodeSupport.aj
index c11438b..8d17ee0 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMTextNodeSupport.aj
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/DOMTextNodeSupport.aj
@@ -87,7 +87,7 @@
             DOMTextNode next;
             do {
                 next = current == last ? null : (DOMTextNode)current.coreGetNextSibling();
-                current.coreDetach(Policies.DETACH_POLICY);
+                current.coreDetach(DOMSemantics.INSTANCE);
                 current = next;
             } while (next != null);
         }
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagName.java b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagName.java
index 5110bcd..05812a2 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagName.java
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagName.java
@@ -36,9 +36,9 @@
     @Override
     protected Iterator<? extends Node> createIterator() {
         if (tagname.equals("*")) {
-            return node.coreGetElements(Axis.DESCENDANTS, DOMElement.class, ElementMatcher.ANY, null, null, DOMExceptionTranslator.INSTANCE, Policies.DETACH_POLICY);
+            return node.coreGetElements(Axis.DESCENDANTS, DOMElement.class, ElementMatcher.ANY, null, null, DOMExceptionTranslator.INSTANCE, DOMSemantics.INSTANCE);
         } else {
-            return node.coreGetElements(Axis.DESCENDANTS, DOMElement.class, ElementMatcher.BY_NAME, null, tagname, DOMExceptionTranslator.INSTANCE, Policies.DETACH_POLICY);
+            return node.coreGetElements(Axis.DESCENDANTS, DOMElement.class, ElementMatcher.BY_NAME, null, tagname, DOMExceptionTranslator.INSTANCE, DOMSemantics.INSTANCE);
         }
     }
 }
diff --git a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagNameNS.java b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagNameNS.java
index fcb416d..dc1b0fa 100644
--- a/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagNameNS.java
+++ b/aspects/dom-aspects/src/main/java/org/apache/axiom/dom/ElementsByTagNameNS.java
@@ -41,13 +41,13 @@
         boolean localNameWildcard = localName.equals("*");
         if (nsWildcard && localNameWildcard) {
             // TODO: there seems to be no unit test checking whether the iterator should return DOM1 elements!
-            return node.coreGetElements(Axis.DESCENDANTS, DOMElement.class, ElementMatcher.ANY, null, null, DOMExceptionTranslator.INSTANCE, Policies.DETACH_POLICY);
+            return node.coreGetElements(Axis.DESCENDANTS, DOMElement.class, ElementMatcher.ANY, null, null, DOMExceptionTranslator.INSTANCE, DOMSemantics.INSTANCE);
         } else if (nsWildcard) {
-            return node.coreGetElements(Axis.DESCENDANTS, DOMNSAwareElement.class, ElementMatcher.BY_LOCAL_NAME, null, localName, DOMExceptionTranslator.INSTANCE, Policies.DETACH_POLICY);
+            return node.coreGetElements(Axis.DESCENDANTS, DOMNSAwareElement.class, ElementMatcher.BY_LOCAL_NAME, null, localName, DOMExceptionTranslator.INSTANCE, DOMSemantics.INSTANCE);
         } else if (localNameWildcard) {
-            return node.coreGetElements(Axis.DESCENDANTS, DOMNSAwareElement.class, ElementMatcher.BY_NAMESPACE_URI, namespaceURI, null, DOMExceptionTranslator.INSTANCE, Policies.DETACH_POLICY);
+            return node.coreGetElements(Axis.DESCENDANTS, DOMNSAwareElement.class, ElementMatcher.BY_NAMESPACE_URI, namespaceURI, null, DOMExceptionTranslator.INSTANCE, DOMSemantics.INSTANCE);
         } else {
-            return node.coreGetElements(Axis.DESCENDANTS, DOMNSAwareElement.class, ElementMatcher.BY_QNAME, namespaceURI, localName, DOMExceptionTranslator.INSTANCE, Policies.DETACH_POLICY);
+            return node.coreGetElements(Axis.DESCENDANTS, DOMNSAwareElement.class, ElementMatcher.BY_QNAME, namespaceURI, localName, DOMExceptionTranslator.INSTANCE, DOMSemantics.INSTANCE);
         }
     }
 }
diff --git a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaAttributeMixin.aj b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaAttributeMixin.aj
index d0f78c4..713e01d 100644
--- a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaAttributeMixin.aj
+++ b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaAttributeMixin.aj
@@ -25,7 +25,7 @@
     }
 
     public final Attribute AbderaAttribute.setText(String text) {
-        coreSetCharacterData(text, Policies.DETACH_POLICY);
+        coreSetCharacterData(text, FOMSemantics.INSTANCE);
         return this;
     }
 }
diff --git a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaElementMixin.aj b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaElementMixin.aj
index 3defd72..6283e5e 100644
--- a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaElementMixin.aj
+++ b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaElementMixin.aj
@@ -20,6 +20,6 @@
 
 public aspect AbderaElementMixin {
     public final void AbderaElement._removeAllChildren() {
-        coreRemoveChildren(Policies.DETACH_POLICY);
+        coreRemoveChildren(FOMSemantics.INSTANCE);
     }
 }
diff --git a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaProcessingInstructionMixin.aj b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaProcessingInstructionMixin.aj
index 39f1af5..5328e1a 100644
--- a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaProcessingInstructionMixin.aj
+++ b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/AbderaProcessingInstructionMixin.aj
@@ -27,7 +27,7 @@
 
     @SuppressWarnings("unchecked")
     public final <T extends ProcessingInstruction> T AbderaProcessingInstruction.setText(String text) {
-        coreSetCharacterData(text, Policies.DETACH_POLICY);
+        coreSetCharacterData(text, FOMSemantics.INSTANCE);
         return (T)this;
     }
 }
diff --git a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/CategoryContainerMixin.aj b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/CategoryContainerMixin.aj
index 3981126..fe6b77b 100644
--- a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/CategoryContainerMixin.aj
+++ b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/CategoryContainerMixin.aj
@@ -55,6 +55,6 @@
         // TODO: we should probably set detachPolicy to null
         return new FOMList<Category>(coreGetElements(
                 Axis.CHILDREN, AbderaCategory.class, CATEGORY_BY_SCHEME, null, scheme,
-                FOMExceptionTranslator.INSTANCE, Policies.DETACH_POLICY));
+                FOMExceptionTranslator.INSTANCE, FOMSemantics.INSTANCE));
     }
 }
diff --git a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/Policies.java b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/FOMSemantics.java
similarity index 71%
rename from aspects/fom-aspects/src/main/java/org/apache/axiom/fom/Policies.java
rename to aspects/fom-aspects/src/main/java/org/apache/axiom/fom/FOMSemantics.java
index 8079dd6..4028055 100644
--- a/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/Policies.java
+++ b/aspects/fom-aspects/src/main/java/org/apache/axiom/fom/FOMSemantics.java
@@ -19,19 +19,22 @@
 package org.apache.axiom.fom;
 
 import org.apache.axiom.core.AttributeMatcher;
-import org.apache.axiom.core.CoreDocument;
-import org.apache.axiom.core.CoreParentNode;
 import org.apache.axiom.core.DetachPolicy;
 import org.apache.axiom.core.NSAwareAttributeMatcher;
+import org.apache.axiom.core.Semantics;
 
-public final class Policies {
-    private Policies() {}
+public final class FOMSemantics implements Semantics {
+    public static final FOMSemantics INSTANCE = new FOMSemantics();
     
-    public static final DetachPolicy DETACH_POLICY = new DetachPolicy() {
-        public CoreDocument getNewOwnerDocument(CoreParentNode owner) {
-            return null;
-        }
-    };
+    private FOMSemantics() {}
     
-    public static final AttributeMatcher ATTRIBUTE_MATCHER = new NSAwareAttributeMatcher(DETACH_POLICY, false, false);
+    public DetachPolicy getDetachPolicy() {
+        return DetachPolicy.NEW_DOCUMENT;
+    }
+    
+    public boolean isUseStrictNamespaceLookup() {
+        return true;
+    }
+
+    public static final AttributeMatcher ATTRIBUTE_MATCHER = new NSAwareAttributeMatcher(INSTANCE, false, false);
 }
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomAttributeSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomAttributeSupport.aj
index 55ceeba..52067ef 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomAttributeSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomAttributeSupport.aj
@@ -44,7 +44,7 @@
     }
     
     public final void AxiomAttribute.setAttributeValue(String value) {
-        coreSetCharacterData(value, Policies.DETACH_POLICY);
+        coreSetCharacterData(value, AxiomSemantics.INSTANCE);
     }
     
     public final String AxiomAttribute.getAttributeType() {
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomChildNodeSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomChildNodeSupport.aj
index edd915a..4f7f7f0 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomChildNodeSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomChildNodeSupport.aj
@@ -60,7 +60,7 @@
             throw new OMException(
                     "Nodes that don't have a parent can not be detached");
         }
-        coreDetach(Policies.DETACH_POLICY);
+        coreDetach(AxiomSemantics.INSTANCE);
         return this;
     }
 }
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomCommentSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomCommentSupport.aj
index 54da40f..587ed78 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomCommentSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomCommentSupport.aj
@@ -34,7 +34,7 @@
     }
 
     public void AxiomComment.setValue(String text) {
-        coreSetCharacterData(text, Policies.DETACH_POLICY);
+        coreSetCharacterData(text, AxiomSemantics.INSTANCE);
     }
     
     public final void AxiomComment.internalSerialize(Serializer serializer, OMOutputFormat format, boolean cache) throws OutputException {
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomContainerSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomContainerSupport.aj
index a2300fc..0552f10 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomContainerSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomContainerSupport.aj
@@ -187,11 +187,11 @@
     }
     
     public void AxiomContainer.removeChildren() {
-        coreRemoveChildren(Policies.DETACH_POLICY);
+        coreRemoveChildren(AxiomSemantics.INSTANCE);
     }
     
     public Iterator AxiomContainer.getChildren() {
-        return coreGetNodes(Axis.CHILDREN, OMNode.class, AxiomExceptionTranslator.INSTANCE, Policies.DETACH_POLICY);
+        return coreGetNodes(Axis.CHILDREN, OMNode.class, AxiomExceptionTranslator.INSTANCE, AxiomSemantics.INSTANCE);
     }
 
     public Iterator AxiomContainer.getChildrenWithLocalName(String localName) {
@@ -229,7 +229,7 @@
     }
     
     public Iterator AxiomContainer.getDescendants(boolean includeSelf) {
-        return coreGetNodes(includeSelf ? Axis.DESCENDANTS_OR_SELF : Axis.DESCENDANTS, OMSerializable.class, AxiomExceptionTranslator.INSTANCE, Policies.DETACH_POLICY);
+        return coreGetNodes(includeSelf ? Axis.DESCENDANTS_OR_SELF : Axis.DESCENDANTS, OMSerializable.class, AxiomExceptionTranslator.INSTANCE, AxiomSemantics.INSTANCE);
     }
 
     public OMElement AxiomContainer.getFirstChildWithName(QName elementQName) throws OMException {
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomDocumentSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomDocumentSupport.aj
index feb2130..fa490c2 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomDocumentSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomDocumentSupport.aj
@@ -40,7 +40,7 @@
         if (existingDocumentElement == null) {
             addChild(documentElement);
         } else {
-            existingDocumentElement.coreReplaceWith((AxiomElement)documentElement, Policies.DETACH_POLICY);
+            existingDocumentElement.coreReplaceWith((AxiomElement)documentElement, AxiomSemantics.INSTANCE);
         }
     }
 
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomElementSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomElementSupport.aj
index 09072f2..63a7132 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomElementSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomElementSupport.aj
@@ -196,7 +196,7 @@
     
     // Not final because overridden in Abdera
     public void AxiomElement.setText(String text) {
-        coreSetCharacterData(text, Policies.DETACH_POLICY);
+        coreSetCharacterData(text, AxiomSemantics.INSTANCE);
     }
 
     public final void AxiomElement.setText(QName qname) {
@@ -278,7 +278,7 @@
     }
     
     public final void AxiomElement.internalAppendAttribute(OMAttribute attr) {
-        coreSetAttribute(Policies.ATTRIBUTE_MATCHER, (AxiomAttribute)attr, Policies.DETACH_POLICY);
+        coreSetAttribute(AxiomSemantics.ATTRIBUTE_MATCHER, (AxiomAttribute)attr, AxiomSemantics.INSTANCE);
     }
     
     public final OMAttribute AxiomElement.addAttribute(OMAttribute attr){
@@ -315,11 +315,11 @@
     
     @SuppressWarnings("rawtypes")
     public final Iterator AxiomElement.getAllAttributes() {
-        return coreGetAttributesByType(AxiomAttribute.class, attributeIdentityMapper, Policies.DETACH_POLICY);
+        return coreGetAttributesByType(AxiomAttribute.class, attributeIdentityMapper, AxiomSemantics.INSTANCE);
     }
     
     public final OMAttribute AxiomElement.getAttribute(QName qname) {
-        return (AxiomAttribute)coreGetAttribute(Policies.ATTRIBUTE_MATCHER, qname.getNamespaceURI(), qname.getLocalPart());
+        return (AxiomAttribute)coreGetAttribute(AxiomSemantics.ATTRIBUTE_MATCHER, qname.getNamespaceURI(), qname.getLocalPart());
     }
 
     // TODO: overridden in fom-impl
@@ -342,7 +342,7 @@
         if (attr.getOwner() != this) {
             throw new OMException("The attribute is not owned by this element");
         }
-        ((AxiomAttribute)attr).coreRemove(Policies.DETACH_POLICY);
+        ((AxiomAttribute)attr).coreRemove(AxiomSemantics.INSTANCE);
     }
 
     public final OMNamespace AxiomElement.addNamespaceDeclaration(String uri, String prefix) {
@@ -356,12 +356,12 @@
     public final void AxiomElement.addNamespaceDeclaration(OMNamespace ns) {
         AxiomNamespaceDeclaration decl = coreGetNodeFactory().createNode(AxiomNamespaceDeclaration.class);
         decl.setDeclaredNamespace(ns);
-        coreSetAttribute(Policies.NAMESPACE_DECLARATION_MATCHER, decl, Policies.DETACH_POLICY);
+        coreSetAttribute(AxiomSemantics.NAMESPACE_DECLARATION_MATCHER, decl, AxiomSemantics.INSTANCE);
     }
     
     @SuppressWarnings("rawtypes")
     public final Iterator AxiomElement.getAllDeclaredNamespaces() {
-        return coreGetAttributesByType(AxiomNamespaceDeclaration.class, NamespaceDeclarationMapper.INSTANCE, Policies.DETACH_POLICY);
+        return coreGetAttributesByType(AxiomNamespaceDeclaration.class, NamespaceDeclarationMapper.INSTANCE, AxiomSemantics.INSTANCE);
     }
 
     public final OMNamespace AxiomElement.declareNamespace(OMNamespace namespace) {
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomInformationItemSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomInformationItemSupport.aj
index eb7ad37..9f00369 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomInformationItemSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomInformationItemSupport.aj
@@ -29,6 +29,6 @@
     }
     
     public final OMInformationItem AxiomInformationItem.clone(OMCloneOptions options) {
-        return (OMInformationItem)coreClone(Policies.CLONE_POLICY, options);
+        return (OMInformationItem)coreClone(AxiomSemantics.CLONE_POLICY, options);
     }
 }
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomNamespaceDeclarationSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomNamespaceDeclarationSupport.aj
index 737d515..25d585b 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomNamespaceDeclarationSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomNamespaceDeclarationSupport.aj
@@ -42,6 +42,6 @@
     
     public final void AxiomNamespaceDeclaration.setDeclaredNamespace(OMNamespace declaredNamespace) {
         this.declaredNamespace = declaredNamespace;
-        coreSetCharacterData(declaredNamespace.getNamespaceURI(), Policies.DETACH_POLICY);
+        coreSetCharacterData(declaredNamespace.getNamespaceURI(), AxiomSemantics.INSTANCE);
     }
 }
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomProcessingInstructionSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomProcessingInstructionSupport.aj
index d1f7636..b304c09 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomProcessingInstructionSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomProcessingInstructionSupport.aj
@@ -37,7 +37,7 @@
     }
 
     public final void AxiomProcessingInstruction.setValue(String value) {
-        coreSetCharacterData(value, Policies.DETACH_POLICY);
+        coreSetCharacterData(value, AxiomSemantics.INSTANCE);
     }
     
     public final void AxiomProcessingInstruction.internalSerialize(Serializer serializer, OMOutputFormat format, boolean cache) throws OutputException {
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/Policies.java b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomSemantics.java
similarity index 87%
rename from aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/Policies.java
rename to aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomSemantics.java
index fa809e0..53e1e1c 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/Policies.java
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomSemantics.java
@@ -26,22 +26,31 @@
 import org.apache.axiom.core.NSAwareAttributeMatcher;
 import org.apache.axiom.core.NamespaceDeclarationMatcher;
 import org.apache.axiom.core.NodeType;
+import org.apache.axiom.core.Semantics;
 import org.apache.axiom.om.OMCloneOptions;
 import org.apache.axiom.om.impl.intf.AxiomAttribute;
 import org.apache.axiom.om.impl.intf.AxiomElement;
 import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
 
-public final class Policies {
-    private Policies() {}
+public final class AxiomSemantics implements Semantics {
+    public static final AxiomSemantics INSTANCE = new AxiomSemantics();
     
-    public static final DetachPolicy DETACH_POLICY = DetachPolicy.NEW_DOCUMENT;
+    private AxiomSemantics() {}
     
+    public DetachPolicy getDetachPolicy() {
+        return DetachPolicy.NEW_DOCUMENT;
+    }
+    
+    public boolean isUseStrictNamespaceLookup() {
+        return true;
+    }
+
     public static final AttributeMatcher ATTRIBUTE_MATCHER = new NSAwareAttributeMatcher(
-            DETACH_POLICY,
+            INSTANCE,
             false,  // Axiom doesn't support namespace unaware attributes
             false);
 
-    public static final AttributeMatcher NAMESPACE_DECLARATION_MATCHER = new NamespaceDeclarationMatcher(DETACH_POLICY);
+    public static final AttributeMatcher NAMESPACE_DECLARATION_MATCHER = new NamespaceDeclarationMatcher(INSTANCE);
     
     public static final ClonePolicy<OMCloneOptions> CLONE_POLICY = new ClonePolicy<OMCloneOptions>() {
         public Class<? extends CoreNode> getTargetNodeClass(OMCloneOptions options, CoreNode node) {
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomTextSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomTextSupport.aj
index 0ff83d6..69e02a0 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomTextSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/AxiomTextSupport.aj
@@ -38,7 +38,7 @@
             return (TextContent)content;
         } else if (force) {
             TextContent textContent = new TextContent((String)content);
-            coreSetCharacterData(textContent, Policies.DETACH_POLICY);
+            coreSetCharacterData(textContent, AxiomSemantics.INSTANCE);
             return textContent;
         } else {
             return null;
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
index 2627f18..521b240 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/factory/OMFactoryImpl.java
@@ -43,7 +43,7 @@
 import org.apache.axiom.om.impl.builder.OMFactoryEx;
 import org.apache.axiom.om.impl.builder.StAXOMBuilder;
 import org.apache.axiom.om.impl.common.OMNamespaceImpl;
-import org.apache.axiom.om.impl.common.Policies;
+import org.apache.axiom.om.impl.common.AxiomSemantics;
 import org.apache.axiom.om.impl.intf.AxiomAttribute;
 import org.apache.axiom.om.impl.intf.AxiomCDATASection;
 import org.apache.axiom.om.impl.intf.AxiomCharacterDataNode;
@@ -136,7 +136,7 @@
         if (parent != null) {
             ((OMContainerEx)parent).addChild(node, fromBuilder);
         }
-        node.coreSetCharacterData(content, Policies.DETACH_POLICY);
+        node.coreSetCharacterData(content, AxiomSemantics.INSTANCE);
         return node;
     }
 
@@ -186,7 +186,7 @@
 
     public final OMText createOMText(OMContainer parent, OMText source) {
         // TODO: this doesn't necessarily produce a node with the expected OMFactory
-        return (AxiomText)((AxiomText)source).coreClone(Policies.CLONE_POLICY, null, (AxiomContainer)parent);
+        return (AxiomText)((AxiomText)source).coreClone(AxiomSemantics.CLONE_POLICY, null, (AxiomContainer)parent);
     }
 
     public final OMText createOMText(Object dataHandler, boolean optimize) {
@@ -210,7 +210,7 @@
             OMContainer parent, String piTarget, String piData, boolean fromBuilder) {
         AxiomProcessingInstruction node = createNode(AxiomProcessingInstruction.class);
         node.coreSetTarget(piTarget);
-        node.coreSetCharacterData(piData, Policies.DETACH_POLICY);
+        node.coreSetCharacterData(piData, AxiomSemantics.INSTANCE);
         if (parent != null) {
             ((OMContainerEx)parent).addChild(node, fromBuilder);
         }
@@ -237,7 +237,7 @@
 
     public final OMComment createOMComment(OMContainer parent, String content, boolean fromBuilder) {
         AxiomComment node = createNode(AxiomComment.class);
-        node.coreSetCharacterData(content, Policies.DETACH_POLICY);
+        node.coreSetCharacterData(content, AxiomSemantics.INSTANCE);
         if (parent != null) {
             ((OMContainerEx)parent).addChild(node, fromBuilder);
         }
@@ -357,7 +357,7 @@
         }
         AxiomAttribute attr = createNode(AxiomAttribute.class);
         attr.internalSetLocalName(localName);
-        attr.coreSetCharacterData(value, Policies.DETACH_POLICY);
+        attr.coreSetCharacterData(value, AxiomSemantics.INSTANCE);
         attr.internalSetNamespace(ns);
         attr.coreSetType(OMConstants.XMLATTRTYPE_CDATA);
         return attr;
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP11FaultCodeSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP11FaultCodeSupport.aj
index 541a2d0..bf03ff4 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP11FaultCodeSupport.aj
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP11FaultCodeSupport.aj
@@ -18,11 +18,39 @@
  */
 package org.apache.axiom.soap.impl.common;
 
+import javax.xml.namespace.QName;
+
 import org.apache.axiom.core.CoreNode;
+import org.apache.axiom.soap.SOAPFaultSubCode;
+import org.apache.axiom.soap.SOAPFaultValue;
 import org.apache.axiom.soap.impl.intf.AxiomSOAP11FaultCode;
 
 public aspect AxiomSOAP11FaultCodeSupport {
     public final Class<? extends CoreNode> AxiomSOAP11FaultCode.coreGetNodeClass() {
         return AxiomSOAP11FaultCode.class;
     }
+
+    public final SOAPFaultValue AxiomSOAP11FaultCode.getValue() {
+        return null;
+    }
+
+    public final void AxiomSOAP11FaultCode.setValue(SOAPFaultValue value) {
+        throw new UnsupportedOperationException();
+    }
+
+    public final SOAPFaultSubCode AxiomSOAP11FaultCode.getSubCode() {
+        return null;
+    }
+
+    public final void AxiomSOAP11FaultCode.setSubCode(SOAPFaultSubCode subCode) {
+        throw new UnsupportedOperationException();
+    }
+
+    public final QName AxiomSOAP11FaultCode.getValueAsQName() {
+        return getTextAsQName();
+    }
+
+    public final void AxiomSOAP11FaultCode.setValue(QName value) {
+        setText(value);
+    }
 }
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP12FaultClassifierSupport.aj b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP12FaultClassifierSupport.aj
new file mode 100644
index 0000000..0901182
--- /dev/null
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/AxiomSOAP12FaultClassifierSupport.aj
@@ -0,0 +1,39 @@
+/*
+ * 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.soap.impl.common;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.soap.SOAPFaultValue;
+import org.apache.axiom.soap.impl.intf.AxiomSOAP12FaultClassifier;
+
+public aspect AxiomSOAP12FaultClassifierSupport {
+    public final QName AxiomSOAP12FaultClassifier.getValueAsQName() {
+        SOAPFaultValue value = getValue();
+        return value == null ? null : value.getTextAsQName();
+    }
+    
+    public final void AxiomSOAP12FaultClassifier.setValue(QName value) {
+        SOAPFaultValue valueElement = getValue();
+        if (valueElement == null) {
+            valueElement = ((SOAP12Factory)getOMFactory()).internalCreateSOAPFaultValue(this, null);
+        }
+        valueElement.setText(value);
+    }
+}
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/SOAP12Factory.java b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/SOAP12Factory.java
index 2569676..82f2c58 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/SOAP12Factory.java
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/common/SOAP12Factory.java
@@ -47,7 +47,7 @@
         return SOAPHelper.SOAP12;
     }
 
-    private SOAPFaultValue internalCreateSOAPFaultValue(SOAPFaultClassifier parent, OMXMLParserWrapper builder) {
+    final SOAPFaultValue internalCreateSOAPFaultValue(SOAPFaultClassifier parent, OMXMLParserWrapper builder) {
         return createSOAPElement(AxiomSOAP12FaultValue.class, parent, SOAP12Constants.QNAME_FAULT_VALUE, builder);
     }
 
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAP12FaultClassifier.java b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAP12FaultClassifier.java
new file mode 100644
index 0000000..13b5c07
--- /dev/null
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAP12FaultClassifier.java
@@ -0,0 +1,25 @@
+/*
+ * 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.soap.impl.intf;
+
+import org.apache.axiom.soap.SOAPFaultClassifier;
+
+public interface AxiomSOAP12FaultClassifier extends SOAPFaultClassifier, AxiomSOAP12Element {
+
+}
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAP12FaultCode.java b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAP12FaultCode.java
index a721573..5602d4f 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAP12FaultCode.java
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAP12FaultCode.java
@@ -18,6 +18,6 @@
  */
 package org.apache.axiom.soap.impl.intf;
 
-public interface AxiomSOAP12FaultCode extends AxiomSOAPFaultCode, AxiomSOAP12Element {
+public interface AxiomSOAP12FaultCode extends AxiomSOAPFaultCode, AxiomSOAP12FaultClassifier {
 
 }
diff --git a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAP12FaultSubCode.java b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAP12FaultSubCode.java
index f24801e..4eedd7a 100644
--- a/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAP12FaultSubCode.java
+++ b/aspects/om-aspects/src/main/java/org/apache/axiom/soap/impl/intf/AxiomSOAP12FaultSubCode.java
@@ -20,6 +20,6 @@
 
 import org.apache.axiom.soap.SOAPFaultSubCode;
 
-public interface AxiomSOAP12FaultSubCode extends AxiomSOAP12Element, SOAPFaultSubCode {
+public interface AxiomSOAP12FaultSubCode extends AxiomSOAP12FaultClassifier, SOAPFaultSubCode {
 
 }
diff --git a/axiom-api/src/main/java/org/apache/axiom/soap/SOAPProcessingException.java b/axiom-api/src/main/java/org/apache/axiom/soap/SOAPProcessingException.java
index 246f321..6bf12d8 100644
--- a/axiom-api/src/main/java/org/apache/axiom/soap/SOAPProcessingException.java
+++ b/axiom-api/src/main/java/org/apache/axiom/soap/SOAPProcessingException.java
@@ -35,6 +35,10 @@
         super(cause);
     }
 
+    public SOAPProcessingException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
     /**
      * @param messageText - this will appear as the Text in the Reason information item of SOAP
      *                    Fault
diff --git a/etc/workspacemechanic/whitespace.epf b/etc/workspacemechanic/whitespace.epf
new file mode 100644
index 0000000..20d7a16
--- /dev/null
+++ b/etc/workspacemechanic/whitespace.epf
@@ -0,0 +1,23 @@
+#
+# 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.
+#
+# @title Show whitespace characters
+# @description Make whitespace characters visible
+# @task_type RECONCILE
+file_export_version=3.0
+/instance/org.eclipse.ui.editors/showWhitespaceCharacters=true
diff --git a/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java b/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
index 86b1d7f..5878fd0 100644
--- a/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
+++ b/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
@@ -24,7 +24,7 @@
 import org.apache.axiom.core.CoreChildNode;
 import org.apache.axiom.core.CoreDocumentFragment;
 import org.apache.axiom.dom.DOMParentNode;
-import org.apache.axiom.dom.Policies;
+import org.apache.axiom.dom.DOMSemantics;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -106,7 +106,7 @@
         }
         checkNewChild(newChild, _oldChild);
         CoreChildNode nextSibling = oldChild.coreGetNextSibling();
-        oldChild.coreDetach(Policies.DETACH_POLICY);
+        oldChild.coreDetach(DOMSemantics.INSTANCE);
         if (newChild instanceof CoreChildNode) {
             if (nextSibling == null) {
                 coreAppendChild((CoreChildNode)newChild, false);
diff --git a/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultCodeImpl.java b/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultCodeImpl.java
index 131ef71..0699fc4 100644
--- a/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultCodeImpl.java
+++ b/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/SOAPFaultCodeImpl.java
@@ -19,12 +19,8 @@
 
 package org.apache.axiom.soap.impl.dom;
 
-import org.apache.axiom.soap.SOAP12Constants;
-import org.apache.axiom.soap.SOAPFaultSubCode;
 import org.apache.axiom.soap.impl.intf.AxiomSOAPFaultCode;
 
 public abstract class SOAPFaultCodeImpl extends SOAPElement implements AxiomSOAPFaultCode {
-    public SOAPFaultSubCode getSubCode() {
-        return (SOAPFaultSubCode)getFirstChildWithName(SOAP12Constants.QNAME_FAULT_SUBCODE);
-    }
+
 }
diff --git a/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultCodeImpl.java b/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultCodeImpl.java
index 0947c86..e0f0f18 100644
--- a/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultCodeImpl.java
+++ b/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap11/SOAP11FaultCodeImpl.java
@@ -19,24 +19,12 @@
 
 package org.apache.axiom.soap.impl.dom.soap11;
 
-import javax.xml.namespace.QName;
-
 import org.apache.axiom.om.OMElement;
-import org.apache.axiom.soap.SOAPFaultSubCode;
-import org.apache.axiom.soap.SOAPFaultValue;
 import org.apache.axiom.soap.SOAPProcessingException;
 import org.apache.axiom.soap.impl.dom.SOAPFaultCodeImpl;
 import org.apache.axiom.soap.impl.intf.AxiomSOAP11FaultCode;
 
 public class SOAP11FaultCodeImpl extends SOAPFaultCodeImpl implements AxiomSOAP11FaultCode {
-    public void setSubCode(SOAPFaultSubCode subCode) throws SOAPProcessingException {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setValue(SOAPFaultValue value) throws SOAPProcessingException {
-        throw new UnsupportedOperationException();
-    }
-
     public void checkParent(OMElement parent) throws SOAPProcessingException {
         if (!(parent instanceof SOAP11FaultImpl)) {
             throw new SOAPProcessingException(
@@ -44,16 +32,4 @@
                             "parent. But received some other implementation");
         }
     }
-
-    public SOAPFaultValue getValue() {
-        return null;
-    }
-
-    public void setValue(QName value) {
-        setText(value);
-    }
-
-    public QName getValueAsQName() {
-        return getTextAsQName();
-    }
 }
diff --git a/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultCodeImpl.java b/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultCodeImpl.java
index a3bd045..12c245c3 100644
--- a/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultCodeImpl.java
+++ b/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultCodeImpl.java
@@ -24,7 +24,6 @@
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.util.ElementHelper;
 import org.apache.axiom.soap.SOAP12Constants;
-import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFaultSubCode;
 import org.apache.axiom.soap.SOAPFaultValue;
 import org.apache.axiom.soap.SOAPProcessingException;
@@ -68,16 +67,7 @@
         return (SOAPFaultValue)getFirstChildWithName(SOAP12Constants.QNAME_FAULT_VALUE);
     }
 
-    public void setValue(QName value) {
-        SOAPFaultValue valueElement = getValue();
-        if (valueElement == null) {
-            valueElement = ((SOAPFactory)getOMFactory()).createSOAPFaultValue(this);
-        }
-        valueElement.setText(value);
-    }
-
-    public QName getValueAsQName() {
-        SOAPFaultValue value = getValue();
-        return value == null ? null : value.getTextAsQName();
+    public SOAPFaultSubCode getSubCode() {
+        return (SOAPFaultSubCode)getFirstChildWithName(SOAP12Constants.QNAME_FAULT_SUBCODE);
     }
 }
diff --git a/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultSubCodeImpl.java b/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultSubCodeImpl.java
index 54c7744..0d727a5 100644
--- a/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultSubCodeImpl.java
+++ b/implementations/axiom-dom/src/main/java/org/apache/axiom/soap/impl/dom/soap12/SOAP12FaultSubCodeImpl.java
@@ -19,12 +19,9 @@
 
 package org.apache.axiom.soap.impl.dom.soap12;
 
-import javax.xml.namespace.QName;
-
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.util.ElementHelper;
 import org.apache.axiom.soap.SOAP12Constants;
-import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFaultSubCode;
 import org.apache.axiom.soap.SOAPFaultValue;
 import org.apache.axiom.soap.SOAPProcessingException;
@@ -77,17 +74,4 @@
         }
         return value;
     }
-
-    public void setValue(QName value) {
-        SOAPFaultValue valueElement = getValue();
-        if (valueElement == null) {
-            valueElement = ((SOAPFactory)getOMFactory()).createSOAPFaultValue(this);
-        }
-        valueElement.setText(value);
-    }
-
-    public QName getValueAsQName() {
-        SOAPFaultValue value = getValue();
-        return value == null ? null : value.getTextAsQName();
-    }
 }
diff --git a/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap11/SOAP11FaultCodeImpl.java b/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap11/SOAP11FaultCodeImpl.java
index 4ec806e..552d022 100644
--- a/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap11/SOAP11FaultCodeImpl.java
+++ b/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap11/SOAP11FaultCodeImpl.java
@@ -19,45 +19,16 @@
 
 package org.apache.axiom.soap.impl.llom.soap11;
 
-import javax.xml.namespace.QName;
-
 import org.apache.axiom.om.OMElement;
-import org.apache.axiom.soap.SOAPFaultSubCode;
-import org.apache.axiom.soap.SOAPFaultValue;
 import org.apache.axiom.soap.SOAPProcessingException;
 import org.apache.axiom.soap.impl.intf.AxiomSOAP11FaultCode;
 import org.apache.axiom.soap.impl.llom.SOAPFaultCodeImpl;
 
 public class SOAP11FaultCodeImpl extends SOAPFaultCodeImpl implements AxiomSOAP11FaultCode {
-    public void setSubCode(SOAPFaultSubCode subCode) throws SOAPProcessingException {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setValue(SOAPFaultValue value) throws SOAPProcessingException {
-        throw new UnsupportedOperationException();
-    }
-
     public void checkParent(OMElement parent) throws SOAPProcessingException {
         if (!(parent instanceof SOAP11FaultImpl)) {
             throw new SOAPProcessingException(
                     "Expecting SOAP11FaultImpl, got " + parent.getClass());
         }
     }
-
-    public SOAPFaultValue getValue() {
-        return null;
-    }
-
-    public SOAPFaultSubCode getSubCode() {
-        return null;
-//        throw new UnsupportedOperationException("getSubCode() not supported for SOAP 1.1 faults");
-    }
-
-    public void setValue(QName value) {
-        setText(value);
-    }
-
-    public QName getValueAsQName() {
-        return getTextAsQName();
-    }
 }
diff --git a/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap12/SOAP12FaultCodeImpl.java b/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap12/SOAP12FaultCodeImpl.java
index 87b7dee..51b87a8 100644
--- a/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap12/SOAP12FaultCodeImpl.java
+++ b/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap12/SOAP12FaultCodeImpl.java
@@ -24,7 +24,6 @@
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.util.ElementHelper;
 import org.apache.axiom.soap.SOAP12Constants;
-import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFaultSubCode;
 import org.apache.axiom.soap.SOAPFaultValue;
 import org.apache.axiom.soap.SOAPProcessingException;
@@ -67,17 +66,4 @@
     public SOAPFaultSubCode getSubCode() {
         return (SOAPFaultSubCode)getFirstChildWithName(SOAP12Constants.QNAME_FAULT_SUBCODE);
     }
-
-    public void setValue(QName value) {
-        SOAPFaultValue valueElement = getValue();
-        if (valueElement == null) {
-            valueElement = ((SOAPFactory)getOMFactory()).createSOAPFaultValue(this);
-        }
-        valueElement.setText(value);
-    }
-
-    public QName getValueAsQName() {
-        SOAPFaultValue value = getValue();
-        return value == null ? null : value.getTextAsQName();
-    }
 }
diff --git a/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap12/SOAP12FaultSubCodeImpl.java b/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap12/SOAP12FaultSubCodeImpl.java
index ca87122..6794934 100644
--- a/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap12/SOAP12FaultSubCodeImpl.java
+++ b/implementations/axiom-impl/src/main/java/org/apache/axiom/soap/impl/llom/soap12/SOAP12FaultSubCodeImpl.java
@@ -19,12 +19,9 @@
 
 package org.apache.axiom.soap.impl.llom.soap12;
 
-import javax.xml.namespace.QName;
-
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.util.ElementHelper;
 import org.apache.axiom.soap.SOAP12Constants;
-import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axiom.soap.SOAPFaultSubCode;
 import org.apache.axiom.soap.SOAPFaultValue;
 import org.apache.axiom.soap.SOAPProcessingException;
@@ -76,17 +73,4 @@
         }
         return value;
     }
-
-    public void setValue(QName value) {
-        SOAPFaultValue valueElement = getValue();
-        if (valueElement == null) {
-            valueElement = ((SOAPFactory)getOMFactory()).createSOAPFaultValue(this);
-        }
-        valueElement.setText(value);
-    }
-
-    public QName getValueAsQName() {
-        SOAPFaultValue value = getValue();
-        return value == null ? null : value.getTextAsQName();
-    }
 }
diff --git a/implementations/fom-impl/src/main/java/org/apache/abdera/parser/stax/FOMElement.java b/implementations/fom-impl/src/main/java/org/apache/abdera/parser/stax/FOMElement.java
index f5a21a5..9ff6cb4 100644
--- a/implementations/fom-impl/src/main/java/org/apache/abdera/parser/stax/FOMElement.java
+++ b/implementations/fom-impl/src/main/java/org/apache/abdera/parser/stax/FOMElement.java
@@ -62,8 +62,8 @@
 import org.apache.axiom.fom.AbderaElement;
 import org.apache.axiom.fom.FOMExceptionTranslator;
 import org.apache.axiom.fom.FOMList;
+import org.apache.axiom.fom.FOMSemantics;
 import org.apache.axiom.fom.IRIUtil;
-import org.apache.axiom.fom.Policies;
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMComment;
 import org.apache.axiom.om.OMContainer;
@@ -216,9 +216,9 @@
 
     public <T extends Element> T setAttributeValue(QName qname, String value) {
         if (value == null) {
-            coreRemoveAttribute(Policies.ATTRIBUTE_MATCHER, qname.getNamespaceURI(), qname.getLocalPart(), Policies.DETACH_POLICY);
+            coreRemoveAttribute(FOMSemantics.ATTRIBUTE_MATCHER, qname.getNamespaceURI(), qname.getLocalPart(), FOMSemantics.INSTANCE);
         } else {
-            coreSetAttribute(Policies.ATTRIBUTE_MATCHER, qname.getNamespaceURI(), qname.getLocalPart(), qname.getPrefix(), value);
+            coreSetAttribute(FOMSemantics.ATTRIBUTE_MATCHER, qname.getNamespaceURI(), qname.getLocalPart(), qname.getPrefix(), value);
         }
         return (T)this;
     }
@@ -226,7 +226,7 @@
     public final Iterator<AbderaElement> _getChildrenWithName(QName qname) {
         return coreGetElements(Axis.CHILDREN, AbderaElement.class, ElementMatcher.BY_QNAME,
                 qname.getNamespaceURI(), qname.getLocalPart(), FOMExceptionTranslator.INSTANCE,
-                Policies.DETACH_POLICY);
+                FOMSemantics.INSTANCE);
     }
 
     public <E extends Element> List<E> _getChildrenAsSet(QName qname) {
@@ -254,9 +254,9 @@
         if (e == null && element != null) {
             coreAppendChild((AbderaElement)element, false);
         } else if (e != null && element != null) {
-            e.coreReplaceWith((AbderaElement)element, Policies.DETACH_POLICY);
+            e.coreReplaceWith((AbderaElement)element, FOMSemantics.INSTANCE);
         } else if (e != null && element == null) {
-            e.coreDetach(Policies.DETACH_POLICY);
+            e.coreDetach(FOMSemantics.INSTANCE);
         }
     }
 
@@ -453,7 +453,7 @@
                 if (element.coreGetLocalName().equals(qname.getLocalPart())
                         && element.coreGetNamespaceURI().equals(qname.getNamespaceURI())) {
                     child = child.coreGetNextSibling();
-                    element.coreDetach(Policies.DETACH_POLICY);
+                    element.coreDetach(FOMSemantics.INSTANCE);
                     if (many) {
                         continue;
                     } else {
diff --git a/pom.xml b/pom.xml
index b47fa1f..414f5ed 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.apache.ws</groupId>
         <artifactId>ws-parent</artifactId>
-        <version>1</version>
+        <version>2</version>
     </parent>
 
     <groupId>org.apache.ws.commons.axiom</groupId>
@@ -921,6 +921,11 @@
                 <executions>
                     <execution>
                         <id>source-jars</id>
+                        <!-- Execute in phase prepare-package to make sure that the source JAR is built before
+                             maven-shade-plugin is invoked. (Note that activation of the apache-release profile
+                             may cause an inversion of the order in which these goals are executed if they are
+                             bound to the same phase.) -->
+                        <phase>prepare-package</phase>
                         <goals>
                             <!-- Use "jar-no-fork" instead of "jar" to avoid forking the build
                                  (which is not a problem, but unnecessary) -->
diff --git a/systests/eclipse-tests/src/it/project/pom.xml b/systests/eclipse-tests/src/it/project/pom.xml
index 524d74b..1ff88bf 100644
--- a/systests/eclipse-tests/src/it/project/pom.xml
+++ b/systests/eclipse-tests/src/it/project/pom.xml
@@ -89,6 +89,19 @@
                     <argLine>${jacoco.surefireArgLine}</argLine>
                 </configuration>
             </plugin>
+            <plugin>
+                <artifactId>maven-source-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <!-- For some reason maven-source-plugin causes problems here; deactivate it -->
+                        <id>source-jars</id>
+                        <phase>none</phase>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
 </project>
diff --git a/testing/multiton/src/main/java/org/apache/axiom/testing/multiton/Adapters.java b/testing/multiton/src/main/java/org/apache/axiom/testing/multiton/Adapters.java
index 7f3c8ff..e1b0939 100644
--- a/testing/multiton/src/main/java/org/apache/axiom/testing/multiton/Adapters.java
+++ b/testing/multiton/src/main/java/org/apache/axiom/testing/multiton/Adapters.java
@@ -24,7 +24,7 @@
 import java.util.Set;
 
 public final class Adapters {
-    private final Map<Class<?>,Object> adapters = new HashMap<Class<?>,Object>();
+    private final Map<Class<?>,Object> adapters = new HashMap<>();
     private boolean initialized;
     
     public <T> void add(Class<T> type, T adapter) {
diff --git a/testing/multiton/src/main/java/org/apache/axiom/testing/multiton/Multiton.java b/testing/multiton/src/main/java/org/apache/axiom/testing/multiton/Multiton.java
index 93d796b..7fba747 100644
--- a/testing/multiton/src/main/java/org/apache/axiom/testing/multiton/Multiton.java
+++ b/testing/multiton/src/main/java/org/apache/axiom/testing/multiton/Multiton.java
@@ -46,8 +46,8 @@
  */
 @SuppressWarnings({"rawtypes", "unchecked"})
 public abstract class Multiton {
-    private static final Map<Class<?>,List<?>> instancesMap = new HashMap<Class<?>,List<?>>();
-    private static final Map<Class,List<AdapterFactory>> adapterFactoryMap = new HashMap<Class,List<AdapterFactory>>();
+    private static final Map<Class<?>,List<?>> instancesMap = new HashMap<>();
+    private static final Map<Class,List<AdapterFactory>> adapterFactoryMap = new HashMap<>();
     private final Adapters adapters = new Adapters();
     
     static {
@@ -57,7 +57,7 @@
             Class clazz = ((Class<?>)((ParameterizedType)adapterFactory.getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0]).asSubclass(Multiton.class);
             List<AdapterFactory> adapterFactories = adapterFactoryMap.get(clazz);
             if (adapterFactories == null) {
-                adapterFactories = new ArrayList<AdapterFactory>();
+                adapterFactories = new ArrayList<>();
                 adapterFactoryMap.put(clazz, adapterFactories);
             }
             adapterFactories.add(adapterFactory);
@@ -75,7 +75,7 @@
     public static synchronized <T extends Multiton> List<T> getInstances(Class<T> multitonClass) {
         List<T> instances = (List<T>)instancesMap.get(multitonClass);
         if (instances == null) {
-            instances = new ArrayList<T>();
+            instances = new ArrayList<>();
             for (Field field : multitonClass.getDeclaredFields()) {
                 int mod = field.getModifiers();
                 if (Modifier.isPublic(mod) && Modifier.isStatic(mod) && Modifier.isFinal(mod)
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
index 983487d..23bcbd1 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
+++ b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/ConvertedSOAPSampleContent.java
@@ -40,7 +40,7 @@
 import org.w3c.dom.NodeList;
 
 final class ConvertedSOAPSampleContent extends ComputedMessageContent {
-    private static Map<String,String> faultCodeMap = new HashMap<String,String>();
+    private static Map<String,String> faultCodeMap = new HashMap<>();
     
     static {
         faultCodeMap.put(
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPElementType.java b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPElementType.java
index 2dd28e1..389ca3f 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPElementType.java
+++ b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPElementType.java
@@ -99,8 +99,8 @@
         addRelation(FAULT, SOAPFaultChild.DETAIL);
     }
     
-    private final List<SOAPElementType> parentTypes = new ArrayList<SOAPElementType>();
-    private final List<SOAPElementType> childTypes = new ArrayList<SOAPElementType>();
+    private final List<SOAPElementType> parentTypes = new ArrayList<>();
+    private final List<SOAPElementType> childTypes = new ArrayList<>();
     
     SOAPElementType() {}
     
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPSample.java b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPSample.java
index bf03fab..281e95d 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPSample.java
+++ b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPSample.java
@@ -54,7 +54,7 @@
     
     @Instances
     private static SOAPSample[] instances() {
-        List<SOAPSample> instances = new ArrayList<SOAPSample>();
+        List<SOAPSample> instances = new ArrayList<>();
         for (SOAPSampleSet set : getInstances(SOAPSampleSet.class)) {
             for (SOAPSpec spec : getInstances(SOAPSpec.class)) {
                 instances.add(set.getMessage(spec));
diff --git a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPSpec.java b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPSpec.java
index 11ec22c..5b8d082 100644
--- a/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPSpec.java
+++ b/testing/soap-testsuite/src/main/java/org/apache/axiom/ts/soap/SOAPSpec.java
@@ -214,13 +214,13 @@
      * @return an array with the recognized boolean literals
      */
     public final BooleanLiteral[] getBooleanLiterals() {
-        return (BooleanLiteral[])booleanLiterals.clone();
+        return booleanLiterals.clone();
     }
 
-    private static List getReps(BooleanLiteral[] literals) {
-        List result = new ArrayList(literals.length);
-        for (int i=0; i<literals.length; i++) {
-            result.add(literals[i].getLexicalRepresentation());
+    private static List<String> getReps(BooleanLiteral[] literals) {
+        List<String> result = new ArrayList<>(literals.length);
+        for (BooleanLiteral literal : literals) {
+            result.add(literal.getLexicalRepresentation());
         }
         return result;
     }
@@ -239,15 +239,15 @@
      * @return an array of invalid boolean literals
      */
     public final String[] getInvalidBooleanLiterals() {
-        Set result = new LinkedHashSet();
+        Set<String> result = new LinkedHashSet<>();
         result.addAll(getReps(getAltSpec().booleanLiterals));
-        List valid = getReps(booleanLiterals);
+        List<String> valid = getReps(booleanLiterals);
         result.removeAll(valid);
         result.add("invalid");
         if (valid.contains("true")) {
             result.add("TRUE");
         }
-        return (String[])result.toArray(new String[result.size()]);
+        return result.toArray(new String[result.size()]);
     }
     
     /**
diff --git a/testing/testutils/src/main/java/org/apache/axiom/testutils/InvocationCounter.java b/testing/testutils/src/main/java/org/apache/axiom/testutils/InvocationCounter.java
index 2829012..0e67073 100644
--- a/testing/testutils/src/main/java/org/apache/axiom/testutils/InvocationCounter.java
+++ b/testing/testutils/src/main/java/org/apache/axiom/testutils/InvocationCounter.java
@@ -66,14 +66,14 @@
      * @return the proxy instance
      */
     public Object createProxy(Object target) {
-        Set ifaces = new HashSet();
-        Class clazz = target.getClass();
+        Set<Class<?>> ifaces = new HashSet<>();
+        Class<?> clazz = target.getClass();
         do {
             ifaces.addAll(Arrays.asList(clazz.getInterfaces()));
             clazz = clazz.getSuperclass();
         } while (clazz != null);
         return Proxy.newProxyInstance(InvocationCounter.class.getClassLoader(),
-                (Class[])ifaces.toArray(new Class[ifaces.size()]), new InvocationHandlerImpl(target));
+                ifaces.toArray(new Class<?>[ifaces.size()]), new InvocationHandlerImpl(target));
     }
 
     /**
diff --git a/testing/testutils/src/main/java/org/apache/axiom/testutils/concurrent/ConcurrentTestUtils.java b/testing/testutils/src/main/java/org/apache/axiom/testutils/concurrent/ConcurrentTestUtils.java
index 089ab98..24dd47c 100644
--- a/testing/testutils/src/main/java/org/apache/axiom/testutils/concurrent/ConcurrentTestUtils.java
+++ b/testing/testutils/src/main/java/org/apache/axiom/testutils/concurrent/ConcurrentTestUtils.java
@@ -20,14 +20,13 @@
 package org.apache.axiom.testutils.concurrent;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 public class ConcurrentTestUtils {
 
     public static void testThreadSafety(final Action action) throws Throwable {
         int threadCount = 10;
-        final List results = new ArrayList(threadCount);
+        final List<Throwable> results = new ArrayList<>(threadCount);
         for (int i=0; i<threadCount; i++) {
             new Thread(new Runnable() {
                 public void run() {
@@ -52,8 +51,7 @@
                 results.wait();
             }
         }
-        for (Iterator it = results.iterator(); it.hasNext(); ) {
-            Throwable result = (Throwable)it.next();
+        for (Throwable result : results) {
             if (result != null) {
                 throw result;
             }
diff --git a/testing/testutils/src/main/java/org/apache/axiom/testutils/namespace/NamespaceContextTestUtils.java b/testing/testutils/src/main/java/org/apache/axiom/testutils/namespace/NamespaceContextTestUtils.java
index 691329d..b5b813d 100644
--- a/testing/testutils/src/main/java/org/apache/axiom/testutils/namespace/NamespaceContextTestUtils.java
+++ b/testing/testutils/src/main/java/org/apache/axiom/testutils/namespace/NamespaceContextTestUtils.java
@@ -24,7 +24,7 @@
 import javax.xml.XMLConstants;
 import javax.xml.namespace.NamespaceContext;
 
-import junit.framework.Assert;
+import org.junit.Assert;
 
 public final class NamespaceContextTestUtils {
     private NamespaceContextTestUtils() {}
@@ -36,7 +36,7 @@
         Assert.assertEquals(XMLConstants.XML_NS_PREFIX, nc.getPrefix(XMLConstants.XML_NS_URI));
         Assert.assertEquals(XMLConstants.XMLNS_ATTRIBUTE, nc.getPrefix(XMLConstants.XMLNS_ATTRIBUTE_NS_URI));
         
-        Iterator it = nc.getPrefixes(XMLConstants.XML_NS_URI);
+        Iterator<?> it = nc.getPrefixes(XMLConstants.XML_NS_URI);
         Assert.assertTrue(it.hasNext());
         Assert.assertEquals(XMLConstants.XML_NS_PREFIX, it.next());
         Assert.assertFalse(it.hasNext());
diff --git a/testing/testutils/src/main/java/org/apache/axiom/testutils/net/protocol/mem/DataSourceRegistry.java b/testing/testutils/src/main/java/org/apache/axiom/testutils/net/protocol/mem/DataSourceRegistry.java
index 03a6fb4..93257b3 100644
--- a/testing/testutils/src/main/java/org/apache/axiom/testutils/net/protocol/mem/DataSourceRegistry.java
+++ b/testing/testutils/src/main/java/org/apache/axiom/testutils/net/protocol/mem/DataSourceRegistry.java
@@ -29,7 +29,7 @@
 
 public final class DataSourceRegistry {
     private static boolean handlerRegistered;
-    private static final Map<String,DataSource> dataSources = new HashMap<String,DataSource>();
+    private static final Map<String,DataSource> dataSources = new HashMap<>();
     
     private DataSourceRegistry() {}
 
diff --git a/testing/testutils/src/main/java/org/apache/axiom/testutils/stax/AttributeSortingXMLStreamReaderFilter.java b/testing/testutils/src/main/java/org/apache/axiom/testutils/stax/AttributeSortingXMLStreamReaderFilter.java
index 6c0f021..ac5590b 100644
--- a/testing/testutils/src/main/java/org/apache/axiom/testutils/stax/AttributeSortingXMLStreamReaderFilter.java
+++ b/testing/testutils/src/main/java/org/apache/axiom/testutils/stax/AttributeSortingXMLStreamReaderFilter.java
@@ -49,7 +49,7 @@
         if (indexMap == null) {
             int n = super.getAttributeCount();
             indexMap = new int[n];
-            SortedMap<String,Integer> map = new TreeMap<String,Integer>();
+            SortedMap<String,Integer> map = new TreeMap<>();
             for (int i=0; i<n; i++) {
                 map.put(super.getAttributeName(i).toString(), i);
             }
diff --git a/testing/testutils/src/main/java/org/apache/axiom/testutils/stax/XMLStreamReaderComparator.java b/testing/testutils/src/main/java/org/apache/axiom/testutils/stax/XMLStreamReaderComparator.java
index 711ff3e..cb76a12 100644
--- a/testing/testutils/src/main/java/org/apache/axiom/testutils/stax/XMLStreamReaderComparator.java
+++ b/testing/testutils/src/main/java/org/apache/axiom/testutils/stax/XMLStreamReaderComparator.java
@@ -52,19 +52,19 @@
     private boolean compareCharacterEncodingScheme = true;
     private boolean compareEncoding = true;
     private boolean sortAttributes = false;
-    private final LinkedList<QName> path = new LinkedList<QName>();
+    private final LinkedList<QName> path = new LinkedList<>();
     
     /**
      * Set collecting all prefixes seen in the document to be able to test
      * {@link XMLStreamReader#getNamespaceURI(String)}.
      */
-    private final Set<String> prefixes = new HashSet<String>();
+    private final Set<String> prefixes = new HashSet<>();
     
     /**
      * Set collecting all namespace URIs seen in the document to be able to
      * test {@link NamespaceContext#getPrefix(String)}.
      */
-    private final Set<String> namespaceURIs = new HashSet<String>();
+    private final Set<String> namespaceURIs = new HashSet<>();
     
     public XMLStreamReaderComparator(XMLStreamReader expected, XMLStreamReader actual) {
         this.expected = expected;
@@ -160,7 +160,7 @@
     }
     
     private Set<String> toPrefixSet(Iterator<?> it) {
-        Set<String> set = new HashSet<String>();
+        Set<String> set = new HashSet<>();
         while (it.hasNext()) {
             String prefix = (String)it.next();
             // TODO: Woodstox returns null instead of "" for the default namespace.
@@ -273,8 +273,8 @@
             assertSameResult("getName");
             Integer namespaceCount = (Integer)assertSameResult("getNamespaceCount");
             if (namespaceCount != null) {
-                Map<String,String> expectedNamespaces = new HashMap<String,String>();
-                Map<String,String> actualNamespaces = new HashMap<String,String>();
+                Map<String,String> expectedNamespaces = new HashMap<>();
+                Map<String,String> actualNamespaces = new HashMap<>();
                 for (int i=0; i<namespaceCount.intValue(); i++) {
                     String expectedPrefix = expected.getNamespacePrefix(i);
                     String expectedNamespaceURI = expected.getNamespaceURI(i);
diff --git a/testing/testutils/src/main/java/org/apache/axiom/testutils/suite/MatrixTestCase.java b/testing/testutils/src/main/java/org/apache/axiom/testutils/suite/MatrixTestCase.java
index 300dba5..295ddb4 100644
--- a/testing/testutils/src/main/java/org/apache/axiom/testutils/suite/MatrixTestCase.java
+++ b/testing/testutils/src/main/java/org/apache/axiom/testutils/suite/MatrixTestCase.java
@@ -27,7 +27,7 @@
  * A test case that can be executed multiple times with different parameters.
  */
 public abstract class MatrixTestCase extends TestCase {
-    private final Dictionary<String,String> parameters = new Hashtable<String,String>();
+    private final Dictionary<String,String> parameters = new Hashtable<>();
 
     public MatrixTestCase() {
         setName(getClass().getName());
diff --git a/testing/testutils/src/main/java/org/apache/axiom/testutils/suite/MatrixTestSuiteBuilder.java b/testing/testutils/src/main/java/org/apache/axiom/testutils/suite/MatrixTestSuiteBuilder.java
index 85b6b35..190446f 100644
--- a/testing/testutils/src/main/java/org/apache/axiom/testutils/suite/MatrixTestSuiteBuilder.java
+++ b/testing/testutils/src/main/java/org/apache/axiom/testutils/suite/MatrixTestSuiteBuilder.java
@@ -49,7 +49,7 @@
         }
     }
     
-    private final List<Exclude> excludes = new ArrayList<Exclude>();
+    private final List<Exclude> excludes = new ArrayList<>();
     private TestSuite suite;
     
     public final void exclude(Class<? extends MatrixTestCase> testClass, String filter) {
diff --git a/testing/testutils/src/test/java/org/apache/axiom/testutils/net/protocol/mem/DataSourceRegistryTest.java b/testing/testutils/src/test/java/org/apache/axiom/testutils/net/protocol/mem/DataSourceRegistryTest.java
index d1e2649..1c6234e 100644
--- a/testing/testutils/src/test/java/org/apache/axiom/testutils/net/protocol/mem/DataSourceRegistryTest.java
+++ b/testing/testutils/src/test/java/org/apache/axiom/testutils/net/protocol/mem/DataSourceRegistryTest.java
@@ -36,7 +36,7 @@
             // We must be able to connect to the URL after converting it to a String
             URL url = new URL(registration.getURL().toString());
             URLConnection connection = url.openConnection();
-            IOTestUtils.compareStreams(connection.getInputStream(), ds.getInputStream());
+            IOTestUtils.compareStreams(connection.getInputStream(), "actual", ds.getInputStream(), "expected");
         } finally {
             registration.unregister();
         }
diff --git a/testing/xml-testsuite/src/main/java/org/apache/axiom/ts/xml/XMLSample.java b/testing/xml-testsuite/src/main/java/org/apache/axiom/ts/xml/XMLSample.java
index e4e8283..e8c882d 100644
--- a/testing/xml-testsuite/src/main/java/org/apache/axiom/ts/xml/XMLSample.java
+++ b/testing/xml-testsuite/src/main/java/org/apache/axiom/ts/xml/XMLSample.java
@@ -130,7 +130,7 @@
     private static XMLSample[] instances() throws IOException {
         BufferedReader in = new BufferedReader(new InputStreamReader(
                 XMLSample.class.getResourceAsStream("bulk/filelist")));
-        List<XMLSample> result = new ArrayList<XMLSample>(10);
+        List<XMLSample> result = new ArrayList<>(10);
         String name;
         while ((name = in.readLine()) != null) {
             result.add(new XMLSample("bulk/" + name));
diff --git a/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/DOMTraverser.java b/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/DOMTraverser.java
index b3e020c..ee7999c 100644
--- a/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/DOMTraverser.java
+++ b/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/DOMTraverser.java
@@ -154,7 +154,7 @@
             Attr attr = (Attr)attributes.item(i);
             if (!XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(attr.getNamespaceURI())) {
                 if (result == null) {
-                    result = new HashMap<QName,String>();
+                    result = new HashMap<>();
                 }
                 result.put(getQName(attr), attr.getValue());
             }
@@ -170,7 +170,7 @@
             Attr attr = (Attr)attributes.item(i);
             if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(attr.getNamespaceURI())) {
                 if (result == null) {
-                    result = new HashMap<String,String>();
+                    result = new HashMap<>();
                 }
                 String prefix = attr.getPrefix();
                 result.put(XMLConstants.XMLNS_ATTRIBUTE.equals(prefix) ? attr.getLocalName() : "", attr.getValue());
diff --git a/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/RedundantNamespaceDeclarationFilter.java b/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/RedundantNamespaceDeclarationFilter.java
index 2e585cc..39675dd 100644
--- a/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/RedundantNamespaceDeclarationFilter.java
+++ b/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/RedundantNamespaceDeclarationFilter.java
@@ -34,7 +34,7 @@
     private static final Map<String,String> implicitNamespaces;
     
     static {
-        implicitNamespaces = new HashMap<String,String>();
+        implicitNamespaces = new HashMap<>();
         implicitNamespaces.put("", "");
         implicitNamespaces.put(XMLConstants.XML_NS_PREFIX, XMLConstants.XML_NS_URI);
         implicitNamespaces.put(XMLConstants.XMLNS_ATTRIBUTE, XMLConstants.XMLNS_ATTRIBUTE_NS_URI);
@@ -44,7 +44,7 @@
     
     RedundantNamespaceDeclarationFilter(Traverser parent) {
         super(parent);
-        stack = new ArrayList<Map<String,String>>(10);
+        stack = new ArrayList<>(10);
         stack.add(implicitNamespaces);
     }
 
diff --git a/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXTraverser.java b/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXTraverser.java
index 9361ee5..98152c7 100644
--- a/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXTraverser.java
+++ b/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/StAXTraverser.java
@@ -101,7 +101,7 @@
         if (attributeCount == 0) {
             return null;
         } else {
-            Map<QName,String> attributes = new HashMap<QName,String>();
+            Map<QName,String> attributes = new HashMap<>();
             for (int i=0; i<attributeCount; i++) {
                 attributes.put(reader.getAttributeName(i), reader.getAttributeValue(i));
             }
@@ -115,7 +115,7 @@
         if (namespaceCount == 0) {
             return null;
         } else {
-            Map<String,String> namespaces = new HashMap<String,String>();
+            Map<String,String> namespaces = new HashMap<>();
             for (int i=0; i<namespaceCount; i++) {
                 namespaces.put(Strings.nullToEmpty(reader.getNamespacePrefix(i)), reader.getNamespaceURI(i));
             }
diff --git a/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLSubject.java b/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLSubject.java
index 87af306..56f4b72 100644
--- a/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLSubject.java
+++ b/testing/xml-truth/src/main/java/org/apache/axiom/truth/xml/XMLSubject.java
@@ -315,7 +315,7 @@
                 }
             };
         }
-        final Set<Event> ignoredEvents = new HashSet<Event>();
+        final Set<Event> ignoredEvents = new HashSet<>();
         if (ignoreComments) {
             ignoredEvents.add(Event.COMMENT);
         }
@@ -370,7 +370,7 @@
     }
     
     private static Map<QName,String> extractPrefixes(Set<QName> qnames) {
-        Map<QName,String> result = new HashMap<QName,String>();
+        Map<QName,String> result = new HashMap<>();
         for (QName qname : qnames) {
             result.put(qname, qname.getPrefix());
         }