Added more unit-tests, updated API
diff --git a/tools/org.eclipse.persistence.tools.mapping.tests/.classpath b/tools/org.eclipse.persistence.tools.mapping.tests/.classpath
index 6afa455..47e8b8b 100644
--- a/tools/org.eclipse.persistence.tools.mapping.tests/.classpath
+++ b/tools/org.eclipse.persistence.tools.mapping.tests/.classpath
@@ -2,7 +2,6 @@
 <classpath>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="src" path="src"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.persistence.tools.mapping"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="output" path="build/classes"/>
 </classpath>
diff --git a/tools/org.eclipse.persistence.tools.mapping.tests/META-INF/MANIFEST.MF b/tools/org.eclipse.persistence.tools.mapping.tests/META-INF/MANIFEST.MF
index 750bd56..a935f52 100644
--- a/tools/org.eclipse.persistence.tools.mapping.tests/META-INF/MANIFEST.MF
+++ b/tools/org.eclipse.persistence.tools.mapping.tests/META-INF/MANIFEST.MF
@@ -5,6 +5,8 @@
 Bundle-Version: 2.6.0.qualifier
 Bundle-Vendor: Eclipse.org - EclipseLink Project
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Require-Bundle: org.eclipse.persistence.tools.mapping;bundle-version="[2.6.0,2.7.0)",
+Require-Bundle: javax.persistence;bundle-version="2.0.0",
+ org.eclipse.persistence.core;bundle-version="2.4.0",
+ org.eclipse.persistence.tools.mapping;bundle-version="[2.6.0,2.7.0)",
  org.eclipse.persistence.tools.utility;bundle-version="[2.6.0,2.7.0)",
  org.junit;bundle-version="[4.8.1,5.0.0)"
diff --git a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/AbstractExternalFormTests.java b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/AbstractExternalFormTests.java
index 953973c..3925704 100644
--- a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/AbstractExternalFormTests.java
+++ b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/AbstractExternalFormTests.java
@@ -26,23 +26,24 @@
 import static org.junit.Assert.*;
 
 /**
- * This test defines the behavior to test the manipulation of an XML document through an SPI.
+ * This test defines the behavior to test the manipulation of an XML document through the Mapping SPI.
  *
  * @version 2.6
  */
 @SuppressWarnings("nls")
-public abstract class AbstractExternalFormTests<T extends ExternalForm> {
+public abstract class AbstractExternalFormTests<FORM extends ExternalForm> {
 
 	/**
 	 * Populates the given tester with the appropriate {@link NodeTester}.
 	 *
-	 * @param tester The tester of the node to test
+	 * @param tester The {@link RootNodeTester} is used to adds the appropriate testers to test the
+	 * property of a node; i.e. its attributes and child nodes
 	 */
-	protected abstract void populate(RootNodeTester<T> tester);
+	protected abstract void populate(RootNodeTester<FORM> tester);
 
 	/**
-	 * Performs the actual tests on the document for a particular node that is being manipulated by
-	 * an {@link ExternalForm}.
+	 * Performs the actual tests on the XML document for a particular node that is being manipulated
+	 * by an {@link ExternalForm}.
 	 */
 	@Test
 	public final void test() throws Exception {
@@ -52,18 +53,105 @@
 	}
 
 	/**
-	 * An <code>AttributeNodeTester</code> tests setting and retrieving the value associated with
-	 * an element's attribute.
+	 * This controller simply asks its runner to add the attribute node.
 	 */
-	public interface AttributeNodeTester<T, VALUE> extends PropertyTester<T, VALUE> {
+	private class AttributeNodeRunnerAddingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void log() {
+			System.out.println("<" + runner.parentNodeName + " " + runner.tester.getNodeName() + "=\"\"> : addition");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			AttributeNodeTesterRunner runner = (AttributeNodeTesterRunner) this.runner;
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.testInitialState(form, node);
+			runner.testAdding(form, node);
+
+			currentChildrenCount = runner.currentChildrenCount;
+		}
 	}
 
 	/**
-	 * An <code>AttributeNodeTesterRunner</code> tests setting and retrieving the value associated
-	 * with an element's attribute.
+	 * This controller simply asks its runner to reading the attribute node.
+	 */
+	private class AttributeNodeRunnerReadingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void log() {
+			System.out.println("<" + runner.parentNodeName + " " + runner.tester.getNodeName() + "=\"\"> : reading");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			AttributeNodeTesterRunner runner = (AttributeNodeTesterRunner) this.runner;
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.testInitialState(form, node);
+			runner.testReading(form, node);
+
+			currentChildrenCount = runner.currentChildrenCount;
+		}
+	}
+
+	/**
+	 * This controller simply asks its runner to removing the attribute node.
+	 */
+	private class AttributeNodeRunnerRemovingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void log() {
+			System.out.println("<" + runner.parentNodeName + " " + runner.tester.getNodeName() + "=\"\"> : removing");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			AttributeNodeTesterRunner runner = (AttributeNodeTesterRunner) this.runner;
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.testInitialState(form, node);
+			runner.testRemoving(form, node);
+
+			currentChildrenCount = runner.currentChildrenCount;
+		}
+	}
+
+	/**
+	 * An <code>AttributeNodeTester</code> tests manipulating an element's attribute.
 	 * <p>
 	 * <div nowrap>Form: <code><b>&lt;nodeName attributeName="value"/&gt;</b></div>
 	 */
+	public interface AttributeNodeTester<FORM extends ExternalForm, VALUE> extends PropertyTester<FORM, VALUE> {
+	}
+
+	/**
+	 * The runner associated with {@link AttributeNodeTester}.
+	 *
+	 * <div nowrap>Form: <code><b>&lt;node_name attribute="value"/&gt</b></code>.</div>
+	 */
 	private class AttributeNodeTesterRunner extends PropertyNodeTesterRunner {
 
 		/**
@@ -71,7 +159,7 @@
 		 *
 		 * @param tester This object defines a single node to test an attribute node
 		 */
-		AttributeNodeTesterRunner(AttributeNodeTester<T, ?> tester) {
+		AttributeNodeTesterRunner(AttributeNodeTester<FORM, ?> tester) {
 			super(tester);
 		}
 
@@ -108,6 +196,735 @@
 		}
 	}
 
+	/**
+	 * This controller simply asks its runner to add or remove a child node.
+	 */
+	private class BooleanChildNodeRunnerAddingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void log() {
+			System.out.println("<" + runner.parentNodeName + "><" + runner.tester.getNodeName() + ">> : addition");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			BooleanChildNodeTesterRunner runner = (BooleanChildNodeTesterRunner) this.runner;
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.testInitialState(form, node);
+			runner.testAdding(form, node);
+
+			currentChildrenCount = runner.currentChildrenCount;
+		}
+	}
+
+	/**
+	 * This controller simply asks its runner to read if a child node is present or not.
+	 */
+	private class BooleanChildNodeRunnerReadingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void log() {
+			System.out.println("<" + runner.parentNodeName + "><" + runner.tester.getNodeName() + ">> : reading");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			BooleanChildNodeTesterRunner runner = (BooleanChildNodeTesterRunner) this.runner;
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.testInitialState(form, node);
+			runner.testReading(form, node);
+
+			currentChildrenCount = runner.currentChildrenCount;
+		}
+	}
+
+	/**
+	 * This controller simply asks its runner to removing the child node.
+	 */
+	private class BooleanChildNodeRunnerRemovingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void log() {
+			System.out.println("<" + runner.parentNodeName + "><" + runner.tester.getNodeName() + ">> : removing");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			BooleanChildNodeTesterRunner runner = (BooleanChildNodeTesterRunner) this.runner;
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.testInitialState(form, node);
+			runner.testRemoving(form, node);
+
+			currentChildrenCount = runner.currentChildrenCount;
+		}
+	}
+
+	/**
+	 * This <code>BooleanChildNodeTester</code> tests when a form add or remove a single child node.
+	 */
+	public interface BooleanChildNodeTester<FORM extends ExternalForm> extends NodeTester<FORM, Boolean> {
+
+		/**
+		 * Retrieves the {@link ExternalForm} representing the single child node.
+		 *
+		 * @param form The external form being tested
+		 * @return The {@link ExternalForm} representing the child node
+		 */
+		boolean getValue(FORM form);
+
+		/**
+		 * Adds the single child node to the node represented by the given form.
+		 *
+		 * @param form The external form being tested
+		 */
+		void setValue(FORM form, boolean value);
+	}
+
+	/**
+	 * The runner associated with {@link BooleanChildNodeTester}.
+	 */
+	private class BooleanChildNodeTesterRunner extends NodeTesterRunner {
+
+		/**
+		 *
+		 */
+		private boolean hasChild;
+
+		/**
+		 * Creates a new <code>BooleanChildNodeTesterRunner</code>.
+		 *
+		 * @param tester This object defines a single child node to test
+		 */
+		BooleanChildNodeTesterRunner(BooleanChildNodeTester<FORM> tester) {
+			super(tester);
+		}
+
+		private String displayString() {
+			return "<" + getNodeName() + ">";
+		}
+
+		private Node getChildNode(Node node) {
+
+			node = node.getFirstChild();
+
+			while (node != null) {
+
+				if (getNodeName().equals(node.getNodeName())) {
+					return node;
+				}
+
+				node = node.getNextSibling();
+			}
+
+			return null;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		boolean isMultipleSupported() {
+			return false;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testAdding(FORM form, Node node) {
+
+			// Don't add the child if it's not present
+			if (hasChild) {
+				return;
+			}
+
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings({"rawtypes", "unchecked"})
+		void testInitialState(FORM form, Node node) {
+
+			BooleanChildNodeTester<FORM> tester = (BooleanChildNodeTester) this.tester;
+
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testReading(FORM form, Node node) {
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testRemoving(FORM form, Node node) {
+
+			// Nothing to remove
+			if (!hasChild) {
+				return;
+			}
+
+		}
+	}
+
+	/**
+	 * This controller simply asks its runner to add the attribute node.
+	 */
+	private class ChildAttributeRunnerAddingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void log() {
+			ChildAttributeTesterRunner runner = (ChildAttributeTesterRunner) this.runner;
+			System.out.println("<" + runner.parentNodeName + "><" + runner.getChildNodeName() + " " + runner.tester.getNodeName() + "=\"\">> : adding");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			ChildAttributeTesterRunner runner = (ChildAttributeTesterRunner) this.runner;
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.testInitialState(form, node);
+			runner.testAdding(form, node);
+
+			currentChildrenCount = runner.currentChildrenCount;
+		}
+	}
+
+	/**
+	 * This controller simply asks its runner to reading the attribute node.
+	 */
+	private class ChildAttributeRunnerReadingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void log() {
+			ChildAttributeTesterRunner runner = (ChildAttributeTesterRunner) this.runner;
+			System.out.println("<" + runner.parentNodeName + "><" + runner.getChildNodeName() + " " + runner.tester.getNodeName() + "=\"\">> : reading");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			ChildAttributeTesterRunner runner = (ChildAttributeTesterRunner) this.runner;
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.testInitialState(form, node);
+			runner.testReading(form, node);
+
+			currentChildrenCount = runner.currentChildrenCount;
+		}
+	}
+
+	/**
+	 * This controller simply asks its runner to removing the attribute node.
+	 */
+	private class ChildAttributeRunnerRemovingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void log() {
+			ChildAttributeTesterRunner runner = (ChildAttributeTesterRunner) this.runner;
+			System.out.println("<" + runner.parentNodeName + "><" + runner.getChildNodeName() + " " + runner.tester.getNodeName() + "=\"\">> : removing");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			ChildAttributeTesterRunner runner = (ChildAttributeTesterRunner) this.runner;
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.testInitialState(form, node);
+			runner.testRemoving(form, node);
+
+			currentChildrenCount = runner.currentChildrenCount;
+		}
+	}
+
+	/**
+	 * An <code>AttributeNodeTester</code> tests manipulating an element's attribute.
+	 * <p>
+	 * <div nowrap>Form: <code><b>&lt;nodeName attributeName="value"/&gt;</b></div>
+	 */
+	public interface ChildAttributeTester<FORM extends ExternalForm, VALUE> extends PropertyTester<FORM, VALUE> {
+
+		/**
+		 *
+		 */
+		String getChildNodeName();
+	}
+
+	private class ChildAttributeTesterRunner extends NodeTesterRunner {
+
+		/**
+		 * Keeps track of the status of the node's existence.
+		 */
+		private boolean nodeExists;
+
+		/**
+		 * Creates a new <code>ChildAttributeTesterRunner</code>.
+		 *
+		 * @param tester This object defines a single node to test a child text node
+		 */
+		ChildAttributeTesterRunner(ChildAttributeTester<FORM, ?> tester) {
+			super(tester);
+		}
+
+		private String displayString() {
+			return "<" + parentNodeName + "><" + getChildNodeName() + " " + tester.getNodeName() + "=\"\">";
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		String getActualNodeName() {
+			return getChildNodeName();
+		}
+
+		private Node getChildNode(Node node) {
+
+			node = node.getFirstChild();
+
+			while (node != null) {
+
+				if (getChildNodeName().equals(node.getNodeName())) {
+					return node;
+				}
+
+				node = node.getNextSibling();
+			}
+
+			return null;
+		}
+
+		private String getChildNodeName() {
+			return ((ChildAttributeTester<FORM, ?>) tester).getChildNodeName();
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		boolean isMultipleSupported() {
+			return false;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testAdding(FORM form, Node parentNode) {
+
+			ChildAttributeTester<FORM, Object> tester = (ChildAttributeTester<FORM, Object>) this.tester;
+
+			//
+			// Test 1
+			//
+			// Change the node value to null
+			tester.setValue(form, null);
+
+			if (nodeExists) {
+				currentChildrenCount--;
+				nodeExists = false;
+			}
+
+			assertEquals(
+				displayString() + " : The element should not have any children",
+				currentChildrenCount,
+				parentNode.getChildNodes().getLength()
+			);
+
+			// Make sure the value retrieved is null
+			Object result = tester.getValue(form);
+
+			assertNull(
+				displayString() + " : The element's value should be null",
+				result
+			);
+
+			// Make sure nothing changed
+			assertEquals(
+				displayString() + " : The element should not have any children",
+				currentChildrenCount,
+				parentNode.getChildNodes().getLength()
+			);
+
+			//
+			// Test 2
+			//
+			// Change the value to something
+			Object expectedValue1 = tester.getValue1();
+
+			assertNotNull(
+				displayString() + " : Value 1 cannot be null",
+				expectedValue1
+			);
+
+			tester.setValue(form, expectedValue1);
+
+			if (!nodeExists) {
+				nodeExists = true;
+				currentChildrenCount++;
+			}
+
+			// The child node should have been added
+			assertEquals(
+				displayString() + " : The number of children is inconsistent",
+				currentChildrenCount,
+				parentNode.getChildNodes().getLength()
+			);
+
+			Node childNode = getChildNode(parentNode);
+
+			assertNotNull(
+				displayString() + " : The child node was not added correctly",
+				childNode
+			);
+
+			assertEquals(
+				displayString() + " : The number of attributes is inconsistent",
+				1,
+				childNode.getAttributes().getLength()
+			);
+
+			// Test the attribute's value
+			Node attribute = childNode.getAttributes().getNamedItem(tester.getNodeName());
+
+			assertNotNull(
+				displayString() + " : The attribute was not added correctly",
+				attribute
+			);
+
+			String stringExpectedValue = tester.toString(expectedValue1);
+
+			assertEquals(
+				displayString() + " : The attribute's value was not set correctly",
+				stringExpectedValue,
+				attribute.getNodeValue()
+			);
+
+			// Get the value
+			result = tester.getValue(form);
+
+			assertNotNull(
+				displayString() + " : The element's value was not set correctly",
+				result
+			);
+
+			// Get the value directly
+			String stringResult = tester.toString(result);
+
+			assertEquals(
+				displayString() + " : The value was not set correctly",
+				stringExpectedValue,
+				stringResult
+			);
+
+			//
+			// Test 3
+			//
+			// Change the value to something else
+			Object expectedValue2 = tester.getValue2();
+
+			assertNotNull(
+				displayString() + " : Value 2 cannot be null",
+				expectedValue2
+			);
+
+			assertNotSame(
+				displayString() + " : Value 1 and value 2 cannot be the same",
+				expectedValue1,
+				expectedValue2
+			);
+
+			tester.setValue(form, expectedValue2);
+
+			// The number of children should not have changed
+			assertEquals(
+				displayString() + " : The number of children is inconsistent",
+				currentChildrenCount,
+				parentNode.getChildNodes().getLength()
+			);
+
+			childNode = getChildNode(parentNode);
+
+			assertNotNull(
+				displayString() + " : The child node was not added correctly",
+				childNode
+			);
+
+			assertEquals(
+				displayString() + " : The number of attributes is inconsistent",
+				1,
+				childNode.getAttributes().getLength()
+			);
+
+			// Test the attribute's value
+			attribute = childNode.getAttributes().getNamedItem(tester.getNodeName());
+
+			assertNotNull(
+				displayString() + " : The attribute was not added correctly",
+				attribute
+			);
+
+			stringExpectedValue = tester.toString(expectedValue2);
+
+			assertEquals(
+				displayString() + " : The attribute's value was not set correctly",
+				stringExpectedValue,
+				attribute.getNodeValue()
+			);
+
+			// Get the value
+			result = tester.getValue(form);
+
+			assertNotNull(
+				displayString() + " : The element's value was not set correctly",
+				result
+			);
+
+			// Get the value directly
+			stringResult = tester.toString(result);
+
+			assertEquals(
+				displayString() + " : The value was not set correctly",
+				stringExpectedValue,
+				stringResult
+			);
+
+			//
+			// Complete
+			//
+			// Change the value back to its original value
+			Object defaultValue = tester.getDefaultValue();
+
+			assertNotNull(
+				displayString() + " : The default value cannot be null",
+				defaultValue
+			);
+
+			tester.setValue(form, defaultValue);
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testInitialState(FORM form, Node parent) {
+
+			ChildAttributeTester<FORM, Object> tester = (ChildAttributeTester<FORM, Object>) this.tester;
+			nodeExists |= tester.doesNodeAlreadyExist();
+
+			// Node name
+			String nodeName = getNodeName();
+
+			assertNotNull(
+				displayString() + " : The child node's attribute name cannot be null",
+				nodeName
+			);
+
+			// Child node name
+			String childNodeName = getChildNodeName();
+
+			assertNotNull(
+				displayString() + " : The child node name cannot be null",
+				childNodeName
+			);
+
+			// Test the initial state of the parent node
+			assertEquals(
+				displayString() + " : The number of children is incorrect",
+				currentChildrenCount,
+				parent.getChildNodes().getLength()
+			);
+
+			// The child node should either not exist or already being present
+			Node childNode = getChildNode(parent);
+
+			if (!nodeExists) {
+				assertNull(
+					displayString() + " : The node should be null",
+					childNode
+				);
+			}
+			else {
+				assertNotNull(
+					displayString() + " : The node should not be null",
+					childNode
+				);
+
+				Node attribute = childNode.getAttributes().getNamedItem(tester.getNodeName());
+
+				assertNotNull(
+					displayString() + " : The attribute was not added correctly",
+					attribute
+				);
+
+				Object defaultValue = tester.getDefaultValue();
+
+				assertNotNull(
+					displayString() + " : The default value cannot be null",
+					defaultValue
+				);
+
+				String stringDefaultValue = tester.toString(defaultValue);
+
+				assertEquals(
+					displayString() + " : The attribute's value was not set correctly",
+					stringDefaultValue,
+					attribute.getNodeValue()
+				);
+			}
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testReading(FORM form, Node node) {
+
+			ChildAttributeTester<FORM, Object> tester = (ChildAttributeTester<FORM, Object>) this.tester;
+
+			// The node value should either be null or not null
+			Object result = tester.getValue(form);
+
+			// Make sure the node's value is not null
+			if (nodeExists) {
+
+				assertNotNull(
+					displayString() + " : The element's value should not be null",
+					result
+				);
+
+				assertSame(
+					displayString() + " : The element's value was not retrived correctly",
+					tester.getDefaultValue(),
+					result
+				);
+			}
+			// The node is not present, make sure reading its value returns null
+			else {
+				assertNull(
+					displayString() + " : The element's value should be null",
+					result
+				);
+			}
+
+			// Make sure nothing changed by reading the node's value
+			assertEquals(
+				displayString() + " : The element should not have any children",
+				currentChildrenCount,
+				node.getChildNodes().getLength()
+			);
+
+			// Retrieve the actual node
+			Node childNode = getChildNode(node);
+
+			if (nodeExists) {
+
+				assertNotNull(
+					displayString() + " : The node should not be null",
+					childNode
+				);
+
+				Node attribute = childNode.getAttributes().getNamedItem(tester.getNodeName());
+
+				assertNotNull(
+					displayString() + " : The attribute should not be null",
+					attribute
+				);
+			}
+			else {
+				assertNull(
+					displayString() + " : The node should be null",
+					childNode
+				);
+			}
+
+			// Make sure nothing changed after retrieving the node
+			assertEquals(
+				displayString() + " : The element should not have any children",
+				currentChildrenCount,
+				node.getChildNodes().getLength()
+			);
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testRemoving(FORM form, Node parentNode) {
+
+			PropertyTester<FORM, Object> tester = (PropertyTester<FORM, Object>) this.tester;
+
+			// Change the node value to null, which will remove it from the parent node
+			tester.setValue(form, null);
+
+			if (nodeExists) {
+				nodeExists = false;
+				currentChildrenCount--;
+			}
+
+			assertEquals(
+				displayString() + " : The number of children is inconsistent",
+				currentChildrenCount,
+				parentNode.getChildNodes().getLength()
+			);
+		}
+	}
+
+	/**
+	 * This controller tests adding a random portion of child nodes.
+	 */
 	private class ChildListNodeRunnerAddingController extends Controller {
 
 		/**
@@ -123,7 +940,7 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void test(T form, Node node) {
+		void test(FORM form, Node node) {
 
 			ChildListNodeTesterRunner runner = (ChildListNodeTesterRunner) this.runner;
 
@@ -150,6 +967,9 @@
 		}
 	}
 
+	/**
+	 * This controller tests reading a random portion of child nodes.
+	 */
 	private class ChildListNodeRunnerReadingController extends Controller {
 
 		/**
@@ -157,7 +977,7 @@
 		 */
 		@Override
 		void log() {
-			System.out.println("<" + runner.parentNodeName + "><" + runner.tester.getNodeName() + "*> : read");
+			System.out.println("<" + runner.parentNodeName + "><" + runner.tester.getNodeName() + "*> : reading");
 		}
 
 		/**
@@ -165,7 +985,7 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void test(T form, Node node) {
+		void test(FORM form, Node node) {
 
 			ChildListNodeTesterRunner runner = (ChildListNodeTesterRunner) this.runner;
 			int rangesCount = runner.ranges.size();
@@ -183,11 +1003,12 @@
 			runner.currentChildrenCount = currentChildrenCount;
 			runner.testInitialState(form, node);
 			runner.testReading(form, node);
-
-			currentChildrenCount = runner.currentChildrenCount;
 		}
 	}
 
+	/**
+	 * This controller tests removing a random portion of child nodes.
+	 */
 	private class ChildListNodeRunnerRemovingController extends Controller {
 
 		/**
@@ -203,7 +1024,7 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void test(T form, Node node) {
+		void test(FORM form, Node node) {
 
 			ChildListNodeTesterRunner runner = (ChildListNodeTesterRunner) this.runner;
 			int rangesCount = runner.ranges.size();
@@ -230,7 +1051,7 @@
 	 * This <code>ChildListNodeTester</code> tests a form when the node it represents can have zero
 	 * or many child nodes of the same type (i.e. with the same node name).
 	 */
-	public interface ChildListNodeTester<T, VALUE, CHILD_VALUE> extends NodeTester<T, VALUE> {
+	public interface ChildListNodeTester<FORM extends ExternalForm, CHILD_FORM, CHILD_VALUE> extends NodeTester<FORM, CHILD_FORM> {
 
 		/**
 		 * Adds a new child node to the node represented by the given form.
@@ -240,7 +1061,7 @@
 		 * @return The external form representing the child node that was added to the node represented
 		 * by the given form
 		 */
-		VALUE addChild(T form, CHILD_VALUE value);
+		CHILD_FORM addChild(FORM form, CHILD_VALUE value);
 
 		/**
 		 * Returns the child node from the node represented by the given form at the given position.
@@ -249,7 +1070,16 @@
 		 * @param index The position of the child node to retrieve
 		 * @return The external form representing the child node at the given position
 		 */
-		VALUE getChild(T form, int index);
+		CHILD_FORM getChild(FORM form, int index);
+
+		/**
+		 * Returns
+		 *
+		 * @param childForms
+		 * @param index
+		 * @return
+		 */
+		CHILD_FORM getChildForm(List<CHILD_FORM> childForms, int index);
 
 		/**
 		 * Returns a list of the children node with the same type (i.e. with the same node name) that
@@ -258,7 +1088,7 @@
 		 * @param form The external form being tested
 		 * @return An ordered list based on the sequence of children node
 		 */
-		List<VALUE> getChildren(T form);
+		List<CHILD_FORM> getChildren(FORM form);
 
 		/**
 		 * Returns the number of children of the node represented by the given form with the same type
@@ -267,7 +1097,7 @@
 		 * @param form The external form being tested
 		 * @return The count of children of the same type
 		 */
-		int getChildrenSize(T form);
+		int getChildrenSize(FORM form);
 
 		/**
 		 * Returns the value that part of the list ({@link #getChildValues()}) and that was used to
@@ -276,7 +1106,12 @@
 		 * @param childForm The child form from which the value used to create it should be returned
 		 * @return The value retrieved from the child node
 		 */
-		CHILD_VALUE getChildValue(VALUE childForm);
+		CHILD_VALUE getChildValue(CHILD_FORM childForm);
+
+		/**
+		 *
+		 */
+		CHILD_VALUE getExpectedChildValue(int index);
 
 		/**
 		 * Returns a list of values that will be used to create children of the node represented by
@@ -284,7 +1119,14 @@
 		 *
 		 * @return A list of values, which should have more than 1 item
 		 */
-		List<CHILD_VALUE> getChildValues();
+		List<CHILD_VALUE> getExpectedChildValues();
+
+		/**
+		 * Returns
+		 *
+		 * @return
+		 */
+		List<String> getNodeNames();
 
 		/**
 		 * Removes the child node from the node represented by the given form.
@@ -293,14 +1135,15 @@
 		 * @param index The position of the child node within the list of children of the same type
 		 * (i.e. with the same node name)
 		 */
-		void removeChild(T form, int index);
+		void removeChild(FORM form, int index);
 	}
 
 	/**
-	 * A <code>ChildListNodeTesterRunner</code> TODO.
+	 * The runner associated with {@link ChildListNodeTester}.
 	 */
 	private class ChildListNodeTesterRunner extends NodeTesterRunner {
 
+		ContainerNodeRetriever containerNodeRetriever;
 		int currentChildListCount;
 		int rangeIndex;
 		List<Integer[]> ranges;
@@ -310,7 +1153,7 @@
 		 *
 		 * @param tester This object defines a single child node to test
 		 */
-		ChildListNodeTesterRunner(ChildListNodeTester<T, ?, ?> tester) {
+		ChildListNodeTesterRunner(ChildListNodeTester<FORM, ?, ?> tester) {
 			super(tester);
 			initialize(tester);
 		}
@@ -319,18 +1162,31 @@
 			ranges.add(new Integer[] { Math.min(startIndex, endIndex), Math.max(startIndex, endIndex) });
 		}
 
+		private ContainerNodeRetriever buildContainerNodeRetriever() {
+			return new ContainerNodeRetriever() {
+				@Override
+				public Node getContainerNode(Node parent) {
+					return parent;
+				}
+			};
+		}
+
 		private String displayString() {
 			return "<" + getNodeName() + ">";
 		}
 
+		@SuppressWarnings("unchecked")
 		private List<Node> getChildrenNodes(Node node) {
 
-			node = node.getFirstChild();
+			ChildListNodeTester<FORM, Object, Object> tester = (ChildListNodeTester<FORM, Object, Object>) this.tester;
+			List<String> nodeNames = tester.getNodeNames();
+
 			List<Node> children = new ArrayList<Node>();
+			node = node.getFirstChild();
 
 			while (node != null) {
 
-				if (getNodeName().equals(node.getNodeName())) {
+				if (nodeNames.contains(node.getNodeName())) {
 					children.add(node);
 				}
 
@@ -340,17 +1196,39 @@
 			return children;
 		}
 
-		@SuppressWarnings("unchecked")
-		int getDefaultChildrenCount() {
-			ChildListNodeTester<T, Object, Object> tester = (ChildListNodeTester<T, Object, Object>) this.tester;
-			return tester.getChildValues().size();
+		private Node getContainerNode(Node parent) {
+			return containerNodeRetriever.getContainerNode(parent);
 		}
 
-		private void initialize(ChildListNodeTester<T, ?, ?> tester) {
+		@SuppressWarnings("unchecked")
+		int getDefaultChildrenCount() {
+			ChildListNodeTester<FORM, Object, Object> tester = (ChildListNodeTester<FORM, Object, Object>) this.tester;
+			return tester.getExpectedChildValues().size();
+		}
+
+		private int getNodePositionOfInsertion(Node node, List<String> nodeNames) {
+
+			String nodeName = node.getNodeName();
+
+			for (int index = 0, count = nodeNames.size(); index < count; index++) {
+
+				String name = nodeNames.get(index);
+
+				if (name.equals(nodeName)) {
+					return index;
+				}
+			}
+
+			fail("The child node named <" + nodeName + "> is not included into the test");
+			return -1;
+		}
+
+		private void initialize(ChildListNodeTester<FORM, ?, ?> tester) {
 
 			ranges = new ArrayList<Integer[]>();
+			containerNodeRetriever = buildContainerNodeRetriever();
 
-			List<?> childValues = tester.getChildValues();
+			List<?> childValues = tester.getExpectedChildValues();
 
 			if (!childValues.isEmpty()) {
 				assertTrue(
@@ -368,13 +1246,17 @@
 			return true;
 		}
 
+		void setup() {
+			rangeIndex = ranges.size();
+			ranges.add(new Integer[] { 0, getDefaultChildrenCount() });
+		}
+
 		/**
 		 * {@inheritDoc}
 		 */
 		@Override
-		void test(T form, Node node) {
-			rangeIndex = ranges.size();
-			ranges.add(new Integer[] { 0, getDefaultChildrenCount() });
+		void test(FORM form, Node node) {
+			setup();
 			super.test(form, node);
 		}
 
@@ -383,19 +1265,26 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void testAdding(T form, Node parent) {
+		void testAdding(FORM form, Node parent) {
 
-			ChildListNodeTester<T, Object, Object> tester = (ChildListNodeTester<T, Object, Object>) this.tester;
+			ChildListNodeTester<FORM, Object, Object> tester = (ChildListNodeTester<FORM, Object, Object>) this.tester;
+			List<String> nodeNames = tester.getNodeNames();
+			List<Object> values = tester.getExpectedChildValues();
 
-			// Retrieve the values that will be used to create the child nodes
-			List<Object> values = tester.getChildValues();
+			// Retrieve the range within the list of values
+			// that will be used to create the children
 			Integer[] range = ranges.get(rangeIndex);
 
 			// Create each child node
 			for (int index = range[0]; index < range[1]; index++) {
 
+				// Retrieve the child value that will be used to create a child
 				Object value = values.get(index);
-				assertNotNull("The child value cannot be null", value);
+
+				assertNotNull(
+					displayString() + " : The child value cannot be null",
+					value
+				);
 
 				// Create the child node
 				Object childForm = tester.addChild(form, value);
@@ -409,7 +1298,8 @@
 
 				// Retrieve the list of child nodes and make sure it matches
 				// the number of child nodes that have been created so far
-				List<Node> childrenNode = getChildrenNodes(parent);
+				Node containerNode = getContainerNode(parent);
+				List<Node> childrenNode = getChildrenNodes(containerNode);
 
 				assertEquals(
 					displayString() + " : The child node was not created correctly",
@@ -421,8 +1311,13 @@
 				assertEquals(
 					"The child node was not created correctly",
 					currentChildrenCount,
-					parent.getChildNodes().getLength()
+					containerNode.getChildNodes().getLength()
 				);
+
+				// Now make sure the order is kept
+				if (nodeNames.size() > 1) {
+					testOrdinalPosition(containerNode, nodeNames);
+				}
 			}
 		}
 
@@ -431,9 +1326,9 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void testInitialState(T form, Node parent) {
+		void testInitialState(FORM form, Node parent) {
 
-			ChildListNodeTester<T, Object, Object> tester = (ChildListNodeTester<T, Object, Object>) this.tester;
+			ChildListNodeTester<FORM, Object, Object> tester = (ChildListNodeTester<FORM, Object, Object>) this.tester;
 
 			assertEquals(
 				displayString() + " : Incorrect number of children was retrieved",
@@ -449,11 +1344,51 @@
 			);
 
 			// Make sure nothing changed
-			assertEquals(
-				displayString() + " : The number of children is inconsistent",
-				currentChildrenCount,
-				parent.getChildNodes().getLength()
-			);
+			Node containerNode = getContainerNode(parent);
+
+			if (containerNode == null) {
+				assertEquals(
+					displayString() + " : The number of children is inconsistent",
+					0,
+					currentChildrenCount
+				);
+			}
+			else {
+				assertEquals(
+					displayString() + " : The number of children is inconsistent",
+					currentChildrenCount,
+					containerNode.getChildNodes().getLength()
+				);
+			}
+		}
+
+		private void testOrdinalPosition(Node containerNode, List<String> nodeNames) {
+
+			Node childNode = containerNode.getFirstChild();
+
+			if (childNode != null) {
+
+				List<Integer> nodePositions = new ArrayList<Integer>();
+
+				do {
+					int nodePosition = getNodePositionOfInsertion(childNode, nodeNames);
+					nodePositions.add(nodePosition);
+					childNode = childNode.getNextSibling();
+				}
+				while (childNode != null);
+
+				// Make sure the ordinal numbers are from the smaller number to the biggest number
+				int previousPosition = -1;
+
+				for (int nodePosition : nodePositions) {
+
+					if (previousPosition > nodePosition) {
+						fail("The insertion was not performed following the ordering.");
+					}
+
+					previousPosition = nodePosition;
+				}
+			}
 		}
 
 		/**
@@ -461,10 +1396,9 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void testReading(T form, Node node) {
+		void testReading(FORM form, Node node) {
 
-			ChildListNodeTester<T, Object, Object> tester = (ChildListNodeTester<T, Object, Object>) this.tester;
-			List<Object> values = tester.getChildValues();
+			ChildListNodeTester<FORM, Object, Object> tester = (ChildListNodeTester<FORM, Object, Object>) this.tester;
 			List<Object> childForms = tester.getChildren(form);
 
 			assertEquals(
@@ -481,7 +1415,7 @@
 				// Translate the position to the actual position within the list of children
 				int translatedPosition = translatePosition(rangeIndex, index);
 
-				// Retrieve the child
+				// Retrieve the child form
 				Object childForm = tester.getChild(form, translatedPosition);
 
 				assertNotNull(
@@ -491,7 +1425,9 @@
 
 				// Retrieve the child value from the child form
 				Object childValue = tester.getChildValue(childForm);
-				Object expectedChildValue = values.get(index);
+
+				// Retrieve the value that was used to create the child
+				Object expectedChildValue = tester.getExpectedChildValue(index);
 
 				assertEquals(
 					displayString() + " : The child value was not retrieved correctly",
@@ -499,8 +1435,8 @@
 					childValue
 				);
 
-				// Retrieve the child
-				childForm = childForms.get(translatedPosition);
+				// Retrieve the child from the list of child forms
+				childForm = tester.getChildForm(childForms, translatedPosition);
 
 				assertNotNull(
 					displayString() + " : The child form cannot be null",
@@ -544,7 +1480,7 @@
 
 				// Retrieve the child value from the child form
 				Object childValue = tester.getChildValue(childForm);
-				Object expectedChildValue = values.get(index);
+				Object expectedChildValue = tester.getExpectedChildValue(index);
 
 				// Now retrieve the translated position within the list of values
 				assertEquals(
@@ -554,7 +1490,7 @@
 				);
 
 				// Retrieve the child
-				childForm = childForms.get(translatedPosition);
+				childForm = tester.getChildForm(childForms, translatedPosition);
 
 				assertNotNull(
 					displayString() + " : The child form cannot be null",
@@ -572,8 +1508,8 @@
 			}
 		}
 
-		private void testReadingAfterRemoval(ChildListNodeTester<T, Object, Object> tester,
-		                                     T form,
+		private void testReadingAfterRemoval(ChildListNodeTester<FORM, Object, Object> tester,
+		                                     FORM form,
 		                                     List<Object> childForms,
 		                                     List<Object> values,
 		                                     int rangesIndexToSkip,
@@ -613,7 +1549,7 @@
 
 					// Retrieve the child value from the child form
 					Object childValue = tester.getChildValue(childForm);
-					Object expectedChildValue = values.get(rangeIndex);
+					Object expectedChildValue = tester.getExpectedChildValue(rangeIndex);
 
 					assertEquals(
 						displayString() + " : The child value was not retrieved correctly",
@@ -622,7 +1558,7 @@
 					);
 
 					// Retrieve the child
-					childForm = childForms.get(translatedPosition);
+					childForm = tester.getChildForm(childForms, translatedPosition);
 
 					assertNotNull(
 						displayString() + " : The child form cannot be null",
@@ -641,15 +1577,15 @@
 			}
 		}
 
-		private void testReadingAfterRemoval(ChildListNodeTester<T, Object, Object> tester,
-		                                     T form,
+		private void testReadingAfterRemoval(ChildListNodeTester<FORM, Object, Object> tester,
+		                                     FORM form,
 		                                     List<Object> childForms,
 		                                     List<Object> values,
 		                                     List<Integer> positions) {
 
 			int childIndex = 0;
 
-			for (Integer position : positions) {
+			for (int position : positions) {
 
 				// Retrieve the child form
 				Object childForm = tester.getChild(form, childIndex++);
@@ -661,7 +1597,7 @@
 
 				// Retrieve the child value from the child form
 				Object childValue = tester.getChildValue(childForm);
-				Object expectedChildValue = values.get(position);
+				Object expectedChildValue = tester.getExpectedChildValue(position);
 
 				assertEquals(
 					displayString() + " : The child value was not retrieved correctly",
@@ -676,16 +1612,16 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void testRemoving(T form, Node node) {
+		void testRemoving(FORM form, Node node) {
 
 			// Nothing to test
 			if (ranges.isEmpty()) {
 				return;
 			}
 
-			ChildListNodeTester<T, Object, Object> tester = (ChildListNodeTester<T, Object, Object>) this.tester;
+			ChildListNodeTester<FORM, Object, Object> tester = (ChildListNodeTester<FORM, Object, Object>) this.tester;
 			Random random = new Random();
-			List<Object> values = tester.getChildValues();
+			List<Object> values = tester.getExpectedChildValues();
 			List<Object> readOnlyChildForms = tester.getChildren(form);
 
 			// Now remove all the children at random position and
@@ -734,18 +1670,29 @@
 				//
 				// Test 1: Make sure only one node was removed
 				//
-				// Test to make sure the parent node has the right amount of children left
+				// Make sure the parent node has the right amount of children left
 				assertEquals(
 					displayString() + " : The number of children is inconsistent",
 					currentChildListCount,
 					tester.getChildrenSize(form)
 				);
 
-				assertEquals(
-					displayString() + " : The number of children is inconsistent",
-					currentChildrenCount,
-					node.getChildNodes().getLength()
-				);
+				Node containerNode = getContainerNode(node);
+
+				if (containerNode == null) {
+					assertEquals(
+						displayString() + " : The number of children is inconsistent",
+						0,
+						currentChildrenCount
+					);
+				}
+				else {
+					assertEquals(
+						displayString() + " : The number of children is inconsistent",
+						currentChildrenCount,
+						containerNode.getChildNodes().getLength()
+					);
+				}
 
 				// Retrieve the values that will be used to create the child nodes
 				List<Object> childForms = tester.getChildren(form);
@@ -776,23 +1723,23 @@
 			return translatePosition(endRangesIndex, rangeIndexToAdjust, -1);
 		}
 
-		private int translatePosition(final int endRangesIndex,
+		private int translatePosition(final int endRangeIndex,
 		                              final int rangeIndexToAdjust,
-		                              final int rangesIndexToSkip) {
+		                              final int rangeIndexToSkip) {
 
 			int translatedPosition = 0;
 
-			for (int rangesIndex = 0; rangesIndex <= endRangesIndex; rangesIndex++) {
+			for (int rangesIndex = 0; rangesIndex <= endRangeIndex; rangesIndex++) {
 
 				// Skip the specified range since work is being done with it
-				if (rangesIndex == rangesIndexToSkip) {
+				if (rangesIndex == rangeIndexToSkip) {
 					continue;
 				}
 
 				Integer[] range = ranges.get(rangesIndex);
 
 				// Quick calculation
-				if (rangesIndex != endRangesIndex) {
+				if (rangesIndex != endRangeIndex) {
 					translatedPosition += (range[1] - range[0]);
 				}
 				// Adjust the index within the range that ends the translation
@@ -805,6 +1752,9 @@
 		}
 	}
 
+	/**
+	 * This controller simply asks its runner to add the child node.
+	 */
 	private class ChildNodeRunnerAddingController extends Controller {
 
 		/**
@@ -820,7 +1770,7 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void test(T form, Node node) {
+		void test(FORM form, Node node) {
 
 			ChildNodeTesterRunner runner = (ChildNodeTesterRunner) this.runner;
 			runner.currentChildrenCount = currentChildrenCount;
@@ -831,6 +1781,9 @@
 		}
 	}
 
+	/**
+	 * This controller simply asks its runner to read the child node.
+	 */
 	private class ChildNodeRunnerReadingController extends Controller {
 
 		/**
@@ -846,17 +1799,18 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void test(T form, Node node) {
+		void test(FORM form, Node node) {
 
 			ChildNodeTesterRunner runner = (ChildNodeTesterRunner) this.runner;
 			runner.currentChildrenCount = currentChildrenCount;
 			runner.testInitialState(form, node);
 			runner.testReading(form, node);
-
-			currentChildrenCount = runner.currentChildrenCount;
 		}
 	}
 
+	/**
+	 * This controller simply asks its runner to remove the child node.
+	 */
 	private class ChildNodeRunnerRemovingController extends Controller {
 
 		/**
@@ -872,7 +1826,7 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void test(T form, Node node) {
+		void test(FORM form, Node node) {
 
 			ChildNodeTesterRunner runner = (ChildNodeTesterRunner) this.runner;
 			runner.currentChildrenCount = currentChildrenCount;
@@ -886,7 +1840,7 @@
 	/**
 	 * This <code>ChildNodeTester</code> tests when a form add or remove a single child node.
 	 */
-	public interface ChildNodeTester<T, VALUE extends ExternalForm> extends NodeTester<T, VALUE> {
+	public interface ChildNodeTester<FORM extends ExternalForm, VALUE extends ExternalForm> extends NodeTester<FORM, VALUE> {
 
 		/**
 		 * Adds the single child node to the node represented by the given form.
@@ -894,7 +1848,7 @@
 		 * @param form The external form being tested
 		 * @return The {@link ExternalForm} of the child node that was added
 		 */
-		VALUE addChild(T form);
+		VALUE addChild(FORM form);
 
 		/**
 		 * Retrieves the {@link ExternalForm} representing the single child node.
@@ -902,7 +1856,7 @@
 		 * @param form The external form being tested
 		 * @return The {@link ExternalForm} representing the child node
 		 */
-		VALUE getChild(T form);
+		VALUE getChild(FORM form);
 
 		/**
 		 * Determines whether the given form has a child node with the specific node name.
@@ -911,19 +1865,18 @@
 		 * @return <code>true</code> if the document has the single node as a child node of the node
 		 * for which the given form represents; <code>false</code> if the node does not exist
 		 */
-		boolean hasChild(T form);
+		boolean hasChild(FORM form);
 
 		/**
 		 * Removes the single child node from the node represented by the given form.
 		 *
 		 * @param form The external form being tested
 		 */
-		void removeChild(T form);
+		void removeChild(FORM form);
 	}
 
 	/**
-	 * A <code>ChildNodeTesterRunner</code> tests to make sure the single child node is added and
-	 * removed correctly from its parent node.
+	 * The runner associated with {@link ChildNodeTester}.
 	 */
 	private class ChildNodeTesterRunner extends NodeTesterRunner {
 
@@ -937,7 +1890,7 @@
 		 *
 		 * @param tester This object defines a single child node to test
 		 */
-		ChildNodeTesterRunner(ChildNodeTester<T, ?> tester) {
+		ChildNodeTesterRunner(ChildNodeTester<FORM, ?> tester) {
 			super(tester);
 		}
 
@@ -973,14 +1926,14 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testAdding(T form, Node node) {
+		void testAdding(FORM form, Node node) {
 
 			// Don't add the child if it's not present
 			if (hasChild) {
 				return;
 			}
 
-			ChildNodeTester<T, ? extends ExternalForm> tester = (ChildNodeTester<T, ?>) this.tester;
+			ChildNodeTester<FORM, ? extends ExternalForm> tester = (ChildNodeTester<FORM, ?>) this.tester;
 
 			// Add the child node
 			ExternalForm childForm = tester.addChild(form);
@@ -1023,9 +1976,9 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testInitialState(T form, Node node) {
+		void testInitialState(FORM form, Node node) {
 
-			ChildNodeTester<T, ?> tester = (ChildNodeTester<T, ?>) this.tester;
+			ChildNodeTester<FORM, ?> tester = (ChildNodeTester<FORM, ?>) this.tester;
 
 			// Make sure the child node does not exist
 			assertEquals(
@@ -1067,21 +2020,21 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testReading(T form, Node node) {
+		void testReading(FORM form, Node node) {
 		}
 
 		/**
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testRemoving(T form, Node node) {
+		void testRemoving(FORM form, Node node) {
 
 			// Nothing to remove
 			if (!hasChild) {
 				return;
 			}
 
-			ChildNodeTester<T, ?> tester = (ChildNodeTester<T, ?>) this.tester;
+			ChildNodeTester<FORM, ?> tester = (ChildNodeTester<FORM, ?>) this.tester;
 
 			// Make sure the child node exists
 			assertTrue(
@@ -1123,6 +2076,330 @@
 	}
 
 	/**
+	 * This controller tests adding a random portion of child nodes (which are owned by a container node).
+	 */
+	private class ContainerChildListNodeRunnerAddingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void log() {
+			ContainerChildListNodeTesterRunner runner = (ContainerChildListNodeTesterRunner) this.runner;
+			System.out.println("<" + runner.parentNodeName + "><" + runner.getContainerNodeName() + "> : addition");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			ContainerChildListNodeTesterRunner runner = (ContainerChildListNodeTesterRunner) this.runner;
+
+			// Create a random range within the list of values used to create the child nodes
+			Random random = new Random();
+			int count = runner.runner.getDefaultChildrenCount();
+
+			int startIndex = random.nextInt(count);
+			int endIndex = random.nextInt(count);
+
+			// Make sure the start and end indices are not the same
+			while (endIndex == startIndex) {
+				endIndex = random.nextInt(count);
+			}
+
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.runner.addRange(startIndex, endIndex);
+			runner.runner.rangeIndex = runner.runner.ranges.size() - 1;
+			runner.testInitialState(form, node);
+			runner.testAdding(form, node);
+			runner.testReading(form, node);
+
+			currentChildrenCount = runner.currentChildrenCount;
+		}
+	}
+
+	/**
+	 * This controller tests reading a random portion of child nodes (which are owned by a container node).
+	 */
+	private class ContainerChildListNodeRunnerReadingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void log() {
+			ContainerChildListNodeTesterRunner runner = (ContainerChildListNodeTesterRunner) this.runner;
+			System.out.println("<" + runner.parentNodeName + "><" + runner.getContainerNodeName() + "> : reading");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			ContainerChildListNodeTesterRunner runner = (ContainerChildListNodeTesterRunner) this.runner;
+			int rangesCount = runner.runner.ranges.size();
+
+			// Nothing to read
+			if (rangesCount == 0) {
+				return;
+			}
+
+			// Read a range randomly
+			Random random = new Random();
+			int rangeIndex = random.nextInt(rangesCount);
+			runner.runner.rangeIndex = rangeIndex;
+
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.testInitialState(form, node);
+			runner.testReading(form, node);
+		}
+	}
+
+	/**
+	 * This controller tests removing a random portion of child nodes (which are owned by a container node).
+	 */
+	private class ContainerChildListNodeRunnerRemovingController extends Controller {
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void log() {
+			ContainerChildListNodeTesterRunner runner = (ContainerChildListNodeTesterRunner) this.runner;
+			System.out.println("<" + runner.parentNodeName + "><" + runner.getContainerNodeName() + "> : removing");
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		@SuppressWarnings("unchecked")
+		void test(FORM form, Node node) {
+
+			ContainerChildListNodeTesterRunner runner = (ContainerChildListNodeTesterRunner) this.runner;
+			int rangesCount = runner.runner.ranges.size();
+
+			// Nothing to read
+			if (rangesCount == 0) {
+				return;
+			}
+
+			// Read a range randomly
+			Random random = new Random();
+			int rangeIndex = random.nextInt(rangesCount);
+			runner.runner.rangeIndex = rangeIndex;
+
+			runner.currentChildrenCount = currentChildrenCount;
+			runner.testInitialState(form, node);
+			runner.testRemoving(form, node);
+
+			currentChildrenCount = runner.currentChildrenCount;
+		}
+	}
+
+	/**
+	 * This <code>ContainerChildListNodeTester</code> tests a form when the node it represents can
+	 * have zero or many child nodes of the same type (i.e. with the same node name) that are
+	 * "wrapped" by a container node.
+	 */
+	public interface ContainerChildListNodeTester<FORM extends ExternalForm, CHILD_FORM, CHILD_VALUE> extends ChildListNodeTester<FORM, CHILD_FORM, CHILD_VALUE> {
+
+		/**
+		 * Returns the name of the container node which can contain zero or many nodes.
+		 *
+		 * @param containerNodeName The node that contains the child nodes added by the given tester
+		 */
+		String getContainerNodeName();
+	}
+
+	/**
+	 * This runner tests adding child nodes not directly to the parent node but to a container node.
+	 * <p>
+	 * Example:
+	 * <pre><code>&lt;parentNode&gt;
+	 *   &lt;containerNode&gt;
+	 *      &lt;child_1&gt;
+	 *      &lt;child_2&gt;
+	 *      ...
+	 *      &lt;child_n&gt;
+	 *   &lt;/containerNode&gt;
+	 *&lt;/parentNode&gt;</code></pre>
+	 */
+	private class ContainerChildListNodeTesterRunner extends NodeTesterRunner {
+
+		/**
+		 * This runner adds child nodes to a container node and not directly to the parent.
+		 */
+		private ChildListNodeTesterRunner runner;
+
+		/**
+		 * Creates a new <code>ContainerChildListNodeTesterRunner</code>.
+		 *
+		 * @param tester This runner adds child nodes to a container node and not directly to the parent
+		 */
+		ContainerChildListNodeTesterRunner(ContainerChildListNodeTester<FORM, ?, ?> tester) {
+			super(tester);
+			this.runner = new ChildListNodeTesterRunner(tester);
+			this.runner.containerNodeRetriever = buildContainerNodeRetreiver();
+		}
+
+		private ContainerNodeRetriever buildContainerNodeRetreiver() {
+			return new ContainerNodeRetriever() {
+				@Override
+				public Node getContainerNode(Node parent) {
+					return ContainerChildListNodeTesterRunner.this.getNode(parent);
+				}
+			};
+		}
+
+		private String displayString() {
+			return "<" + getContainerNodeName() + ">";
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		String getActualNodeName() {
+			return getContainerNodeName();
+		}
+
+		@SuppressWarnings("unchecked")
+		String getContainerNodeName() {
+			ContainerChildListNodeTester<FORM, ?, ?> tester = (ContainerChildListNodeTester<FORM, ?, ?>) this.tester;
+			return tester.getContainerNodeName();
+		}
+
+		private Node getNode(Node node) {
+
+			node = node.getFirstChild();
+
+			while (node != null) {
+
+				if (getContainerNodeName().equals(node.getNodeName())) {
+					return node;
+				}
+
+				node = node.getNextSibling();
+			}
+
+			return null;
+		}
+
+		@Override
+		boolean isMultipleSupported() {
+			return false;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void test(FORM form, Node node) {
+			runner.setup();
+			super.test(form, node);
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testAdding(FORM form, Node parent) {
+
+			// Check to see if the container node will be added during addition
+			Node childNode = getNode(parent);
+
+			if (childNode == null) {
+				currentChildrenCount++;
+			}
+
+			// Delegate the call
+			runner.testAdding(form, parent);
+
+			// Test to make sure the children were added to the container node
+			assertEquals(
+				runner.displayString() + " : The child nodes were not created correctly",
+				currentChildrenCount,
+				parent.getChildNodes().getLength()
+			);
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testInitialState(FORM form, Node parent) {
+			runner.testInitialState(form, parent);
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testReading(FORM form, Node parent) {
+			runner.testReading(form, parent);
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testRemoving(FORM form, Node parent) {
+
+			// Delegate the call
+			runner.testRemoving(form, parent);
+
+			// Make sure the deletion happened correctly
+			Node childNode = getNode(parent);
+
+			if (runner.currentChildListCount == 0) {
+
+				currentChildrenCount--;
+
+				assertNull(
+					displayString() + " : The child nodes were not removed correctly",
+					childNode
+				);
+			}
+			else {
+				assertNotNull(
+					displayString() + " : The child nodes were not removed correctly",
+					childNode
+				);
+			}
+
+			assertEquals(
+				displayString() + " : The child nodes were not removed correctly",
+				currentChildrenCount,
+				parent.getChildNodes().getLength()
+			);
+		}
+	}
+
+	/**
+	 *
+	 */
+	interface ContainerNodeRetriever {
+
+		/**
+		 * Retrieves
+		 *
+		 * @param parent
+		 * @return
+		 */
+		Node getContainerNode(Node parent);
+	}
+
+	/**
 	 * A <code>Controller</code> wraps a {@link NodeTesterRunner} and executes one of the possible
 	 * tests, which is either add, read or remove the property from the node being manipulated by
 	 * the {@link ExternalForm}.
@@ -1136,12 +2413,12 @@
 		int currentChildrenCount;
 
 		/**
-		 *
+		 * The runner to executed but with some tweaks applied.
 		 */
 		NodeTesterRunner runner;
 
 		/**
-		 * Outputs what is being executed.
+		 * Outputs what is being executed, used for debug purposes.
 		 */
 		abstract void log();
 
@@ -1151,7 +2428,7 @@
 		 * @param form The {@link ExternalForm} to test
 		 * @param node The node that is manipulated by the given {@link ExternalForm}
 		 */
-		abstract void test(T form, Node node);
+		abstract void test(FORM form, Node node);
 
 		/**
 		 * {@inheritDoc}
@@ -1162,7 +2439,7 @@
 		}
 	}
 
-	private class DefaultRootNodeTester implements RootNodeTester<T> {
+	private class DefaultRootNodeTester implements RootNodeTester<FORM> {
 
 		/**
 		 * The list of testers that used to test every single attribute
@@ -1173,7 +2450,7 @@
 		/**
 		 * The builder of the {@link ExternalForm} to test.
 		 */
-		private ExternalFormBuilder<T> builder;
+		private ExternalFormBuilder<FORM> builder;
 
 		/**
 		 * The list of testers that used to test every single child nodes of the one represented by
@@ -1194,7 +2471,7 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		public void addAttribute(AttributeNodeTester<T, ?> tester) {
+		public void addAttribute(AttributeNodeTester<FORM, ?> tester) {
 			attributes.add(new AttributeNodeTesterRunner(tester));
 		}
 
@@ -1202,7 +2479,31 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		public void addListNodes(ChildListNodeTester<T, ?, ?> tester) {
+		public void addBooleanNode(BooleanChildNodeTester<FORM> tester) {
+			children.add(new BooleanChildNodeTesterRunner(tester));
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void addChildAttribute(ChildAttributeTester<FORM,?> tester) {
+			children.add(new ChildAttributeTesterRunner(tester));
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void addContainerListNodes(ContainerChildListNodeTester<FORM, ?, ?> tester) {
+			children.add(new ContainerChildListNodeTesterRunner(tester));
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void addListNodes(ChildListNodeTester<FORM, ?, ?> tester) {
 			children.add(new ChildListNodeTesterRunner(tester));
 		}
 
@@ -1210,7 +2511,7 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		public void addNode(ChildNodeTester<T, ?> tester) {
+		public void addNode(ChildNodeTester<FORM, ?> tester) {
 			children.add(new ChildNodeTesterRunner(tester));
 		}
 
@@ -1218,7 +2519,7 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		public void addTextNode(TextNodeTester<T, ?> tester) {
+		public void addTextNode(TextNodeTester<FORM, ?> tester) {
 			children.add(new TextNodeTesterRunner(tester));
 		}
 
@@ -1226,16 +2527,68 @@
 		 * {@inheritDoc}
 		 */
 		@Override
+		public void addUnsupportedAttribute(String attributeName) {
+			attributes.add(new NotSupportedAttributeTesterRunner(attributeName));
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
 		public void addUnsupportedNode(String nodeName) {
 			children.add(new NotSupportedNodeTesterRunner(nodeName));
 		}
 
 		@SuppressWarnings({"unchecked", "rawtypes"})
-		private Map<Class<NodeTesterRunner>, Class<Controller>[]> buildControllerTypes() {
+		private Map<Class<NodeTesterRunner>, Class<Controller>[]> buildAttributeControllerTypes() {
 
 			Map classes = new HashMap();
 
 			classes.put(
+				AttributeNodeTesterRunner.class,
+				new Class<?>[] {
+					AttributeNodeRunnerAddingController.class,
+					AttributeNodeRunnerReadingController.class,
+					AttributeNodeRunnerRemovingController.class
+				}
+			);
+
+			return classes;
+		}
+
+		private NodeCountRetriever buildAttributeCountRetriever() {
+			return new NodeCountRetriever() {
+				@Override
+				public int getCount(Node node) {
+					return node.getAttributes().getLength();
+				}
+			};
+		}
+
+		@SuppressWarnings({"unchecked", "rawtypes"})
+		private Map<Class<NodeTesterRunner>, Class<Controller>[]> buildChildrenControllerTypes() {
+
+			Map classes = new HashMap();
+
+			classes.put(
+				ChildAttributeTesterRunner.class,
+				new Class<?>[] {
+					ChildAttributeRunnerAddingController.class,
+					ChildAttributeRunnerReadingController.class,
+					ChildAttributeRunnerRemovingController.class
+				}
+			);
+
+			classes.put(
+				BooleanChildNodeTesterRunner.class,
+				new Class<?>[] {
+					BooleanChildNodeRunnerAddingController.class,
+					BooleanChildNodeRunnerReadingController.class,
+					BooleanChildNodeRunnerRemovingController.class
+				}
+			);
+
+			classes.put(
 				ChildNodeTesterRunner.class,
 				new Class<?>[] {
 					ChildNodeRunnerAddingController.class,
@@ -1262,9 +2615,27 @@
 				}
 			);
 
+			classes.put(
+				ContainerChildListNodeTesterRunner.class,
+				new Class<?>[] {
+					ContainerChildListNodeRunnerAddingController.class,
+					ContainerChildListNodeRunnerReadingController.class,
+					ContainerChildListNodeRunnerRemovingController.class
+				}
+			);
+
 			return classes;
 		}
 
+		private NodeCountRetriever buildChildrenCountRetriever() {
+			return new NodeCountRetriever() {
+				@Override
+				public int getCount(Node node) {
+					return node.getChildNodes().getLength();
+				}
+			};
+		}
+
 		private String displayString() {
 			return "<" + builder.getNodeName() + ">";
 		}
@@ -1293,7 +2664,7 @@
 						return node;
 					}
 
-					return getNode(node, nodeNames.subList(1, nodeName.length()));
+					return getNode(node, nodeNames.subList(1, nodeNames.size()));
 				}
 
 				node = node.getNextSibling();
@@ -1308,9 +2679,9 @@
 
 			for (int index = 0, count = children.size(); index < count; index++) {
 
-				NodeTesterRunner tester = children.get(index);
+				NodeTesterRunner runner = children.get(index);
 
-				if (tester.getNodeName().equals(nodeName)) {
+				if (runner.getActualNodeName().equals(nodeName)) {
 					return index;
 				}
 			}
@@ -1324,8 +2695,8 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		public void setBuilder(ExternalFormBuilder<? extends T> builder) {
-			this.builder = (ExternalFormBuilder<T>) builder;
+		public void setBuilder(ExternalFormBuilder<? extends FORM> builder) {
+			this.builder = (ExternalFormBuilder<FORM>) builder;
 		}
 
 		/**
@@ -1334,7 +2705,7 @@
 		void test() throws Exception {
 
 			// Creates the ExternalForm
-			T form = builder.buildExternalForm();
+			FORM form = builder.buildExternalForm();
 
 			assertNotNull(
 				displayString() + " : The external form cannot be null",
@@ -1359,6 +2730,20 @@
 			);
 
 			// Test each attribute
+			testAttributes(form, node);
+
+			// Test each child node
+			testChildren(form, node);
+
+			// Now test manipulating the attributes in random order
+			testAttributesRandomly(form, node);
+
+			// Now test manipulating the child nodes in random order
+			testChildNodesRandomly(form, node);
+		}
+
+		private void testAttributes(FORM form, Node node) {
+
 			int defaultAttributeCount = builder.getDefaultAttributeCount();
 
 			for (AttributeNodeTesterRunner runner : attributes) {
@@ -1368,13 +2753,35 @@
 				runner.test(form, node);
 
 				assertEquals(
-					displayString() + " : No number of attributes is inconsistent",
+					displayString() + " : The number of attributes is inconsistent",
 					defaultAttributeCount,
 					node.getAttributes().getLength()
 				);
 			}
+		}
 
-			// Test each child node
+		private void testAttributesRandomly(FORM form, Node parent) throws Exception {
+			testNodesRandomly(
+				form,
+				parent,
+				attributes,
+				buildAttributeCountRetriever(),
+				buildAttributeControllerTypes()
+			);
+		}
+
+		private void testChildNodesRandomly(FORM form, Node parent) throws Exception {
+			testNodesRandomly(
+				form,
+				parent,
+				children,
+				buildChildrenCountRetriever(),
+				buildChildrenControllerTypes()
+			);
+		}
+
+		private void testChildren(FORM form, Node node) {
+
 			for (NodeTesterRunner runner : children) {
 
 				runner.parentNodeName = builder.getNodeName();
@@ -1386,26 +2793,20 @@
 					node.getChildNodes().getLength()
 				);
 			}
-
-			// Now test manipulating the attributes in random order
-			testAttributesRandomly(form, node);
-
-			// Now test manipulating the child nodes in random order
-			testChildNodesRandomly(form, node);
 		}
 
-		private void testAttributesRandomly(T form, Node node) {
-		}
+		private void testNodesRandomly(FORM form,
+		                               Node parent,
+		                               List<? extends NodeTesterRunner> runners,
+		                               NodeCountRetriever countRetriever,
+		                               Map<Class<NodeTesterRunner>, Class<Controller>[]> controllerClasses) throws Exception {
 
-		private void testChildNodesRandomly(T form, Node parent) throws Exception {
-
-			// The list of controllers is used to execute a single test for a particular,
-			// a list will be generated randomly to test the order
-			Map<Class<NodeTesterRunner>, Class<Controller>[]> controllerClasses = buildControllerTypes();
+			// The list of controllers is used to execute a single test for a particular runner.
+			// A list will be generated randomly to test the order
 			List<Controller> controllers = new ArrayList<Controller>();
 			Random random = new Random();
 
-			int childrenCount = children.size();
+			int childrenCount = runners.size();
 			int controllerTypeCount = controllerClasses.size();
 			int executionCount = childrenCount * controllerTypeCount * 20;
 
@@ -1414,10 +2815,9 @@
 
 				// Get the runner randomly
 				int childIndex = random.nextInt(childrenCount);
-				NodeTesterRunner runner = children.get(childIndex);
+				NodeTesterRunner runner = runners.get(childIndex);
 
-				// Get the controller type randomly
-				int controllerIndex = random.nextInt(controllerTypeCount);
+				// Get the controllers associated with the runner
 				Class<Controller>[] controllerTypes = controllerClasses.get(runner.getClass());
 
 				// Happen for unsupported node name
@@ -1425,6 +2825,8 @@
 					continue;
 				}
 
+				// Get the controller type randomly
+				int controllerIndex = random.nextInt(controllerTypes.length);
 				Class<Controller> controllerType = controllerTypes[controllerIndex];
 
 				// Create the controller
@@ -1441,33 +2843,42 @@
 			// Run each controller and keep the child nodes count up to date
 			for (Controller controller : controllers) {
 
-				controller.currentChildrenCount = parent.getChildNodes().getLength();
-//				controller.log();
+				controller.currentChildrenCount = countRetriever.getCount(parent);
+				//controller.log();
 				controller.test(form, parent);
 
-				// Retrieve the ordinal of each child node
-				Node childNode = parent.getFirstChild();
+				// Test the ordinal of each child node
+				testOrdinalPosition(parent);
+			}
 
-				if (childNode != null) {
+			// Note: The runners don't need to be disposed since there are not used anymore
+		}
 
-					List<Integer> nodePositions = new ArrayList<Integer>();
+		private void testOrdinalPosition(Node parent) {
 
-					do {
-						int nodePosition = getNodePositionOfInsertion(childNode);
-						nodePositions.add(nodePosition);
-						childNode = childNode.getNextSibling();
+			Node childNode = parent.getFirstChild();
+
+			if (childNode != null) {
+
+				List<Integer> nodePositions = new ArrayList<Integer>();
+
+				do {
+					int nodePosition = getNodePositionOfInsertion(childNode);
+					nodePositions.add(nodePosition);
+					childNode = childNode.getNextSibling();
+				}
+				while (childNode != null);
+
+				// Make sure the ordinal numbers are from the smaller number to the biggest number
+				int previousPosition = -1;
+
+				for (int nodePosition : nodePositions) {
+
+					if (previousPosition > nodePosition) {
+						fail("The insertion was not performed following the ordering.");
 					}
-					while (childNode != null);
 
-					// Make sure the ordinal numbers are from the smaller number to the biggest number
-					int previousPosition = -1;
-
-					for (int nodePosition : nodePositions) {
-
-						if (nodePosition < previousPosition) {
-							fail("The insertion was not performed following the ordering.");
-						}
-					}
+					previousPosition = nodePosition;
 				}
 			}
 		}
@@ -1476,7 +2887,7 @@
 	/**
 	 * A <code>ExternalFormBuilder</code> is responsible to create the {@link ExternalForm} to be tested.
 	 */
-	public interface ExternalFormBuilder<T extends ExternalForm> {
+	public interface ExternalFormBuilder<FORM extends ExternalForm> {
 
 		/**
 		 * Creates the {@link ExternalForm} to test.
@@ -1484,7 +2895,7 @@
 		 * @return The {@link ExternalForm} to test
 		 * @throws IOException If an error occurred during the creation process
 		 */
-		T buildExternalForm() throws IOException;
+		FORM buildExternalForm() throws IOException;
 
 		/**
 		 * Returns the number of attributes the {@link Node} contains before any manipulation has been performed.
@@ -1499,14 +2910,22 @@
 		 * @param form The {@link ExternalForm} for which to return its node
 		 * @return The node from the document that is been manipulated
 		 */
-		Node getNode(T form);
+		Node getNode(FORM form);
 
 		String getNodeName();
 
 		List<String> getTreeNodeNames();
 	}
 
-	private interface NodeTester<T, Value> {
+	private interface NodeCountRetriever {
+		int getCount(Node parent);
+	}
+
+	/**
+	 * The root interface of the testers defined to test the manipulation of a node's property (either
+	 * an attribute, a single child node, a list of child nodes or a text node).
+	 */
+	private interface NodeTester<FORM extends ExternalForm, Value> {
 
 		/**
 		 * Retrieves the name of the node for which retrieving and setting its value is tested.
@@ -1516,22 +2935,25 @@
 		String getNodeName();
 	}
 
+	/**
+	 * This is the root of the runner class, which is associated with a {@link NodeTester}.
+	 */
 	private abstract class NodeTesterRunner {
 
 		/**
-		 *
+		 * Keeps track of the current count of child nodes owned by the node being manipulated.
 		 */
 		int currentChildrenCount;
 
 		/**
-		 *
+		 * For debug purposes, this is the name of the parent node.
 		 */
 		String parentNodeName;
 
 		/**
 		 * This object defines a single node to test (which is either a child element or an attribute).
 		 */
-		final NodeTester<T, Object> tester;
+		final NodeTester<FORM, Object> tester;
 
 		/**
 		 * Creates a new <code>AbstractNodeTester</code>.
@@ -1539,13 +2961,17 @@
 		 * @param tester The bridge between this tester and the document's node being tested
 		 */
 		@SuppressWarnings("unchecked")
-		NodeTesterRunner(NodeTester<T, ?> tester) {
+		NodeTesterRunner(NodeTester<FORM, ?> tester) {
 			super();
-			this.tester = (NodeTester<T, Object>) tester;
+			this.tester = (NodeTester<FORM, Object>) tester;
 			assertNotNull("The tester cannot be null",    tester);
 			assertNotNull("The node name cannot be null", tester.getNodeName());
 		}
 
+		String getActualNodeName() {
+			return tester.getNodeName();
+		}
+
 		/**
 		 * Returns the name of the node for which this runner tests.
 		 *
@@ -1568,7 +2994,7 @@
 		 * @param form The {@link ExternalForm} to test
 		 * @param node The node that is manipulated by the given {@link ExternalForm}
 		 */
-		void test(T form, Node node) {
+		void test(FORM form, Node node) {
 			testInitialState(form, node);
 			testAdding(form, node);
 			testReading(form, node);
@@ -1581,7 +3007,7 @@
 		 * @param form The {@link ExternalForm} to test
 		 * @param node The node that is manipulated by the given {@link ExternalForm}
 		 */
-		abstract void testAdding(T form, Node node);
+		abstract void testAdding(FORM form, Node node);
 
 		/**
 		 * Tests the given {@link ExternalForm} by making sure the given node is in its original state.
@@ -1589,7 +3015,7 @@
 		 * @param form The {@link ExternalForm} to test
 		 * @param node The node that is manipulated by the given {@link ExternalForm}
 		 */
-		abstract void testInitialState(T form, Node node);
+		abstract void testInitialState(FORM form, Node node);
 
 		/**
 		 * Tests the given {@link ExternalForm} by reading the property from the node.
@@ -1597,7 +3023,7 @@
 		 * @param form The {@link ExternalForm} to test
 		 * @param node The node that is manipulated by the given {@link ExternalForm}
 		 */
-		abstract void testReading(T form, Node node);
+		abstract void testReading(FORM form, Node node);
 
 		/**
 		 * Tests the given {@link ExternalForm} by removing the property from the node.
@@ -1605,7 +3031,7 @@
 		 * @param form The {@link ExternalForm} to test
 		 * @param node The node that is manipulated by the given {@link ExternalForm}
 		 */
-		abstract void testRemoving(T form, Node node);
+		abstract void testRemoving(FORM form, Node node);
 
 		/**
 		 * {@inheritDoc}
@@ -1616,7 +3042,152 @@
 		}
 	}
 
-	private class NotSupportedNodeTester implements NodeTester<T, Object> {
+	/**
+	 * This <code>AttributeNodeTester</code> does nothing, it is used when an attribute is not
+	 * currently by the {@link ExternalForm}.
+	 */
+	private class NotSupportedAttributeTester implements AttributeNodeTester<FORM, Object> {
+
+		/**
+		 * The name of the attribute that is not supported by the {@link ExternalForm}.
+		 */
+		private String attributeName;
+
+		/**
+		 * Creates a new <code>NotSupportedAttributeTester</code>.
+		 *
+		 * @param attributeName The name of the attribute that is not supported by the {@link ExternalForm}
+		 */
+		NotSupportedAttributeTester(String attributeName) {
+			super();
+			this.attributeName = attributeName;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public boolean doesNodeAlreadyExist() {
+			return false;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public Object getDefaultValue() {
+			return null;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public String getNodeName() {
+			return attributeName;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public Object getValue(FORM form) {
+			return null;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public Object getValue1() {
+			return null;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public Object getValue2() {
+			return null;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public boolean isNullAllowed() {
+			return false;
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public void setValue(FORM form, Object value) {
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		public String toString(Object value) {
+			return null;
+		}
+	}
+
+	/**
+	 * This runner simply does nothing but adds support for adding an attribute name into the list of
+	 * attributes so that the ordering defined by the XML schema is properly tested.
+	 */
+	private class NotSupportedAttributeTesterRunner extends AttributeNodeTesterRunner {
+
+		/**
+		 * Creates a new <code>NotSupportedAttributeTesterRunner</code>.
+		 *
+		 * @param attributeName The name of the attribute that is currently not supported by the
+		 * {@link ExternalForm}
+		 */
+		NotSupportedAttributeTesterRunner(String attributeName) {
+			super(new NotSupportedAttributeTester(attributeName));
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testAdding(FORM form, Node node) {
+			// Nothing to do
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testInitialState(FORM form, Node node) {
+			// Nothing to do
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testReading(FORM form, Node node) {
+			// Nothing to do
+		}
+
+		/**
+		 * {@inheritDoc}
+		 */
+		@Override
+		void testRemoving(FORM form, Node node) {
+			// Nothing to do
+		}
+	}
+
+	/**
+	 * This wraps a node name that is currently not supported by the Mapping SPI.
+	 */
+	private class NotSupportedNodeTester implements NodeTester<FORM, Object> {
 
 		/**
 		 * The name of the node that is currently not supported by the {@link ExternalForm}.
@@ -1642,6 +3213,10 @@
 		}
 	}
 
+	/**
+	 * This runner simply does nothing but adds support for adding a node name into the list of child
+	 * nodes so that the ordering defined by the XML schema is properly tested.
+	 */
 	private class NotSupportedNodeTesterRunner extends NodeTesterRunner {
 
 		/**
@@ -1665,7 +3240,7 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testAdding(T form, Node node) {
+		void testAdding(FORM form, Node node) {
 			// Nothing to do
 		}
 
@@ -1673,7 +3248,7 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testInitialState(T form, Node node) {
+		void testInitialState(FORM form, Node node) {
 			// Nothing to do
 		}
 
@@ -1681,7 +3256,7 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testReading(T form, Node node) {
+		void testReading(FORM form, Node node) {
 			// Nothing to do
 		}
 
@@ -1689,7 +3264,7 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testRemoving(T form, Node node) {
+		void testRemoving(FORM form, Node node) {
 			// Nothing to do
 		}
 	}
@@ -1706,7 +3281,7 @@
 		 *
 		 * @param tester This object defines a single node to test a child text node
 		 */
-		PropertyNodeTesterRunner(PropertyTester<T, ?> tester) {
+		PropertyNodeTesterRunner(PropertyTester<FORM, ?> tester) {
 			super(tester);
 		}
 
@@ -1753,19 +3328,24 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testAdding(T form, Node parentNode) {
+		void testAdding(FORM form, Node parentNode) {
 
-			PropertyTester<T, Object> tester = (PropertyTester<T, Object>) this.tester;
+			PropertyTester<FORM, Object> tester = (PropertyTester<FORM, Object>) this.tester;
 
 			// Change the node value to null
 			if (tester.isNullAllowed()) {
 
 				tester.setValue(form, null);
 
+				if (nodeExists) {
+					nodeExists = false;
+					currentChildrenCount--;
+				}
+
 				assertEquals(
 					displayString() + " : The element should not have any children",
-					0,
-					getChildrenCount(parentNode) - currentChildrenCount
+					currentChildrenCount,
+					getChildrenCount(parentNode)
 				);
 
 				// Make sure nothing changed
@@ -1779,8 +3359,8 @@
 				// Make sure nothing changed
 				assertEquals(
 					displayString() + " : The element should not have any children",
-					0,
-					getChildrenCount(parentNode) - currentChildrenCount
+					currentChildrenCount,
+					getChildrenCount(parentNode)
 				);
 			}
 
@@ -1794,6 +3374,11 @@
 
 			tester.setValue(form, expectedValue1);
 
+			if (!nodeExists) {
+				nodeExists = true;
+				currentChildrenCount++;
+			}
+
 			// The child node should have been added
 			Node childNode = getNode(parentNode);
 
@@ -1803,9 +3388,9 @@
 			);
 
 			assertEquals(
-				displayString() + " : The element should have a " + (nodeExists ? currentChildrenCount : currentChildrenCount + 1) + " children",
-				nodeExists ? 0 : 1,
-				getChildrenCount(parentNode) - currentChildrenCount
+				displayString() + " : The element should have a " + currentChildrenCount + " children",
+				currentChildrenCount,
+				getChildrenCount(parentNode)
 			);
 
 			// Get the value
@@ -1859,17 +3444,24 @@
 			);
 
 			// Change the value back to its original value
-			tester.setValue(form, tester.getDefaultValue());
+			Object defaultValue = tester.getDefaultValue();
+
+			assertNotNull(
+				displayString() + " : The default value cannot be null",
+				defaultValue
+			);
+
+			tester.setValue(form, defaultValue);
 		}
 
 		/**
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testInitialState(T form, Node parent) {
+		void testInitialState(FORM form, Node parent) {
 
-			PropertyTester<T, Object> tester = (PropertyTester<T, Object>) this.tester;
-			nodeExists |= tester.doesNodeExistAlready();
+			PropertyTester<FORM, Object> tester = (PropertyTester<FORM, Object>) this.tester;
+			nodeExists |= tester.doesNodeAlreadyExist();
 
 			// Node name
 			String nodeName = getNodeName();
@@ -1878,8 +3470,8 @@
 			// Test the initial state of the parent node
 			assertEquals(
 				displayString() + " : The parent node child count is incorrect",
-				0,
-				getChildrenCount(parent) - currentChildrenCount
+				currentChildrenCount,
+				getChildrenCount(parent)
 			);
 
 			// The child node should either not exist or already being present
@@ -1903,9 +3495,9 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testReading(T form, Node node) {
+		void testReading(FORM form, Node node) {
 
-			PropertyTester<T, Object> tester = (PropertyTester<T, Object>) this.tester;
+			PropertyTester<FORM, Object> tester = (PropertyTester<FORM, Object>) this.tester;
 
 			// The node value should either be null or not null
 			Object result = tester.getValue(form);
@@ -1965,19 +3557,24 @@
 		 * {@inheritDoc}
 		 */
 		@Override
-		void testRemoving(T form, Node parentNode) {
+		void testRemoving(FORM form, Node parentNode) {
 
-			PropertyTester<T, Object> tester = (PropertyTester<T, Object>) this.tester;
+			PropertyTester<FORM, Object> tester = (PropertyTester<FORM, Object>) this.tester;
 
 			// Change the node value to null, which will remove it from the parent node
 			if (tester.isNullAllowed()) {
 
 				tester.setValue(form, null);
 
+				if (nodeExists) {
+					nodeExists = false;
+					currentChildrenCount--;
+				}
+
 				assertEquals(
 					displayString() + " : The child count does not match the current state",
-					0,
-					getChildrenCount(parentNode) - currentChildrenCount
+					currentChildrenCount,
+					getChildrenCount(parentNode)
 				);
 			}
 		}
@@ -1987,7 +3584,7 @@
 	 * A <code>PropertyTester</code> handles testing either an attribute or a single child node of
 	 * the node being tested.
 	 */
-	private interface PropertyTester<T, VALUE> extends NodeTester<T, VALUE> {
+	private interface PropertyTester<FORM extends ExternalForm, VALUE> extends NodeTester<FORM, VALUE> {
 
 		/**
 		 * Determines whether the property is by default present in the document.
@@ -1995,10 +3592,10 @@
 		 * @return <code>true</code> if the property exists before any changes is done to the document;
 		 * <code>false</code> otherwise
 		 */
-		boolean doesNodeExistAlready();
+		boolean doesNodeAlreadyExist();
 
 		/**
-		 * If {@link #doesNodeExistAlready()} returns <code>true</code>, then this should return the
+		 * If {@link #doesNodeAlreadyExist()} returns <code>true</code>, then this should return the
 		 * node value that is already present in the document, which is done before the document is
 		 * being changed.
 		 *
@@ -2013,7 +3610,7 @@
 		 * @param form The external form that will retrieve the value
 		 * @return The value, which can be <code>null</code>
 		 */
-		VALUE getValue(T form);
+		VALUE getValue(FORM form);
 
 		/**
 		 * Retrieves a non-<code>null</code> value that will be used for testing that is different
@@ -2044,7 +3641,7 @@
 		 * @param form The external form that will set the value
 		 * @return The value, which can be <code>null</code>
 		 */
-		void setValue(T form, VALUE value);
+		void setValue(FORM form, VALUE value);
 
 		/**
 		 * Converts the value to its string representation.
@@ -2059,14 +3656,29 @@
 	 * A <code>RootNodeTester</code> is the container of all the testers that will test every single
 	 * property of the node to test, i.e. its attributes and child nodes.
 	 */
-	public interface RootNodeTester<T extends ExternalForm> {
+	public interface RootNodeTester<FORM extends ExternalForm> {
 
 		/**
 		 * Adds the given tester when the form has an attribute.
 		 *
 		 * @param tester The tester for a single attribute
 		 */
-		void addAttribute(AttributeNodeTester<T, ?> tester);
+		void addAttribute(AttributeNodeTester<FORM, ?> tester);
+
+		/**
+		 * Adds the given tester when the form representing the node it represents can have one child
+		 * node of a certain type and its property is represented by a boolean value.
+		 *
+		 * @param tester The tester for a single child node
+		 */
+		void addBooleanNode(BooleanChildNodeTester<FORM> tester);
+
+		/**
+		 * Adds the given tester when the form has a child node with a single attribute.
+		 *
+		 * @param tester The tester for a single attribute owned by a single child node
+		 */
+		void addChildAttribute(ChildAttributeTester<FORM, ?> tester);
 
 		/**
 		 * Adds the given tester when the form representing the node it represents can have zero or
@@ -2074,7 +3686,15 @@
 		 *
 		 * @param tester The tester for a list of child nodes with the same type
 		 */
-		void addListNodes(ChildListNodeTester<T, ?, ?> tester);
+		void addContainerListNodes(ContainerChildListNodeTester<FORM, ?, ?> tester);
+
+		/**
+		 * Adds the given tester when the form representing the node it represents can have zero or
+		 * many child nodes of the same type (i.e. with the same node name).
+		 *
+		 * @param tester The tester for a list of child nodes with the same type
+		 */
+		void addListNodes(ChildListNodeTester<FORM, ?, ?> tester);
 
 		/**
 		 * Adds the given tester when the form representing the node it represents can have one child
@@ -2082,14 +3702,22 @@
 		 *
 		 * @param tester The tester for a single child node
 		 */
-		void addNode(ChildNodeTester<T, ?> tester);
+		void addNode(ChildNodeTester<FORM, ?> tester);
 
 		/**
 		 * Adds the given tester when the form has a single child node that is a text node.
 		 *
 		 * @param tester The tester for a single child text node
 		 */
-		void addTextNode(TextNodeTester<T, ?> tester);
+		void addTextNode(TextNodeTester<FORM, ?> tester);
+
+		/**
+		 * Adds the given attribute name to indicate it is part of the "root" node but it is not
+		 * supported by the {@link ExternalForm} yet.
+		 *
+		 * @param attributeName The name of the attribute not currently supported
+		 */
+		void addUnsupportedAttribute(String attributeName);
 
 		/**
 		 * Adds the given node name to indicate it is part of the "root" node but it is not supported
@@ -2104,9 +3732,12 @@
 		 *
 		 * @param builder The builder of the node to test
 		 */
-		void setBuilder(ExternalFormBuilder<? extends T> builder);
+		void setBuilder(ExternalFormBuilder<? extends FORM> builder);
 	}
 
+	/**
+	 * This controller simply asks its runner to add the child text node.
+	 */
 	private class TextNodeRunnerAddingController extends Controller {
 
 		/**
@@ -2122,7 +3753,7 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void test(T form, Node node) {
+		void test(FORM form, Node node) {
 
 			TextNodeTesterRunner runner = (TextNodeTesterRunner) this.runner;
 			runner.currentChildrenCount = currentChildrenCount;
@@ -2133,6 +3764,9 @@
 		}
 	}
 
+	/**
+	 * This controller simply asks its runner to read the child node.
+	 */
 	private class TextNodeRunnerReadingController extends Controller {
 
 		/**
@@ -2148,17 +3782,18 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void test(T form, Node node) {
+		void test(FORM form, Node node) {
 
 			TextNodeTesterRunner runner = (TextNodeTesterRunner) this.runner;
 			runner.currentChildrenCount = currentChildrenCount;
 			runner.testInitialState(form, node);
 			runner.testReading(form, node);
-
-			currentChildrenCount = runner.currentChildrenCount;
 		}
 	}
 
+	/**
+	 * This controller simply asks its runner to remove the child node.
+	 */
 	private class TextNodeRunnerRemovingController extends Controller {
 
 		/**
@@ -2174,7 +3809,7 @@
 		 */
 		@Override
 		@SuppressWarnings("unchecked")
-		void test(T form, Node node) {
+		void test(FORM form, Node node) {
 
 			TextNodeTesterRunner runner = (TextNodeTesterRunner) this.runner;
 			runner.currentChildrenCount = currentChildrenCount;
@@ -2187,14 +3822,14 @@
 
 	/**
 	 * A <code>TextNodeTester</code> tests setting and retrieving the value associated with a text node.
+	 *
+	 * <div nowrap>Form: <code><b>&lt;node_name&gt;text&lt;/node_name&gt;</b></code>.</div>
 	 */
-	public interface TextNodeTester<T, VALUE> extends PropertyTester<T, VALUE> {
+	public interface TextNodeTester<FORM extends ExternalForm, VALUE> extends PropertyTester<FORM, VALUE> {
 	}
 
 	/**
-	 * <p>A <code>TextNodeTesterRunner</code> tests setting and retrieving the value associated with
-	 * a text node.</p>
-	 * <div nowrap>Form: <code><b>&lt;node_name&gt;text&lt;/node_name&gt;</b></code>.</div>
+	 * The runner associated with {@link TextNodeTester}.
 	 */
 	private class TextNodeTesterRunner extends PropertyNodeTesterRunner {
 
@@ -2203,7 +3838,7 @@
 		 *
 		 * @param tester This object defines a single node to test a child text node
 		 */
-		TextNodeTesterRunner(TextNodeTester<T, ?> tester) {
+		TextNodeTesterRunner(TextNodeTester<FORM, ?> tester) {
 			super(tester);
 		}
 
diff --git a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/AccessTypeTests.java b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/AccessTypeTests.java
new file mode 100644
index 0000000..1863b08
--- /dev/null
+++ b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/AccessTypeTests.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2013 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *
+ ******************************************************************************/
+package org.eclipse.persistence.tools.mapping.tests.dom.orm;
+
+import org.eclipse.persistence.tools.mapping.orm.AccessType;
+import org.eclipse.persistence.tools.mapping.orm.ExternalAccessType;
+import org.eclipse.persistence.tools.mapping.tests.AbstractExternalFormTests.AttributeNodeTester;
+import org.eclipse.persistence.tools.mapping.tests.AbstractExternalFormTests.TextNodeTester;
+
+/**
+ * Defines the various testers for the "access" property.
+ *
+ * @see org.eclipse.persistence.tools.mapping.orm.ExternalAccessType
+ *
+ * @version 2.6
+ */
+public final class AccessTypeTests {
+
+	/**
+	 * Cannot create a new <code>AccessTypeTests</code>.
+	 */
+	private AccessTypeTests() {
+		super();
+	}
+
+	public static <T extends ExternalAccessType> AttributeNodeTester<T, AccessType> buildAccessAttributeNodeTester() {
+		return new AttributeNodeTester<T, AccessType>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public AccessType getDefaultValue() {
+				return AccessType.FIELD;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalAccessType.ACCESS;
+			}
+			@Override
+			public AccessType getValue(ExternalAccessType form) {
+				return form.getAccessType();
+			}
+			@Override
+			public AccessType getValue1() {
+				return AccessType.PROPERTY;
+			}
+			@Override
+			public AccessType getValue2() {
+				return AccessType.VIRTUAL;
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(ExternalAccessType form, AccessType value) {
+				form.setAccessType(value);
+			}
+			@Override
+			public String toString(AccessType value) {
+				return value.name();
+			}
+		};
+	}
+
+	public static <T extends ExternalAccessType> TextNodeTester<T, AccessType> buildAccessTextNodeTester() {
+		return new TextNodeTester<T, AccessType>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public AccessType getDefaultValue() {
+				return AccessType.FIELD;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalAccessType.ACCESS;
+			}
+			@Override
+			public AccessType getValue(ExternalAccessType form) {
+				return form.getAccessType();
+			}
+			@Override
+			public AccessType getValue1() {
+				return AccessType.PROPERTY;
+			}
+			@Override
+			public AccessType getValue2() {
+				return AccessType.VIRTUAL;
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(ExternalAccessType form, AccessType value) {
+				form.setAccessType(value);
+			}
+			@Override
+			public String toString(AccessType value) {
+				return value.name();
+			}
+		};
+	}
+}
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/AllORMTests.java b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/AllORMTests.java
index 154410a..8ffa922 100644
--- a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/AllORMTests.java
+++ b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/AllORMTests.java
@@ -23,7 +23,16 @@
  * @version 2.6
  */
 @SuiteClasses({
-	ORMConfigurationTests.class
+
+	// Root node
+	ORMConfigurationTests.class,
+
+	// Managed types
+	EmbeddableTests.class,
+	MappedSuperclassTests.class,
+	EntityTests.class
+
+	// Mappings
 })
 @RunWith(Suite.class)
 public final class AllORMTests {
diff --git a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/ConverterTests.java b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/ConverterTests.java
new file mode 100644
index 0000000..183e73d
--- /dev/null
+++ b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/ConverterTests.java
@@ -0,0 +1,254 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2013 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *
+ ******************************************************************************/
+package org.eclipse.persistence.tools.mapping.tests.dom.orm;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.persistence.tools.mapping.orm.ExternalClassConverter;
+import org.eclipse.persistence.tools.mapping.orm.ExternalConverterProvider;
+import org.eclipse.persistence.tools.mapping.orm.ExternalObjectTypeConverter;
+import org.eclipse.persistence.tools.mapping.orm.ExternalStructConverter;
+import org.eclipse.persistence.tools.mapping.orm.ExternalTypeConverter;
+import org.eclipse.persistence.tools.mapping.tests.AbstractExternalFormTests.ChildListNodeTester;
+
+/**
+ * @version 2.6
+ */
+@SuppressWarnings("nls")
+public final class ConverterTests {
+
+	/**
+	 * Creates a new <code>ConverterTests</code>.
+	 */
+	private ConverterTests() {
+		super();
+	}
+
+	public static <T extends ExternalConverterProvider> ChildListNodeTester<T, ExternalClassConverter, String> buildConverterTester() {
+		return new ChildListNodeTester<T, ExternalClassConverter, String>() {
+			@Override
+			public ExternalClassConverter addChild(T form, String value) {
+				return form.addConverter(value);
+			}
+			@Override
+			public ExternalClassConverter getChild(T form, int index) {
+				return form.getConverter(index);
+			}
+			@Override
+			public ExternalClassConverter getChildForm(List<ExternalClassConverter> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalClassConverter> getChildren(T form) {
+				return form.converters();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.convertersSize();
+			}
+			@Override
+			public String getChildValue(ExternalClassConverter childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "CLASS_CONVERTER_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalClassConverter.CONVERTER;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeConverter(index);
+			}
+		};
+	}
+
+	public static <T extends ExternalConverterProvider> ChildListNodeTester<T, ExternalObjectTypeConverter, String> buildObjectTypeConverterTester() {
+		return new ChildListNodeTester<T, ExternalObjectTypeConverter, String>() {
+			@Override
+			public ExternalObjectTypeConverter addChild(T form, String value) {
+				return form.addObjectTypeConverter(value);
+			}
+			@Override
+			public ExternalObjectTypeConverter getChild(T form, int index) {
+				return form.getObjectTypeConverter(index);
+			}
+			@Override
+			public ExternalObjectTypeConverter getChildForm(List<ExternalObjectTypeConverter> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalObjectTypeConverter> getChildren(T form) {
+				return form.objectTypeConverters();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.objectTypeConvertersSize();
+			}
+			@Override
+			public String getChildValue(ExternalObjectTypeConverter childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "OBJECT_TYPE_CONVERTER_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalObjectTypeConverter.OBJECT_TYPE_CONVERTER;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeObjectTypeConverter(index);
+			}
+		};
+	}
+
+	public static String buildSerializedConverterTester() {
+		return "serialized-converter";
+	}
+
+	public static <T extends ExternalConverterProvider> ChildListNodeTester<T, ExternalStructConverter, String> buildStructConverterTester() {
+		return new ChildListNodeTester<T, ExternalStructConverter, String>() {
+			@Override
+			public ExternalStructConverter addChild(T form, String value) {
+				return form.addStructConverter(value);
+			}
+			@Override
+			public ExternalStructConverter getChild(T form, int index) {
+				return form.getStructConverter(index);
+			}
+			@Override
+			public ExternalStructConverter getChildForm(List<ExternalStructConverter> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalStructConverter> getChildren(T form) {
+				return form.structConverters();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.structConvertersSize();
+			}
+			@Override
+			public String getChildValue(ExternalStructConverter childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "STRUCT_CONVERTER_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalStructConverter.STRUCT_CONVERTER;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeStructConverter(index);
+			}
+		};
+	}
+
+	public static <T extends ExternalConverterProvider> ChildListNodeTester<T, ExternalTypeConverter, String> buildTypeConverterTester() {
+		return new ChildListNodeTester<T, ExternalTypeConverter, String>() {
+			@Override
+			public ExternalTypeConverter addChild(T form, String value) {
+				return form.addTypeConverter(value);
+			}
+			@Override
+			public ExternalTypeConverter getChild(T form, int index) {
+				return form.getTypeConverter(index);
+			}
+			@Override
+			public ExternalTypeConverter getChildForm(List<ExternalTypeConverter> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalTypeConverter> getChildren(T form) {
+				return form.typeConverters();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.typeConvertersSize();
+			}
+			@Override
+			public String getChildValue(ExternalTypeConverter childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "TYPE_CONVERTER_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalTypeConverter.TYPE_CONVERTER;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeTypeConverter(index);
+			}
+		};
+	}
+}
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/EmbeddableTests.java b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/EmbeddableTests.java
new file mode 100644
index 0000000..8e37e96
--- /dev/null
+++ b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/EmbeddableTests.java
@@ -0,0 +1,922 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2013 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *
+ ******************************************************************************/
+package org.eclipse.persistence.tools.mapping.tests.dom.orm;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.persistence.annotations.ChangeTrackingType;
+import org.eclipse.persistence.tools.mapping.ExternalProperty;
+import org.eclipse.persistence.tools.mapping.orm.AccessType;
+import org.eclipse.persistence.tools.mapping.orm.ExternalAccessMethods;
+import org.eclipse.persistence.tools.mapping.orm.ExternalAssociationOverride;
+import org.eclipse.persistence.tools.mapping.orm.ExternalAttributeOverride;
+import org.eclipse.persistence.tools.mapping.orm.ExternalBasicCollectionMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalBasicMapMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalBasicMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalClassConverter;
+import org.eclipse.persistence.tools.mapping.orm.ExternalCloneCopyPolicy;
+import org.eclipse.persistence.tools.mapping.orm.ExternalCopyPolicy;
+import org.eclipse.persistence.tools.mapping.orm.ExternalElementCollectionMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalEmbeddable;
+import org.eclipse.persistence.tools.mapping.orm.ExternalEmbeddedIDMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalEmbeddedMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalIDMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalInstantiationCopyPolicy;
+import org.eclipse.persistence.tools.mapping.orm.ExternalManyToManyMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalManyToOneMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalNoSql;
+import org.eclipse.persistence.tools.mapping.orm.ExternalORMConfiguration;
+import org.eclipse.persistence.tools.mapping.orm.ExternalObjectTypeConverter;
+import org.eclipse.persistence.tools.mapping.orm.ExternalOneToManyMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalOneToOneMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalStructConverter;
+import org.eclipse.persistence.tools.mapping.orm.ExternalTransformationMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalTransientMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalTypeConverter;
+import org.eclipse.persistence.tools.mapping.orm.ExternalVariableOneToOneMapping;
+import org.eclipse.persistence.tools.mapping.orm.ExternalVersionMapping;
+import org.eclipse.persistence.tools.mapping.tests.AbstractExternalFormTests;
+import org.eclipse.persistence.tools.utility.ObjectTools;
+import org.eclipse.persistence.tools.utility.collection.ListTools;
+import org.w3c.dom.Node;
+
+/**
+ * This unit-tests tests the behavior of {@link T}.
+ *
+ * @version 2.6
+ */
+@SuppressWarnings("nls")
+public class EmbeddableTests<T extends ExternalEmbeddable> extends AbstractExternalFormTests<T> {
+
+	final ChildNodeTester<T, ExternalAccessMethods> buildAccessMethodsTester() {
+		return new ChildNodeTester<T, ExternalAccessMethods>() {
+			@Override
+			public ExternalAccessMethods addChild(T form) {
+				return form.addAccessMethods(null, null);
+			}
+			@Override
+			public ExternalAccessMethods getChild(T form) {
+				return form.getAccessMethods();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalAccessMethods.ACCESS_METHODS;
+			}
+			@Override
+			public boolean hasChild(T form) {
+				return form.hasAccessMethods();
+			}
+			@Override
+			public void removeChild(T form) {
+				form.removeAccessMethods();
+			}
+		};
+	}
+
+	final AttributeNodeTester<T, AccessType> buildAccessTester() {
+		return AccessTypeTests.buildAccessAttributeNodeTester();
+	}
+
+	final ChildListNodeTester<T, ExternalAssociationOverride, String> buildAssociationOverrideTester() {
+		return new ChildListNodeTester<T, ExternalAssociationOverride, String>() {
+			@Override
+			public ExternalAssociationOverride addChild(T form, String value) {
+				return form.addAssociationOverride(value);
+			}
+			@Override
+			public ExternalAssociationOverride getChild(T form, int index) {
+				return form.getAssociationOverride(index);
+			}
+			@Override
+			public ExternalAssociationOverride getChildForm(List<ExternalAssociationOverride> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalAssociationOverride> getChildren(T form) {
+				return form.associationOverrides();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.associationOverridesSize();
+			}
+			@Override
+			public String getChildValue(ExternalAssociationOverride childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "ASSOCIATION_OVERRIDE_" + 1;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalAssociationOverride.ASSOCIATION_OVERRIDE;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeAssociationOverride(index);
+			}
+		};
+	}
+
+	final ChildListNodeTester<T, ExternalAttributeOverride, String> buildAttributeOverrideTester() {
+		return new ChildListNodeTester<T, ExternalAttributeOverride, String>() {
+			@Override
+			public ExternalAttributeOverride addChild(T form, String value) {
+				return form.addAttributeOverride(value);
+			}
+			@Override
+			public ExternalAttributeOverride getChild(T form, int index) {
+				return form.getAttributeOverride(index);
+			}
+			@Override
+			public ExternalAttributeOverride getChildForm(List<ExternalAttributeOverride> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalAttributeOverride> getChildren(T form) {
+				return form.attributeOverrides();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.attributeOverridesSize();
+			}
+			@Override
+			public String getChildValue(ExternalAttributeOverride childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "ATTRIBUTE_OVERRIDE_" + 1;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalAttributeOverride.ATTRIBUTE_OVERRIDE;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeAttributeOverride(index);
+			}
+		};
+	}
+
+	final ContainerChildListNodeTester<T, ExternalMapping, String> buildAttributesTester() {
+
+		return new ContainerChildListNodeTester<T, ExternalMapping, String>() {
+
+			private List<String> expectedValues;
+			private List<String> mappingNames;
+			private List<Integer> orderedIndices;
+			private List<String> orderedValues;
+
+			{
+				orderedIndices        = new ArrayList<Integer>();
+				orderedValues         = new ArrayList<String>();
+				mappingNames          = buildMappingNames();
+				expectedValues        = buildExpectedValues();
+			}
+
+			@Override
+			public String getContainerNodeName() {
+				return ExternalMapping.ATTRIBUTES;
+			}
+
+			@Override
+			public ExternalMapping addChild(T form, String value) {
+
+				// Extract the mapping name
+				String mappingName = value.substring(0, value.indexOf("_"));
+
+				// Calculate the position of insertion based on the order
+				// of the mapping type defined in the XML schema
+				int index = insertionIndex(orderedValues, mappingName);
+
+				// Store the value based on the order of insertion in the document
+				orderedValues.add(index, value);
+
+				// Now adjust the positions of insertion
+				adjustOrderedIndices(index, +1);
+
+				// Store the index of insertion based on the order defined in the schema
+				orderedIndices.add(index);
+
+				// Now add the mapping
+				return addMapping(form, value, mappingName);
+			}
+
+			private ExternalMapping addMapping(T form,
+			                                   String value,
+			                                   String mappingName) {
+
+				if (ExternalBasicMapping.BASIC.equals(mappingName)) {
+					return form.addBasicMapping(value);
+				}
+
+				if (ExternalBasicCollectionMapping.BASIC_COLLECTION.equals(mappingName)) {
+					return form.addBasicCollectionMapping(value);
+				}
+
+				if (ExternalBasicMapMapping.BASIC_MAP.equals(mappingName)) {
+					return form.addBasicMapMapping(value);
+				}
+
+				if (ExternalManyToOneMapping.MANY_TO_ONE.equals(mappingName)) {
+					return form.addManyToOneMapping(value);
+				}
+
+				if (ExternalOneToManyMapping.ONE_TO_MANY.equals(mappingName)) {
+					return form.addOneToManyMapping(value);
+				}
+
+				if (ExternalOneToOneMapping.ONE_TO_ONE.equals(mappingName)) {
+					return form.addOneToOneMapping(value);
+				}
+
+				if (ExternalManyToManyMapping.MANY_TO_MANY.equals(mappingName)) {
+					return form.addManyToManyMapping(value);
+				}
+
+				if (ExternalElementCollectionMapping.ELEMENT_COLLECTION.equals(mappingName)) {
+					return form.addElementCollectionMapping(value);
+				}
+
+				if (ExternalEmbeddedMapping.EMBEDDED.equals(mappingName)) {
+					return form.addEmbeddedMapping(value);
+				}
+
+				if (ExternalTransientMapping.TRANSIENT.equals(mappingName)) {
+					return form.addTransientMapping(value);
+				}
+
+				throw new IllegalAccessError("The value is unknown: " + value);
+			}
+
+			private void adjustOrderedIndices(int index, int direction) {
+
+				for (int position = 0, count = orderedIndices.size(); position < count; position++) {
+					int value = orderedIndices.get(position);
+					if (value >= index) {
+						orderedIndices.set(position, value + direction);
+					}
+				}
+			}
+
+			/**
+			 * Generates a list of 30 values that is based on the mapping name.
+			 * <p>
+			 * Format: "&lt;mapping name&gt; _ [ 0, 2 ] _ &lt;unique id&gt;"
+			 *
+			 * @return A list of unique values
+			 */
+			private List<String> buildExpectedValues() {
+
+				List<String> values = new ArrayList<String>();
+
+				for (int index = 0; index < 3; index++) {
+					for (String mappingName : mappingNames) {
+						values.add(mappingName + "_" + index);
+					}
+				}
+
+				// Now shuffle that list
+				Collections.shuffle(values);
+
+				return values;
+			}
+
+			private List<String> buildMappingNames() {
+				List<String> names = new ArrayList<String>();
+				names.add(ExternalBasicMapping.BASIC);
+				names.add(ExternalBasicCollectionMapping.BASIC_COLLECTION);
+				names.add(ExternalBasicMapMapping.BASIC_MAP);
+				names.add(ExternalManyToOneMapping.MANY_TO_ONE);
+				names.add(ExternalOneToManyMapping.ONE_TO_MANY);
+				names.add(ExternalOneToOneMapping.ONE_TO_ONE);
+				names.add(ExternalManyToManyMapping.MANY_TO_MANY);
+				names.add(ExternalElementCollectionMapping.ELEMENT_COLLECTION);
+				names.add(ExternalEmbeddedMapping.EMBEDDED);
+				names.add(ExternalTransientMapping.TRANSIENT);
+				return names;
+			}
+
+			@Override
+			public ExternalMapping getChild(T form, int index) {
+
+				// Retrieve the position of insertion within the document
+				index = orderedIndices.get(index);
+
+				// Return the mapping that was added in the order specified by the schema
+				return form.getMapping(index);
+			}
+
+			@Override
+			public ExternalMapping getChildForm(List<ExternalMapping> childForms, int index) {
+
+				// Retrieve the position of insertion within the document
+				index = orderedIndices.get(index);
+
+				// Get the child form at the position it was inserted into the document
+				return childForms.get(index);
+			}
+
+			@Override
+			public List<ExternalMapping> getChildren(T form) {
+				return form.mappings();
+			}
+
+			@Override
+			public int getChildrenSize(T form) {
+				return form.mappingsSize();
+			}
+
+			@Override
+			public String getChildValue(ExternalMapping childForm) {
+				return childForm.getName();
+			}
+
+			@Override
+			public String getExpectedChildValue(int index) {
+				// Return the mapping name that is ordered based on the mapping type
+				return expectedValues.get(index);
+			}
+
+			@Override
+			public List<String> getExpectedChildValues() {
+				// Returned the generate list of mapping names
+				return expectedValues;
+			}
+
+			@Override
+			public String getNodeName() {
+				return ExternalMapping.ATTRIBUTES;
+			}
+
+			@Override
+			public List<String> getNodeNames() {
+				List<String> names = new ArrayList<String>();
+				names.add(ExternalEmbeddable.DESCRIPTION);
+				names.add(ExternalIDMapping.ID);
+				names.add(ExternalEmbeddedIDMapping.EMBEDDED_ID);
+				names.add(ExternalBasicMapping.BASIC);
+				names.add(ExternalBasicCollectionMapping.BASIC_COLLECTION);
+				names.add(ExternalBasicMapMapping.BASIC_MAP);
+				names.add(ExternalVersionMapping.VERSION);
+				names.add(ExternalManyToOneMapping.MANY_TO_ONE);
+				names.add(ExternalOneToManyMapping.ONE_TO_MANY);
+				names.add(ExternalOneToOneMapping.ONE_TO_ONE);
+				names.add(ExternalVariableOneToOneMapping.VARIABLE_ONE_TO_ONE);
+				names.add(ExternalManyToManyMapping.MANY_TO_MANY);
+				names.add(ExternalElementCollectionMapping.ELEMENT_COLLECTION);
+				names.add(ExternalEmbeddedMapping.EMBEDDED);
+				names.add(ExternalTransformationMapping.TRANSFORMATION);
+				names.add(ExternalTransientMapping.TRANSIENT);
+				names.add("structure");
+				names.add("array");
+				return names;
+			}
+
+			private int insertionIndex(List<String> values, String mappingType) {
+
+				// First get the index of the mapping type within the list of registered mapping types
+				int mappingTypeIndex = mappingNames.indexOf(mappingType);
+
+				// Iterate through the list of cached values
+				for (int index = 0; index < values.size(); index++) {
+
+					String value = values.get(index);
+					String type = value.substring(0, value.indexOf("_"));
+
+					int otherMappingTypeIndex = mappingNames.indexOf(type);
+
+					if (mappingTypeIndex < otherMappingTypeIndex) {
+						return index;
+					}
+				}
+
+				return values.size();
+			}
+
+			@Override
+			public void removeChild(T form, int index) {
+
+				// Retrieve the position of insertion within the document
+				index = orderedIndices.remove(index);
+				orderedValues.remove(index);
+
+				// Remove the mapping that was added in the order specified by the schema
+				form.removeMapping(index);
+
+				// Now adjust the positions of insertion
+				adjustOrderedIndices(index, -1);
+			}
+		};
+	}
+
+	final ChildAttributeTester<T, ChangeTrackingType> buildChangeTrackingTester() {
+		return new ChildAttributeTester<T, ChangeTrackingType>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalEmbeddable.CHANGE_TRACKING;
+			}
+			@Override
+			public ChangeTrackingType getDefaultValue() {
+				return ChangeTrackingType.AUTO;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEmbeddable.TYPE;
+			}
+			@Override
+			public ChangeTrackingType getValue(T form) {
+				return form.getChangeTrackingType();
+			}
+			@Override
+			public ChangeTrackingType getValue1() {
+				return ChangeTrackingType.ATTRIBUTE;
+			}
+			@Override
+			public ChangeTrackingType getValue2() {
+				return ChangeTrackingType.DEFERRED;
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, ChangeTrackingType value) {
+				form.setChangeTrackingType(value);
+			}
+			@Override
+			public String toString(ChangeTrackingType value) {
+				return value.name();
+			}
+		};
+	}
+
+	final AttributeNodeTester<T, String> buildClassTester() {
+		return new AttributeNodeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return true;
+			}
+			@Override
+			public String getDefaultValue() {
+				return defaultClassName();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEmbeddable.CLASS;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getClassName();
+			}
+			@Override
+			public String getValue1() {
+				return "org.test.Embeddable_1";
+			}
+			@Override
+			public String getValue2() {
+				return "org.test.Embeddable_2";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return false;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setClassName(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final ChildNodeTester<T, ExternalCloneCopyPolicy> buildCloneCopyPolicyTester() {
+		return new ChildNodeTester<T, ExternalCloneCopyPolicy>() {
+			@Override
+			public ExternalCloneCopyPolicy addChild(T form) {
+				return form.addCloneCopyPolicy();
+			}
+			@Override
+			public ExternalCloneCopyPolicy getChild(T form) {
+				return form.getCloneCopyPolicy();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalCloneCopyPolicy.CLONE_COPY_POLICY;
+			}
+			@Override
+			public boolean hasChild(T form) {
+				return form.hasCloneCopyPolicy();
+			}
+			@Override
+			public void removeChild(T form) {
+				form.removeCloneCopyPolicy();
+			}
+		};
+	}
+
+	final ChildListNodeTester<T, ExternalClassConverter, String> buildConverterTester() {
+		return ConverterTests.buildConverterTester();
+	}
+
+	final ChildNodeTester<T, ExternalCopyPolicy> buildCopyPolicyTester() {
+		return new ChildNodeTester<T, ExternalCopyPolicy>() {
+			@Override
+			public ExternalCopyPolicy addChild(T form) {
+				return form.addCopyPolicy();
+			}
+			@Override
+			public ExternalCopyPolicy getChild(T form) {
+				return form.getCopyPolicy();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalCopyPolicy.COPY_POLICY;
+			}
+			@Override
+			public boolean hasChild(T form) {
+				return form.hasCopyPolicy();
+			}
+			@Override
+			public void removeChild(T form) {
+				form.removeCopyPolicy();
+			}
+		};
+	}
+
+	final ChildAttributeTester<T, String> buildCustomizerTester() {
+		return new ChildAttributeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalEmbeddable.CUSTOMIZER;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "org.default.MyCustomizer";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEmbeddable.CLASS;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getCustomizerClassName();
+			}
+			@Override
+			public String getValue1() {
+				return "org.test.Customizer1";
+			}
+			@Override
+			public String getValue2() {
+				return "org.test.Customizer2";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setCustomizerClassName(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final TextNodeTester<T, String> buildDescriptionTester() {
+		return new TextNodeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "test default";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEmbeddable.DESCRIPTION;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getDescription();
+			}
+			@Override
+			public String getValue1() {
+				return "testing embeddable";
+			}
+			@Override
+			public String getValue2() {
+				return "something else";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setDescription(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final ExternalFormBuilder<T> buildEmbeddableBuilder() {
+		return new ExternalFormBuilder<T>() {
+			@Override
+			@SuppressWarnings("unchecked")
+			public T buildExternalForm() throws IOException {
+				ExternalORMConfiguration orm = ORMConfigurationTests.buildExternalForm();
+				return (T) orm.addEmbeddable(defaultClassName());
+			}
+			@Override
+			public int getDefaultAttributeCount() {
+				return 1;
+			}
+			@Override
+			public Node getNode(T form) {
+				return ObjectTools.execute(form, "getElement");
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEmbeddable.EMBEDDABLE;
+			}
+			@Override
+			public List<String> getTreeNodeNames() {
+				return ListTools.list(
+					ExternalORMConfiguration.ENTITY_MAPPINGS,
+					ExternalEmbeddable.EMBEDDABLE
+				);
+			}
+		};
+	}
+
+	final ChildNodeTester<T, ExternalInstantiationCopyPolicy> buildInstantiationCopyPolicyTester() {
+		return new ChildNodeTester<T, ExternalInstantiationCopyPolicy>() {
+			@Override
+			public ExternalInstantiationCopyPolicy addChild(T form) {
+				return form.addInstantiationCopyPolicy();
+			}
+			@Override
+			public ExternalInstantiationCopyPolicy getChild(T form) {
+				return form.getInstantiationCopyPolicy();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalInstantiationCopyPolicy.INSTANTIATION_COPY_POLICY;
+			}
+			@Override
+			public boolean hasChild(T form) {
+				return form.hasInstantiationCopyPolicy();
+			}
+			@Override
+			public void removeChild(T form) {
+				form.removeInstantiationCopyPolicy();
+			}
+		};
+	}
+
+	final AttributeNodeTester<T, Boolean> buildMetadataCompleteTester() {
+		return new AttributeNodeTester<T, Boolean>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public Boolean getDefaultValue() {
+				return Boolean.TRUE;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEmbeddable.METADATA_COMPLETE;
+			}
+			@Override
+			public Boolean getValue(T form) {
+				return form.isMetadataComplete();
+			}
+			@Override
+			public Boolean getValue1() {
+				return Boolean.TRUE;
+			}
+			@Override
+			public Boolean getValue2() {
+				return Boolean.FALSE;
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, Boolean value) {
+				form.setMetadataComplete(value);
+			}
+			@Override
+			public String toString(Boolean value) {
+				return value.toString();
+			}
+		};
+	}
+
+	final ChildNodeTester<T, ExternalNoSql> buildNoSqlTester() {
+		return new ChildNodeTester<T, ExternalNoSql>() {
+			@Override
+			public ExternalNoSql addChild(T form) {
+				return form.addNoSql();
+			}
+			@Override
+			public ExternalNoSql getChild(T form) {
+				return form.getNoSql();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalNoSql.NO_SQL;
+			}
+			@Override
+			public boolean hasChild(T form) {
+				return form.hasNoSql();
+			}
+			@Override
+			public void removeChild(T form) {
+				form.removeNoSql();
+			}
+		};
+	}
+
+	final ChildListNodeTester<T, ExternalObjectTypeConverter, String> buildObjectTypeConverterTester() {
+		return ConverterTests.buildObjectTypeConverterTester();
+	}
+
+	final String buildOracleArrayTester() {
+		return "oracle-array";
+	}
+
+	final String buildOracleObjectTester() {
+		return "oracle-object";
+	}
+
+	final AttributeNodeTester<T, String> buildParentClassTester() {
+		return new AttributeNodeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "org.parent.ParentClass";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEmbeddable.PARENT_CLASS;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getParentClassName();
+			}
+			@Override
+			public String getValue1() {
+				return "org.test.ParentClass1";
+			}
+			@Override
+			public String getValue2() {
+				return "org.test.ParentClass2";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setParentClassName(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final String buildPlsqlRecordTester() {
+		return "plsql-record";
+	}
+
+	final String buildPlsqlTableTester() {
+		return "plsql-table";
+	}
+
+	final ChildListNodeTester<T, ExternalProperty, String> buildPropertyTester() {
+		return PropertyTests.buildPropertyTester();
+	}
+
+	final String buildSerializedConverterTester() {
+		return ConverterTests.buildSerializedConverterTester();
+	}
+
+	final ChildListNodeTester<T, ExternalStructConverter, String> buildStructConverterTester() {
+		return ConverterTests.buildStructConverterTester();
+	}
+
+	final String buildStructTester() {
+		return "struct";
+	}
+
+	final ChildListNodeTester<T, ExternalTypeConverter, String> buildTypeConverterTester() {
+		return ConverterTests.buildTypeConverterTester();
+	}
+
+	String defaultClassName() {
+		return "org.eclipse.persistence.tool.mappings.tests.Embeddable";
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	protected void populate(RootNodeTester<T> tester) {
+
+		tester.setBuilder(buildEmbeddableBuilder());
+
+		// Attributes
+		tester.addAttribute(buildClassTester());
+		tester.addAttribute(buildParentClassTester());                    // EclipseLink
+		tester.addAttribute(buildAccessTester());
+		tester.addAttribute(buildMetadataCompleteTester());
+
+		// Child nodes
+		tester.addTextNode(buildDescriptionTester());
+		tester.addNode(buildAccessMethodsTester());                       // EclipseLink
+		tester.addChildAttribute(buildCustomizerTester());                // EclipseLink
+		tester.addChildAttribute(buildChangeTrackingTester());            // EclipseLink
+		tester.addUnsupportedNode(buildStructTester());                   // EclipseLink
+		tester.addNode(buildNoSqlTester());                               // EclipseLink
+		tester.addListNodes(buildConverterTester());                      // EclipseLink
+		tester.addListNodes(buildTypeConverterTester());                  // EclipseLink
+		tester.addListNodes(buildObjectTypeConverterTester());            // EclipseLink
+		tester.addUnsupportedAttribute(buildSerializedConverterTester()); // EclipseLink
+		tester.addListNodes(buildStructConverterTester());                // EclipseLink
+		tester.addNode(buildCopyPolicyTester());                          // EclipseLink
+		tester.addNode(buildInstantiationCopyPolicyTester());             // EclipseLink
+		tester.addNode(buildCloneCopyPolicyTester());                     // EclipseLink
+		tester.addUnsupportedNode(buildOracleObjectTester());             // EclipseLink
+		tester.addUnsupportedNode(buildOracleArrayTester());              // EclipseLink
+		tester.addUnsupportedNode(buildPlsqlRecordTester());              // EclipseLink
+		tester.addUnsupportedNode(buildPlsqlTableTester());               // EclipseLink
+		tester.addListNodes(buildPropertyTester());                       // EclipseLink
+		tester.addListNodes(buildAttributeOverrideTester());              // EclipseLink
+		tester.addListNodes(buildAssociationOverrideTester());            // EclipseLink
+		tester.addContainerListNodes(buildAttributesTester());
+	}
+}
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/EntityTests.java b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/EntityTests.java
new file mode 100644
index 0000000..3ff132e
--- /dev/null
+++ b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/EntityTests.java
@@ -0,0 +1,390 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2013 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *
+ ******************************************************************************/
+package org.eclipse.persistence.tools.mapping.tests.dom.orm;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.persistence.InheritanceType;
+import org.eclipse.persistence.tools.mapping.orm.ExternalEntity;
+import org.eclipse.persistence.tools.mapping.orm.ExternalEntityTable;
+import org.eclipse.persistence.tools.mapping.orm.ExternalORMConfiguration;
+import org.eclipse.persistence.tools.mapping.orm.ExternalPrimaryKeyJoinColumn;
+import org.eclipse.persistence.tools.mapping.orm.ExternalSecondaryTable;
+import org.eclipse.persistence.tools.utility.ObjectTools;
+import org.eclipse.persistence.tools.utility.collection.ListTools;
+import org.w3c.dom.Node;
+
+/**
+ * This unit-tests tests the behavior of {@link ExternalEntity}.
+ *
+ * @version 2.6
+ */
+@SuppressWarnings("nls")
+public final class EntityTests extends MappedSuperclassTests<ExternalEntity> {
+
+	private String buildCascadeOnDeleteTester() {
+		return "cascade-on-delete";
+	}
+
+	private ExternalFormBuilder<ExternalEntity> buildEntityBuilder() {
+		return new ExternalFormBuilder<ExternalEntity>() {
+			@Override
+			public ExternalEntity buildExternalForm() throws IOException {
+				ExternalORMConfiguration orm = ORMConfigurationTests.buildExternalForm();
+				return orm.addEntity(defaultClassName());
+			}
+			@Override
+			public int getDefaultAttributeCount() {
+				return 1;
+			}
+			@Override
+			public Node getNode(ExternalEntity form) {
+				return ObjectTools.execute(form, "getElement");
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEntity.ENTITY;
+			}
+			@Override
+			public List<String> getTreeNodeNames() {
+				return ListTools.list(
+					ExternalORMConfiguration.ENTITY_MAPPINGS,
+					ExternalEntity.ENTITY
+				);
+			}
+		};
+	}
+
+	private String buildIndexTester() {
+		return "index";
+	}
+
+	private ChildAttributeTester<ExternalEntity, InheritanceType> buildInheritanceTester() {
+		return new ChildAttributeTester<ExternalEntity, InheritanceType>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalEntity.INHERITANCE;
+			}
+			@Override
+			public InheritanceType getDefaultValue() {
+				return InheritanceType.JOINED;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEntity.STRATEGY;
+			}
+			@Override
+			public InheritanceType getValue(ExternalEntity form) {
+				return form.getInheritenceStrategy();
+			}
+			@Override
+			public InheritanceType getValue1() {
+				return InheritanceType.SINGLE_TABLE;
+			}
+			@Override
+			public InheritanceType getValue2() {
+				return InheritanceType.TABLE_PER_CLASS;
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(ExternalEntity form, InheritanceType value) {
+				form.setInheritanceStrategy(value);
+			}
+			@Override
+			public String toString(InheritanceType value) {
+				return value.name();
+			}
+		};
+	}
+
+	private AttributeNodeTester<ExternalEntity, String> buildNameTester() {
+		return new AttributeNodeTester<ExternalEntity, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "default_name";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEntity.NAME;
+			}
+			@Override
+			public String getValue(ExternalEntity form) {
+				return form.getName();
+			}
+			@Override
+			public String getValue1() {
+				return "employee";
+			}
+			@Override
+			public String getValue2() {
+				return "address";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(ExternalEntity form, String value) {
+				form.setName(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	private String buildPrimaryKeyForeignKeyTester() {
+		return "primary-key-foreign-key";
+	}
+
+	private ChildListNodeTester<ExternalEntity, ExternalPrimaryKeyJoinColumn, String> buildPrimaryKeyJoinColumnTester() {
+		return new ChildListNodeTester<ExternalEntity, ExternalPrimaryKeyJoinColumn, String>() {
+			@Override
+			public ExternalPrimaryKeyJoinColumn addChild(ExternalEntity form, String value) {
+				return form.addPrimaryKeyJoinColumn(value);
+			}
+			@Override
+			public ExternalPrimaryKeyJoinColumn getChild(ExternalEntity form, int index) {
+				return form.getPrimaryKeyJoinColumn(index);
+			}
+			@Override
+			public ExternalPrimaryKeyJoinColumn getChildForm(List<ExternalPrimaryKeyJoinColumn> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalPrimaryKeyJoinColumn> getChildren(ExternalEntity form) {
+				return form.primaryKeyJoinColumns();
+			}
+			@Override
+			public int getChildrenSize(ExternalEntity form) {
+				return form.primaryKeyJoinColumnsSize();
+			}
+			@Override
+			public String getChildValue(ExternalPrimaryKeyJoinColumn childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "PRIMARY_KEY_JOIN_COLUMN_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalPrimaryKeyJoinColumn.PRIMARY_KEY_JOIN_COLUMN;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(ExternalEntity form, int index) {
+				form.removePrimaryKeyJoinColumn(index);
+			}
+		};
+	}
+
+	private ChildListNodeTester<ExternalEntity, ExternalSecondaryTable, String> buildSecondaryTableTester() {
+		return new ChildListNodeTester<ExternalEntity, ExternalSecondaryTable, String>() {
+			@Override
+			public ExternalSecondaryTable addChild(ExternalEntity form, String value) {
+				return form.addSecondaryTable(value, null, null);
+			}
+			@Override
+			public ExternalSecondaryTable getChild(ExternalEntity form, int index) {
+				return form.getSecondaryTable(index);
+			}
+			@Override
+			public ExternalSecondaryTable getChildForm(List<ExternalSecondaryTable> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalSecondaryTable> getChildren(ExternalEntity form) {
+				return form.secondaryTables();
+			}
+			@Override
+			public int getChildrenSize(ExternalEntity form) {
+				return form.secondaryTablesSize();
+			}
+			@Override
+			public String getChildValue(ExternalSecondaryTable childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "SECONDARY_TABLE_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalSecondaryTable.SECONDARY_TABLE;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(ExternalEntity form, int index) {
+				form.removeSecondaryTable(index);
+			}
+		};
+	}
+
+	private ChildNodeTester<ExternalEntity, ExternalEntityTable> buildTableTester() {
+		return new ChildNodeTester<ExternalEntity, ExternalEntityTable>() {
+			@Override
+			public ExternalEntityTable addChild(ExternalEntity form) {
+				return form.addPrimaryTable(null);
+			}
+			@Override
+			public ExternalEntityTable getChild(ExternalEntity form) {
+				return form.getPrimaryTable();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEntityTable.TABLE;
+			}
+			@Override
+			public boolean hasChild(ExternalEntity form) {
+				return form.hasPrimaryTable();
+			}
+			@Override
+			public void removeChild(ExternalEntity form) {
+				form.removePrimaryTable();
+			}
+		};
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	protected void populate(RootNodeTester<ExternalEntity> tester) {
+
+		tester.setBuilder(buildEntityBuilder());
+
+		// Attributes
+		tester.addAttribute(buildNameTester());
+		tester.addAttribute(buildClassTester());
+		tester.addAttribute(buildParentClassTester());            // EclipseLink
+		tester.addAttribute(buildAccessTester());
+		tester.addAttribute(buildCacheableTester());              // EclipseLink
+		tester.addAttribute(buildMetadataCompleteTester());
+		tester.addAttribute(buildReadOnlyTester());               // EclipseLink
+		tester.addAttribute(buildExistenceCheckingTester());      // EclipseLink
+		tester.addAttribute(buildExcludeDefaultMappingsTester()); // EclipseLink
+
+		// Child nodes
+		tester.addTextNode(buildDescriptionTester());
+		tester.addNode(buildAccessMethodsTester());                             // EclipseLink
+		tester.addNode(buildMultitenantTester());                               // EclipseLink
+		tester.addUnsupportedNode(buildAdditionalCriteriaTester());             // EclipseLink
+		tester.addChildAttribute(buildCustomizerTester());                      // EclipseLink
+		tester.addChildAttribute(buildChangeTrackingTester());                  // EclipseLink
+
+		tester.addNode(buildTableTester());
+		tester.addListNodes(buildSecondaryTableTester());
+		tester.addUnsupportedNode(buildStructTester());
+		tester.addListNodes(buildPrimaryKeyJoinColumnTester());
+		tester.addUnsupportedNode(buildPrimaryKeyForeignKeyTester());
+		tester.addNode(buildNoSqlTester());
+		tester.addUnsupportedNode(buildCascadeOnDeleteTester());
+		tester.addUnsupportedNode(buildIndexTester());
+
+		tester.addChildAttribute(buildIdClassTester());
+		tester.addNode(buildPrimaryKeyTester());                                // EclipseLink
+
+		tester.addChildAttribute(buildInheritanceTester());
+
+		tester.addNode(buildOptimisticLockingTester());                         // EclipseLink
+		tester.addNode(buildCacheTester());                                     // EclipseLink
+		tester.addChildAttribute(buildCacheInterceptorTester());                // EclipseLink
+		tester.addUnsupportedNode(buildCacheIndexTester());                     // EclipseLink
+		tester.addListNodes(buildFetchGroupTester());                           // EclipseLink
+		tester.addListNodes(buildConverterTester());                            // EclipseLink
+		tester.addListNodes(buildTypeConverterTester());                        // EclipseLink
+		tester.addListNodes(buildObjectTypeConverterTester());                  // EclipseLink
+		tester.addUnsupportedNode(buildSerializedConverterTester());            // EclipseLink
+		tester.addListNodes(buildStructConverterTester());                      // EclipseLink
+		tester.addNode(buildCopyPolicyTester());                                // EclipseLink
+		tester.addNode(buildInstantiationCopyPolicyTester());                   // EclipseLink
+		tester.addNode(buildCloneCopyPolicyTester());                           // EclipseLink
+		tester.addUnsupportedNode(buildSerializedObjectTester());               // EclipseLink
+		tester.addNode(buildSequenceGeneratorTester());                         // EclipseLink
+		tester.addNode(buildTableGeneratorTester());                            // EclipseLink
+		tester.addUnsupportedNode(buildUuidGeneratorTester());                  // EclipseLink
+		tester.addUnsupportedNode(buildPartitioningTester());                   // EclipseLink
+		tester.addUnsupportedNode(buildReplicationPartitioningTester());        // EclipseLink
+		tester.addUnsupportedNode(buildRoundRobinPartitioningTester());         // EclipseLink
+		tester.addUnsupportedNode(buildPinnedPartitioningTester());             // EclipseLink
+		tester.addUnsupportedNode(buildRangePartitioningTester());              // EclipseLink
+		tester.addUnsupportedNode(buildValuePartitioningTester());              // EclipseLink
+		tester.addUnsupportedNode(buildHashPartitioningTester());               // EclipseLink
+		tester.addUnsupportedNode(buildUnionPartitioningTester());              // EclipseLink
+		tester.addUnsupportedNode(buildPartitionedTester());                    // EclipseLink
+		tester.addListNodes(buildNamedQueryTester());                           // EclipseLink
+		tester.addListNodes(buildNamedNativeQueryTester());                     // EclipseLink
+		tester.addListNodes(buildNamedStoredProcedureQueryTester());            // EclipseLink
+		tester.addUnsupportedNode(buildNamedStoredFunctionQueryTester());       // EclipseLink
+		tester.addUnsupportedNode(buildNamedPlsqlStoredProcedureQueryTester()); // EclipseLink
+		tester.addUnsupportedNode(buildNamedPlsqlStoredFunctionQueryTester());  // EclipseLink
+		tester.addUnsupportedNode(buildOracleObjectTester());                   // EclipseLink
+		tester.addUnsupportedNode(buildOracleArrayTester());                    // EclipseLink
+		tester.addUnsupportedNode(buildPlsqlRecordTester());                    // EclipseLink
+		tester.addUnsupportedNode(buildPlsqlTableTester());                     // EclipseLink
+		tester.addUnsupportedNode(buildSqlResultSetMappingTester());            // EclipseLink
+		tester.addUnsupportedNode(buildQueryRedirectorsTester());               // EclipseLink
+		tester.addBooleanNode(buildExcludeDefaultListenersTester());
+		tester.addBooleanNode(buildExcludeSuperclassListenersTester());
+		tester.addContainerListNodes(buildEntityListenersTester());
+		tester.addChildAttribute(buildPrePersistClassTester());
+		tester.addChildAttribute(buildPostPersistClassTester());
+		tester.addChildAttribute(buildPreRemoveClassTester());
+		tester.addChildAttribute(buildPostRemoveClassTester());
+		tester.addChildAttribute(buildPreUpdateClassTester());
+		tester.addChildAttribute(buildPostUpdateClassTester());
+		tester.addChildAttribute(buildPostLoadClassTester());
+		tester.addListNodes(buildPropertyTester());                             // EclipseLink
+		tester.addListNodes(buildAttributeOverrideTester());                    // EclipseLink
+		tester.addListNodes(buildAssociationOverrideTester());                  // EclipseLink
+		tester.addContainerListNodes(buildAttributesTester());
+	}
+}
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/MappedSuperclassTests.java b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/MappedSuperclassTests.java
new file mode 100644
index 0000000..6586336
--- /dev/null
+++ b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/MappedSuperclassTests.java
@@ -0,0 +1,1253 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ *
+ * This software is the proprietary information of Oracle Corporation.
+ * Use is subject to license terms.
+ */
+package org.eclipse.persistence.tools.mapping.tests.dom.orm;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.persistence.annotations.ExistenceType;
+import org.eclipse.persistence.tools.mapping.orm.ExternalBasicNamedQuery;
+import org.eclipse.persistence.tools.mapping.orm.ExternalCache;
+import org.eclipse.persistence.tools.mapping.orm.ExternalEmbeddable;
+import org.eclipse.persistence.tools.mapping.orm.ExternalEntityListener;
+import org.eclipse.persistence.tools.mapping.orm.ExternalFetchGroup;
+import org.eclipse.persistence.tools.mapping.orm.ExternalMappedSuperClass;
+import org.eclipse.persistence.tools.mapping.orm.ExternalMultitenancyPolicy;
+import org.eclipse.persistence.tools.mapping.orm.ExternalNamedQuery;
+import org.eclipse.persistence.tools.mapping.orm.ExternalNamedStoredProcedureQuery;
+import org.eclipse.persistence.tools.mapping.orm.ExternalNativeQuery;
+import org.eclipse.persistence.tools.mapping.orm.ExternalORMConfiguration;
+import org.eclipse.persistence.tools.mapping.orm.ExternalOptimisticLocking;
+import org.eclipse.persistence.tools.mapping.orm.ExternalPrimaryKey;
+import org.eclipse.persistence.tools.mapping.orm.ExternalSequenceGenerator;
+import org.eclipse.persistence.tools.mapping.orm.ExternalTableGenerator;
+import org.eclipse.persistence.tools.utility.ObjectTools;
+import org.eclipse.persistence.tools.utility.collection.ListTools;
+import org.w3c.dom.Node;
+
+/**
+ * This unit-tests tests the behavior of {@link ExternalMappedSuperClass}.
+ *
+ * @version 2.6
+ */
+@SuppressWarnings("nls")
+public class MappedSuperclassTests<T extends ExternalMappedSuperClass> extends EmbeddableTests<T> {
+
+	final String buildAdditionalCriteriaTester() {
+		return "additional-criteria";
+	}
+
+	final AttributeNodeTester<T, Boolean> buildCacheableTester() {
+		return new AttributeNodeTester<T, Boolean>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public Boolean getDefaultValue() {
+				return Boolean.TRUE;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.CACHEABLE;
+			}
+			@Override
+			public Boolean getValue(T form) {
+				return form.isCacheable();
+			}
+			@Override
+			public Boolean getValue1() {
+				return Boolean.TRUE;
+			}
+			@Override
+			public Boolean getValue2() {
+				return Boolean.FALSE;
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, Boolean value) {
+				form.setCacheable(value);
+			}
+			@Override
+			public String toString(Boolean value) {
+				return value.toString();
+			}
+		};
+	}
+
+	final String buildCacheIndexTester() {
+		return "cache-index";
+	}
+
+	final ChildAttributeTester<T, String> buildCacheInterceptorTester() {
+		return new ChildAttributeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalMappedSuperClass.CACHE_INTERCEPTOR;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "org.test.CacheInterceptor";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEmbeddable.CLASS;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getCacheInterceptorClassName();
+			}
+			@Override
+			public String getValue1() {
+				return "org.test.MainCacheInterceptor";
+			}
+			@Override
+			public String getValue2() {
+				return "org.test.AnotherCacheInterceptor";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setCacheInterceptorClassName(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final ChildNodeTester<T, ExternalCache> buildCacheTester() {
+		return new ChildNodeTester<T, ExternalCache>() {
+			@Override
+			public ExternalCache addChild(T form) {
+				return form.addCache();
+			}
+			@Override
+			public ExternalCache getChild(T form) {
+				return form.getCache();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalCache.CACHE;
+			}
+			@Override
+			public boolean hasChild(T form) {
+				return form.hasCache();
+			}
+			@Override
+			public void removeChild(T form) {
+				form.removeCache();
+			}
+		};
+	}
+
+	final ContainerChildListNodeTester<T, ExternalEntityListener, String> buildEntityListenersTester() {
+		return new ContainerChildListNodeTester<T, ExternalEntityListener, String>() {
+			@Override
+			public ExternalEntityListener addChild(T form, String value) {
+				return form.addEntityListener(value);
+			}
+			@Override
+			public ExternalEntityListener getChild(T form, int index) {
+				return form.getEntityListener(index);
+			}
+			@Override
+			public ExternalEntityListener getChildForm(List<ExternalEntityListener> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalEntityListener> getChildren(T form) {
+				return form.entityListeners();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.entityListenersSize();
+			}
+			@Override
+			public String getChildValue(ExternalEntityListener childForm) {
+				return childForm.getClassName();
+			}
+			@Override
+			public String getContainerNodeName() {
+				return ExternalEntityListener.ENTITY_LISTENERS;
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "ENTITY_LISTENER_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEntityListener.ENTITY_LISTENER;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeEntityListener(index);
+			}
+		};
+	}
+
+	final BooleanChildNodeTester<T> buildExcludeDefaultListenersTester() {
+		return new BooleanChildNodeTester<T>() {
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.EXCLUDE_DEFAULT_LISTENERS;
+			}
+			@Override
+			public boolean getValue(T form) {
+				return form.shouldExcludesDefaultListeners();
+			}
+			@Override
+			public void setValue(T form, boolean value) {
+				form.setExcludesDefaultListeners(value);
+			}
+		};
+	}
+
+	final AttributeNodeTester<T, Boolean> buildExcludeDefaultMappingsTester() {
+		return new AttributeNodeTester<T, Boolean>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public Boolean getDefaultValue() {
+				return Boolean.TRUE;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.EXCLUDE_DEFAULT_MAPPINGS;
+			}
+			@Override
+			public Boolean getValue(T form) {
+				return form.isExcludeDefaultMappings();
+			}
+			@Override
+			public Boolean getValue1() {
+				return Boolean.TRUE;
+			}
+			@Override
+			public Boolean getValue2() {
+				return Boolean.FALSE;
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, Boolean value) {
+				form.setExcludeDefaultMappings(value);
+			}
+			@Override
+			public String toString(Boolean value) {
+				return value.toString();
+			}
+		};
+	}
+
+	final BooleanChildNodeTester<T> buildExcludeSuperclassListenersTester() {
+		return new BooleanChildNodeTester<T>() {
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.EXCLUDE_SUPERCLASS_LISTENERS;
+			}
+			@Override
+			public boolean getValue(T form) {
+				return form.shouldExcludesSuperclassListeners();
+			}
+			@Override
+			public void setValue(T form, boolean value) {
+				form.setExcludesSuperclassListeners(value);
+			}
+		};
+	}
+
+	final AttributeNodeTester<T, ExistenceType> buildExistenceCheckingTester() {
+		return new AttributeNodeTester<T, ExistenceType>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public ExistenceType getDefaultValue() {
+				return ExistenceType.CHECK_DATABASE;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.EXISTENCE_CHECKING;
+			}
+			@Override
+			public ExistenceType getValue(T form) {
+				return form.getExistenceCheckingType();
+			}
+			@Override
+			public ExistenceType getValue1() {
+				return ExistenceType.ASSUME_NON_EXISTENCE;
+			}
+			@Override
+			public ExistenceType getValue2() {
+				return ExistenceType.CHECK_CACHE;
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, ExistenceType value) {
+				form.setExistenceCheckingType(value);
+			}
+			@Override
+			public String toString(ExistenceType value) {
+				return value.toString();
+			}
+		};
+	}
+
+	final ChildListNodeTester<T, ExternalFetchGroup, String> buildFetchGroupTester() {
+		return new ChildListNodeTester<T, ExternalFetchGroup, String>() {
+			@Override
+			public ExternalFetchGroup addChild(T form, String value) {
+				return form.addFetchGroup(value);
+			}
+			@Override
+			public ExternalFetchGroup getChild(T form, int index) {
+				return form.getFetchGroup(index);
+			}
+			@Override
+			public ExternalFetchGroup getChildForm(List<ExternalFetchGroup> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalFetchGroup> getChildren(T form) {
+				return form.fetchGroups();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.fetchGroupsSize();
+			}
+			@Override
+			public String getChildValue(ExternalFetchGroup childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "FETCH_GROUP_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalFetchGroup.FETCH_GROUP;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeFetchGroup(index);
+			}
+		};
+	}
+
+	final String buildHashPartitioningTester() {
+		return "hash-partitioning";
+	}
+
+	final ChildAttributeTester<T, String> buildIdClassTester() {
+		return new ChildAttributeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalMappedSuperClass.ID_CLASS;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "org.test.IDClass";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalEmbeddable.CLASS;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getIdClassName();
+			}
+			@Override
+			public String getValue1() {
+				return "org.test.IDClass_1";
+			}
+			@Override
+			public String getValue2() {
+				return "org.test.IDClass_2";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setIdClassName(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	private ExternalFormBuilder<T> buildMappedSuperclassBuilder() {
+		return new ExternalFormBuilder<T>() {
+			@Override
+			@SuppressWarnings("unchecked")
+			public T buildExternalForm() throws IOException {
+				ExternalORMConfiguration orm = ORMConfigurationTests.buildExternalForm();
+				return (T) orm.addMappedSuperClass(defaultClassName());
+			}
+			@Override
+			public int getDefaultAttributeCount() {
+				return 1;
+			}
+			@Override
+			public Node getNode(T form) {
+				return ObjectTools.execute(form, "getElement");
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.MAPPED_SUPERCLASS;
+			}
+			@Override
+			public List<String> getTreeNodeNames() {
+				return ListTools.list(
+					ExternalORMConfiguration.ENTITY_MAPPINGS,
+					ExternalMappedSuperClass.MAPPED_SUPERCLASS
+				);
+			}
+		};
+	}
+
+	final ChildNodeTester<T, ExternalMultitenancyPolicy> buildMultitenantTester() {
+		return new ChildNodeTester<T, ExternalMultitenancyPolicy>() {
+			@Override
+			public ExternalMultitenancyPolicy addChild(T form) {
+				return form.addMultitenancy();
+			}
+			@Override
+			public ExternalMultitenancyPolicy getChild(T form) {
+				return form.getMultitenancy();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMultitenancyPolicy.MULTITENANT;
+			}
+			@Override
+			public boolean hasChild(T form) {
+				return form.hasMultitenancy();
+			}
+			@Override
+			public void removeChild(T form) {
+				form.removeMultiTenancy();
+			}
+		};
+	}
+
+	final ChildListNodeTester<T, ExternalNativeQuery, String> buildNamedNativeQueryTester() {
+		return new ChildListNodeTester<T, ExternalNativeQuery, String>() {
+			@Override
+			public ExternalNativeQuery addChild(T form, String value) {
+				return form.addNativeQuery(value);
+			}
+			@Override
+			public ExternalNativeQuery getChild(T form, int index) {
+				return form.getNativeQuery(index);
+			}
+			@Override
+			public ExternalNativeQuery getChildForm(List<ExternalNativeQuery> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalNativeQuery> getChildren(T form) {
+				return form.nativeQueries();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.nativeQueriesSize();
+			}
+			@Override
+			public String getChildValue(ExternalNativeQuery childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "NAMED_NATIVE_QUERY_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalNativeQuery.NAMED_NATIVE_QUERY;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeNativeQuery(index);
+			}
+		};
+	}
+
+	final String buildNamedPlsqlStoredFunctionQueryTester() {
+		return "named-plsql-stored-function-query";
+	}
+
+	final String buildNamedPlsqlStoredProcedureQueryTester() {
+		return "named-plsql-stored-procedure-query";
+	}
+
+	final ChildListNodeTester<T, ExternalNamedQuery, String> buildNamedQueryTester() {
+		return new ChildListNodeTester<T, ExternalNamedQuery, String>() {
+			@Override
+			public ExternalNamedQuery addChild(T form, String value) {
+				return form.addNamedQuery(value);
+			}
+			@Override
+			public ExternalNamedQuery getChild(T form, int index) {
+				return form.getNamedQuery(index);
+			}
+			@Override
+			public ExternalNamedQuery getChildForm(List<ExternalNamedQuery> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalNamedQuery> getChildren(T form) {
+				return form.namedQueries();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.namedQueriesSize();
+			}
+			@Override
+			public String getChildValue(ExternalNamedQuery childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "NAMED_QUERY_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalBasicNamedQuery.NAMED_QUERY;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeNamedQuery(index);
+			}
+		};
+	}
+
+	final String buildNamedStoredFunctionQueryTester() {
+		return "named-stored-function-query";
+	}
+
+	final ChildListNodeTester<T, ExternalNamedStoredProcedureQuery, String> buildNamedStoredProcedureQueryTester() {
+		return new ChildListNodeTester<T, ExternalNamedStoredProcedureQuery, String>() {
+			@Override
+			public ExternalNamedStoredProcedureQuery addChild(T form, String value) {
+				return form.addStoredProcedureQuery(value);
+			}
+			@Override
+			public ExternalNamedStoredProcedureQuery getChild(T form, int index) {
+				return form.getStoredProcedureQuery(index);
+			}
+			@Override
+			public ExternalNamedStoredProcedureQuery getChildForm(List<ExternalNamedStoredProcedureQuery> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalNamedStoredProcedureQuery> getChildren(T form) {
+				return form.storedProcedureQueries();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.storedProcedureQueriesSize();
+			}
+			@Override
+			public String getChildValue(ExternalNamedStoredProcedureQuery childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "NAMED_STORED_PROCEDURE_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalNamedStoredProcedureQuery.NAMED_STORED_PROCEDURE_QUERY;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeStoredProcedureQuery(index);
+			}
+		};
+	}
+
+	final ChildNodeTester<T, ExternalOptimisticLocking> buildOptimisticLockingTester() {
+		return new ChildNodeTester<T, ExternalOptimisticLocking>() {
+			@Override
+			public ExternalOptimisticLocking addChild(T form) {
+				return form.addOptimisticLocking();
+			}
+			@Override
+			public ExternalOptimisticLocking getChild(T form) {
+				return form.getOptimisticLocking();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalOptimisticLocking.OPTIMISTIC_LOCKING;
+			}
+			@Override
+			public boolean hasChild(T form) {
+				return form.hasOptimisticLocking();
+			}
+			@Override
+			public void removeChild(T form) {
+				form.removeOptimisticLocking();
+			}
+		};
+	}
+
+	final String buildPartitionedTester() {
+		return "partitioned";
+	}
+
+	final String buildPartitioningTester() {
+		return "partitioning";
+	}
+
+	final String buildPinnedPartitioningTester() {
+		return "pinned-partitioning";
+	}
+
+	final ChildAttributeTester<T, String> buildPostLoadClassTester() {
+		return new ChildAttributeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalMappedSuperClass.POST_LOAD;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "postLoad";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.METHOD_NAME;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getPostLoadMethod();
+			}
+			@Override
+			public String getValue1() {
+				return "postLoadMethod1";
+			}
+			@Override
+			public String getValue2() {
+				return "postLoadMethod2";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setPostLoadMethod(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final ChildAttributeTester<T, String> buildPostPersistClassTester() {
+		return new ChildAttributeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalMappedSuperClass.POST_PERSIST;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "postPersist";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.METHOD_NAME;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getPostPersistMethod();
+			}
+			@Override
+			public String getValue1() {
+				return "postPersistMethod1";
+			}
+			@Override
+			public String getValue2() {
+				return "postPersistMethod2";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setPostPersistMethod(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final ChildAttributeTester<T, String> buildPostRemoveClassTester() {
+		return new ChildAttributeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalMappedSuperClass.POST_REMOVE;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "postRemove";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.METHOD_NAME;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getPostRemoveMethod();
+			}
+			@Override
+			public String getValue1() {
+				return "postRemoveMethod1";
+			}
+			@Override
+			public String getValue2() {
+				return "postRemoveMethod2";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setPostRemoveMethod(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final ChildAttributeTester<T, String> buildPostUpdateClassTester() {
+		return new ChildAttributeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalMappedSuperClass.POST_UPDATE;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "postRemove";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.METHOD_NAME;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getPostUpdateMethod();
+			}
+			@Override
+			public String getValue1() {
+				return "postRemoveMethod1";
+			}
+			@Override
+			public String getValue2() {
+				return "postRemoveMethod2";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setPostUpdateMethod(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final ChildAttributeTester<T, String> buildPrePersistClassTester() {
+		return new ChildAttributeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalMappedSuperClass.PRE_PERSIST;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "prePersist";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.METHOD_NAME;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getPrePersistMethod();
+			}
+			@Override
+			public String getValue1() {
+				return "prePersistMethod1";
+			}
+			@Override
+			public String getValue2() {
+				return "prePersistMethod2";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setPrePersistMethod(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final ChildAttributeTester<T, String> buildPreRemoveClassTester() {
+		return new ChildAttributeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalMappedSuperClass.PRE_REMOVE;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "preRemove";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.METHOD_NAME;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getPreRemoveMethod();
+			}
+			@Override
+			public String getValue1() {
+				return "preRemoveMethod1";
+			}
+			@Override
+			public String getValue2() {
+				return "preRemoveMethod2";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setPreRemoveMethod(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final ChildAttributeTester<T, String> buildPreUpdateClassTester() {
+		return new ChildAttributeTester<T, String>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public String getChildNodeName() {
+				return ExternalMappedSuperClass.PRE_UPDATE;
+			}
+			@Override
+			public String getDefaultValue() {
+				return "preUpdate";
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.METHOD_NAME;
+			}
+			@Override
+			public String getValue(T form) {
+				return form.getPreUpdateMethod();
+			}
+			@Override
+			public String getValue1() {
+				return "preUpdateMethod1";
+			}
+			@Override
+			public String getValue2() {
+				return "preUpdateMethod2";
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, String value) {
+				form.setPreUpdateMethod(value);
+			}
+			@Override
+			public String toString(String value) {
+				return value;
+			}
+		};
+	}
+
+	final ChildNodeTester<T, ExternalPrimaryKey> buildPrimaryKeyTester() {
+		return new ChildNodeTester<T, ExternalPrimaryKey>() {
+			@Override
+			public ExternalPrimaryKey addChild(T form) {
+				return form.addPrimaryKey();
+			}
+			@Override
+			public ExternalPrimaryKey getChild(T form) {
+				return form.getPrimaryKey();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalPrimaryKey.PRIMARY_KEY;
+			}
+			@Override
+			public boolean hasChild(T form) {
+				return form.hasPrimaryKey();
+			}
+			@Override
+			public void removeChild(T form) {
+				form.removePrimaryKey();
+			}
+		};
+	}
+
+	final String buildQueryRedirectorsTester() {
+		return "query-redirectors";
+	}
+
+	final String buildRangePartitioningTester() {
+		return "range-partitioning";
+	}
+
+	final AttributeNodeTester<T, Boolean> buildReadOnlyTester() {
+		return new AttributeNodeTester<T, Boolean>() {
+			@Override
+			public boolean doesNodeAlreadyExist() {
+				return false;
+			}
+			@Override
+			public Boolean getDefaultValue() {
+				return Boolean.TRUE;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalMappedSuperClass.READ_ONLY;
+			}
+			@Override
+			public Boolean getValue(T form) {
+				return form.isReadOnly();
+			}
+			@Override
+			public Boolean getValue1() {
+				return Boolean.TRUE;
+			}
+			@Override
+			public Boolean getValue2() {
+				return Boolean.FALSE;
+			}
+			@Override
+			public boolean isNullAllowed() {
+				return true;
+			}
+			@Override
+			public void setValue(T form, Boolean value) {
+				form.setReadOnly(value);
+			}
+			@Override
+			public String toString(Boolean value) {
+				return value.toString();
+			}
+		};
+	}
+
+	final String buildReplicationPartitioningTester() {
+		return "replication-partitioning";
+	}
+
+	final String buildRoundRobinPartitioningTester() {
+		return "round-robin-partitioning";
+	}
+
+	final ChildNodeTester<T, ExternalSequenceGenerator> buildSequenceGeneratorTester() {
+		return new ChildNodeTester<T, ExternalSequenceGenerator>() {
+			@Override
+			public ExternalSequenceGenerator addChild(T form) {
+				return form.addSequenceGenerator();
+			}
+			@Override
+			public ExternalSequenceGenerator getChild(T form) {
+				return form.getSequenceGenerator();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalSequenceGenerator.SEQUENCE_GENERATOR;
+			}
+			@Override
+			public boolean hasChild(T form) {
+				return form.hasSequenceGenerator();
+			}
+			@Override
+			public void removeChild(T form) {
+				form.removeSequenceGenerator();
+			}
+		};
+	}
+
+	final String buildSerializedObjectTester() {
+		return "serialized-object";
+	}
+
+	final String buildSqlResultSetMappingTester() {
+		return "sql-result-set-mapping";
+	}
+
+	final ChildNodeTester<T, ExternalTableGenerator> buildTableGeneratorTester() {
+		return new ChildNodeTester<T, ExternalTableGenerator>() {
+			@Override
+			public ExternalTableGenerator addChild(T form) {
+				return form.addTableGenerator();
+			}
+			@Override
+			public ExternalTableGenerator getChild(T form) {
+				return form.getTableGenerator();
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalTableGenerator.TABLE_GENERATOR;
+			}
+			@Override
+			public boolean hasChild(T form) {
+				return form.hasTableGenerator();
+			}
+			@Override
+			public void removeChild(T form) {
+				form.removeTableGenerator();
+			}
+		};
+	}
+
+	final String buildUnionPartitioningTester() {
+		return "union-partitioning";
+	}
+
+	final String buildUuidGeneratorTester() {
+		return "uuid-generator";
+	}
+
+	final String buildValuePartitioningTester() {
+		return "value-partitioning";
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	String defaultClassName() {
+		return "org.eclipse.persistence.tool.mappings.tests.MappedSuperclass";
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	protected void populate(RootNodeTester<T> tester) {
+
+		tester.setBuilder(buildMappedSuperclassBuilder());
+
+		// Attributes
+		tester.addAttribute(buildClassTester());
+		tester.addAttribute(buildParentClassTester());            // EclipseLink
+		tester.addAttribute(buildAccessTester());
+		tester.addAttribute(buildCacheableTester());              // EclipseLink
+		tester.addAttribute(buildMetadataCompleteTester());
+		tester.addAttribute(buildReadOnlyTester());               // EclipseLink
+		tester.addAttribute(buildExistenceCheckingTester());      // EclipseLink
+		tester.addAttribute(buildExcludeDefaultMappingsTester()); // EclipseLink
+
+		// Child nodes
+		tester.addTextNode(buildDescriptionTester());
+		tester.addNode(buildAccessMethodsTester());                             // EclipseLink
+		tester.addNode(buildMultitenantTester());                               // EclipseLink
+		tester.addUnsupportedNode(buildAdditionalCriteriaTester());             // EclipseLink
+		tester.addChildAttribute(buildCustomizerTester());                      // EclipseLink
+		tester.addChildAttribute(buildChangeTrackingTester());                  // EclipseLink
+		tester.addChildAttribute(buildIdClassTester());
+		tester.addNode(buildPrimaryKeyTester());                                // EclipseLink
+		tester.addNode(buildOptimisticLockingTester());                         // EclipseLink
+		tester.addNode(buildCacheTester());                                     // EclipseLink
+		tester.addChildAttribute(buildCacheInterceptorTester());                // EclipseLink
+		tester.addUnsupportedNode(buildCacheIndexTester());                     // EclipseLink
+		tester.addListNodes(buildFetchGroupTester());                           // EclipseLink
+		tester.addListNodes(buildConverterTester());                            // EclipseLink
+		tester.addListNodes(buildTypeConverterTester());                        // EclipseLink
+		tester.addListNodes(buildObjectTypeConverterTester());                  // EclipseLink
+		tester.addUnsupportedNode(buildSerializedConverterTester());            // EclipseLink
+		tester.addListNodes(buildStructConverterTester());                      // EclipseLink
+		tester.addNode(buildCopyPolicyTester());                                // EclipseLink
+		tester.addNode(buildInstantiationCopyPolicyTester());                   // EclipseLink
+		tester.addNode(buildCloneCopyPolicyTester());                           // EclipseLink
+		tester.addUnsupportedNode(buildSerializedObjectTester());               // EclipseLink
+		tester.addNode(buildSequenceGeneratorTester());                         // EclipseLink
+		tester.addNode(buildTableGeneratorTester());                            // EclipseLink
+		tester.addUnsupportedNode(buildUuidGeneratorTester());                  // EclipseLink
+		tester.addUnsupportedNode(buildPartitioningTester());                   // EclipseLink
+		tester.addUnsupportedNode(buildReplicationPartitioningTester());        // EclipseLink
+		tester.addUnsupportedNode(buildRoundRobinPartitioningTester());         // EclipseLink
+		tester.addUnsupportedNode(buildPinnedPartitioningTester());             // EclipseLink
+		tester.addUnsupportedNode(buildRangePartitioningTester());              // EclipseLink
+		tester.addUnsupportedNode(buildValuePartitioningTester());              // EclipseLink
+		tester.addUnsupportedNode(buildHashPartitioningTester());               // EclipseLink
+		tester.addUnsupportedNode(buildUnionPartitioningTester());              // EclipseLink
+		tester.addUnsupportedNode(buildPartitionedTester());                    // EclipseLink
+		tester.addListNodes(buildNamedQueryTester());                           // EclipseLink
+		tester.addListNodes(buildNamedNativeQueryTester());                     // EclipseLink
+		tester.addListNodes(buildNamedStoredProcedureQueryTester());            // EclipseLink
+		tester.addUnsupportedNode(buildNamedStoredFunctionQueryTester());       // EclipseLink
+		tester.addUnsupportedNode(buildNamedPlsqlStoredProcedureQueryTester()); // EclipseLink
+		tester.addUnsupportedNode(buildNamedPlsqlStoredFunctionQueryTester());  // EclipseLink
+		tester.addUnsupportedNode(buildOracleObjectTester());                   // EclipseLink
+		tester.addUnsupportedNode(buildOracleArrayTester());                    // EclipseLink
+		tester.addUnsupportedNode(buildPlsqlRecordTester());                    // EclipseLink
+		tester.addUnsupportedNode(buildPlsqlTableTester());                     // EclipseLink
+		tester.addUnsupportedNode(buildSqlResultSetMappingTester());            // EclipseLink
+		tester.addUnsupportedNode(buildQueryRedirectorsTester());               // EclipseLink
+		tester.addBooleanNode(buildExcludeDefaultListenersTester());
+		tester.addBooleanNode(buildExcludeSuperclassListenersTester());
+		tester.addContainerListNodes(buildEntityListenersTester());
+		tester.addChildAttribute(buildPrePersistClassTester());
+		tester.addChildAttribute(buildPostPersistClassTester());
+		tester.addChildAttribute(buildPreRemoveClassTester());
+		tester.addChildAttribute(buildPostRemoveClassTester());
+		tester.addChildAttribute(buildPreUpdateClassTester());
+		tester.addChildAttribute(buildPostUpdateClassTester());
+		tester.addChildAttribute(buildPostLoadClassTester());
+		tester.addListNodes(buildPropertyTester());                             // EclipseLink
+		tester.addListNodes(buildAttributeOverrideTester());                    // EclipseLink
+		tester.addListNodes(buildAssociationOverrideTester());                  // EclipseLink
+		tester.addContainerListNodes(buildAttributesTester());
+	}
+}
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/ORMConfigurationTests.java b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/ORMConfigurationTests.java
index 19bdc48..97a14a1 100644
--- a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/ORMConfigurationTests.java
+++ b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/ORMConfigurationTests.java
@@ -17,8 +17,6 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Vector;
-import javax.xml.XMLConstants;
 import org.eclipse.persistence.tools.mapping.orm.AccessType;
 import org.eclipse.persistence.tools.mapping.orm.ExternalBasicNamedQuery;
 import org.eclipse.persistence.tools.mapping.orm.ExternalClassConverter;
@@ -50,60 +48,32 @@
 @SuppressWarnings("nls")
 public final class ORMConfigurationTests extends AbstractExternalFormTests<ExternalORMConfiguration> {
 
+	public static ORMConfiguration buildExternalForm() throws IOException {
+		ORMRepository repository = new ORMRepository();
+		return repository.buildORMConfiguration(null, defaultVersion());
+	}
+
+	public static ORMDocumentType defaultVersion() {
+		return ORMDocumentType.ECLIPELINK_2_6;
+	}
+
 	private String buildAccessMethodsTester() {
 		return "access-methods";
 	}
 
 	private TextNodeTester<ExternalORMConfiguration, AccessType> buildAccessTester() {
-		return new TextNodeTester<ExternalORMConfiguration, AccessType>() {
-			@Override
-			public boolean doesNodeExistAlready() {
-				return false;
-			}
-			@Override
-			public AccessType getDefaultValue() {
-				return null;
-			}
-			@Override
-			public String getNodeName() {
-				return ExternalORMConfiguration.ACCESS;
-			}
-			@Override
-			public AccessType getValue(ExternalORMConfiguration form) {
-				return form.getAccessType();
-			}
-			@Override
-			public AccessType getValue1() {
-				return AccessType.PROPERTY;
-			}
-			@Override
-			public AccessType getValue2() {
-				return AccessType.VIRTUAL;
-			}
-			@Override
-			public boolean isNullAllowed() {
-				return true;
-			}
-			@Override
-			public void setValue(ExternalORMConfiguration form, AccessType value) {
-				form.setAccessType(value);
-			}
-			@Override
-			public String toString(AccessType value) {
-				return value.name();
-			}
-		};
+		return AccessTypeTests.buildAccessTextNodeTester();
 	}
 
 	private TextNodeTester<ExternalORMConfiguration, String> buildCatalogTester() {
 		return new TextNodeTester<ExternalORMConfiguration, String>() {
 			@Override
-			public boolean doesNodeExistAlready() {
+			public boolean doesNodeAlreadyExist() {
 				return false;
 			}
 			@Override
 			public String getDefaultValue() {
-				return null;
+				return "CATALOG_DEFAULT";
 			}
 			@Override
 			public String getNodeName() {
@@ -115,11 +85,11 @@
 			}
 			@Override
 			public String getValue1() {
-				return "cat";
+				return "CATALOG_VALUE_1";
 			}
 			@Override
 			public String getValue2() {
-				return "EL";
+				return "CATALOG_VALUE_2";
 			}
 			@Override
 			public boolean isNullAllowed() {
@@ -137,57 +107,18 @@
 	}
 
 	private ChildListNodeTester<ExternalORMConfiguration, ExternalClassConverter, String> buildConverterTester() {
-		return new ChildListNodeTester<ExternalORMConfiguration, ExternalClassConverter, String>() {
-			@Override
-			public ExternalClassConverter addChild(ExternalORMConfiguration form, String value) {
-				ExternalClassConverter converter = form.addConverter();
-				converter.setName(value);
-				return converter;
-			}
-			@Override
-			public ExternalClassConverter getChild(ExternalORMConfiguration form, int index) {
-				return form.getConverter(index);
-			}
-			@Override
-			public List<ExternalClassConverter> getChildren(ExternalORMConfiguration form) {
-				return form.converters();
-			}
-			@Override
-			public int getChildrenSize(ExternalORMConfiguration form) {
-				return form.convertersSize();
-			}
-			@Override
-			public String getChildValue(ExternalClassConverter childForm) {
-				return childForm.getName();
-			}
-			@Override
-			public List<String> getChildValues() {
-				List<String> values = new ArrayList<String>();
-				for (int index = 0; index < 10; index++) {
-					values.add("CLASS_CONVERTER_" + index);
-				}
-				return values;
-			}
-			@Override
-			public String getNodeName() {
-				return ExternalClassConverter.CONVERTER;
-			}
-			@Override
-			public void removeChild(ExternalORMConfiguration form, int index) {
-				form.removeConverter(index);
-			}
-		};
+		return ConverterTests.buildConverterTester();
 	}
 
 	private TextNodeTester<ExternalORMConfiguration, String> buildDescriptionTester() {
 		return new TextNodeTester<ExternalORMConfiguration, String>() {
 			@Override
-			public boolean doesNodeExistAlready() {
+			public boolean doesNodeAlreadyExist() {
 				return false;
 			}
 			@Override
 			public String getDefaultValue() {
-				return null;
+				return "default description";
 			}
 			@Override
 			public String getNodeName() {
@@ -231,6 +162,10 @@
 				return form.getEmbeddable(index);
 			}
 			@Override
+			public ExternalEmbeddable getChildForm(List<ExternalEmbeddable> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
 			public List<ExternalEmbeddable> getChildren(ExternalORMConfiguration form) {
 				return form.embeddables();
 			}
@@ -243,10 +178,14 @@
 				return childForm.getClassName();
 			}
 			@Override
-			public List<String> getChildValues() {
+			public String getExpectedChildValue(int index) {
+				return "org.eclipse.persistence.tools.mappings.Embeddable_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
 				List<String> values = new ArrayList<String>();
 				for (int index = 0; index < 10; index++) {
-					values.add("org.eclipse.persistence.tools.mappings.Embeddable_" + index);
+					values.add(getExpectedChildValue(index));
 				}
 				return values;
 			}
@@ -255,6 +194,10 @@
 				return ExternalEmbeddable.EMBEDDABLE;
 			}
 			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
 			public void removeChild(ExternalORMConfiguration form, int index) {
 				form.removeEmbeddable(index);
 			}
@@ -272,6 +215,10 @@
 				return form.getEntity(index);
 			}
 			@Override
+			public ExternalEntity getChildForm(List<ExternalEntity> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
 			public List<ExternalEntity> getChildren(ExternalORMConfiguration form) {
 				return form.entities();
 			}
@@ -284,10 +231,14 @@
 				return childForm.getClassName();
 			}
 			@Override
-			public List<String> getChildValues() {
+			public String getExpectedChildValue(int index) {
+				return "org.eclipse.persistence.tools.mappings.Entity_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
 				List<String> values = new ArrayList<String>();
 				for (int index = 0; index < 10; index++) {
-					values.add("org.eclipse.persistence.tools.mappings.Entity_" + index);
+					values.add(getExpectedChildValue(index));
 				}
 				return values;
 			}
@@ -296,6 +247,10 @@
 				return ExternalEntity.ENTITY;
 			}
 			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
 			public void removeChild(ExternalORMConfiguration form, int index) {
 				form.removeEntity(index);
 			}
@@ -317,6 +272,10 @@
 				return form.getMappedSuperClass(index);
 			}
 			@Override
+			public ExternalMappedSuperClass getChildForm(List<ExternalMappedSuperClass> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
 			public List<ExternalMappedSuperClass> getChildren(ExternalORMConfiguration form) {
 				return form.mappedSuperClasses();
 			}
@@ -329,10 +288,14 @@
 				return childForm.getClassName();
 			}
 			@Override
-			public List<String> getChildValues() {
+			public String getExpectedChildValue(int index) {
+				return "org.eclipse.persistence.tools.mappings.MappedSuperclass_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
 				List<String> values = new ArrayList<String>();
 				for (int index = 0; index < 10; index++) {
-					values.add("org.eclipse.persistence.tools.mappings.MappedSuperclass_" + index);
+					values.add(getExpectedChildValue(index));
 				}
 				return values;
 			}
@@ -341,6 +304,10 @@
 				return ExternalMappedSuperClass.MAPPED_SUPERCLASS;
 			}
 			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
 			public void removeChild(ExternalORMConfiguration form, int index) {
 				form.removeMappedSuperClass(index);
 			}
@@ -358,6 +325,10 @@
 				return form.getNamedNativeQuery(index);
 			}
 			@Override
+			public ExternalNativeQuery getChildForm(List<ExternalNativeQuery> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
 			public List<ExternalNativeQuery> getChildren(ExternalORMConfiguration form) {
 				return form.namedNativeQueries();
 			}
@@ -370,10 +341,14 @@
 				return childForm.getName();
 			}
 			@Override
-			public List<String> getChildValues() {
+			public String getExpectedChildValue(int index) {
+				return "NAMED_NATIVE_QUERY_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
 				List<String> values = new ArrayList<String>();
 				for (int index = 0; index < 10; index++) {
-					values.add("NAMED_NATIVE_QUERY_" + index);
+					values.add(getExpectedChildValue(index));
 				}
 				return values;
 			}
@@ -382,6 +357,10 @@
 				return ExternalNativeQuery.NAMED_NATIVE_QUERY;
 			}
 			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
 			public void removeChild(ExternalORMConfiguration form, int index) {
 				form.removeNativeQuery(index);
 			}
@@ -407,6 +386,10 @@
 				return form.getNamedQuery(index);
 			}
 			@Override
+			public ExternalBasicNamedQuery getChildForm(List<ExternalBasicNamedQuery> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
 			public List<ExternalBasicNamedQuery> getChildren(ExternalORMConfiguration form) {
 				return form.namedQueries();
 			}
@@ -419,10 +402,14 @@
 				return childForm.getName();
 			}
 			@Override
-			public List<String> getChildValues() {
+			public String getExpectedChildValue(int index) {
+				return "NAMED_QUERY_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
 				List<String> values = new ArrayList<String>();
 				for (int index = 0; index < 10; index++) {
-					values.add("NAMED_QUERY_" + index);
+					values.add(getExpectedChildValue(index));
 				}
 				return values;
 			}
@@ -431,6 +418,10 @@
 				return ExternalBasicNamedQuery.NAMED_QUERY;
 			}
 			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
 			public void removeChild(ExternalORMConfiguration form, int index) {
 				form.removeNamedQuery(index);
 			}
@@ -452,6 +443,10 @@
 				return form.getNamedStoredProcedureQuery(index);
 			}
 			@Override
+			public ExternalNamedStoredProcedureQuery getChildForm(List<ExternalNamedStoredProcedureQuery> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
 			public List<ExternalNamedStoredProcedureQuery> getChildren(ExternalORMConfiguration form) {
 				return form.storedProcedureQueries();
 			}
@@ -464,10 +459,14 @@
 				return childForm.getName();
 			}
 			@Override
-			public List<String> getChildValues() {
+			public String getExpectedChildValue(int index) {
+				return "NAMED_STORED_PROCEDURE_QUERY_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
 				List<String> values = new ArrayList<String>();
 				for (int index = 0; index < 10; index++) {
-					values.add("NAMED_STORED_PROCEDURE_QUERY_" + index);
+					values.add(getExpectedChildValue(index));
 				}
 				return values;
 			}
@@ -476,6 +475,10 @@
 				return ExternalNamedStoredProcedureQuery.NAMED_STORED_PROCEDURE_QUERY;
 			}
 			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
 			public void removeChild(ExternalORMConfiguration form, int index) {
 				form.removeStoredProcedureQuery(index);
 			}
@@ -483,46 +486,7 @@
 	}
 
 	private ChildListNodeTester<ExternalORMConfiguration, ExternalObjectTypeConverter, String> buildObjectTypeConverterTester() {
-		return new ChildListNodeTester<ExternalORMConfiguration, ExternalObjectTypeConverter, String>() {
-			@Override
-			public ExternalObjectTypeConverter addChild(ExternalORMConfiguration form, String value) {
-				ExternalObjectTypeConverter childForm = form.addObjectTypeConverter();
-				childForm.setName(value);
-				return childForm;
-			}
-			@Override
-			public ExternalObjectTypeConverter getChild(ExternalORMConfiguration form, int index) {
-				return form.getObjectTypeConverter(index);
-			}
-			@Override
-			public List<ExternalObjectTypeConverter> getChildren(ExternalORMConfiguration form) {
-				return form.objectTypeConverters();
-			}
-			@Override
-			public int getChildrenSize(ExternalORMConfiguration form) {
-				return form.objectTypeConvertersSize();
-			}
-			@Override
-			public String getChildValue(ExternalObjectTypeConverter childForm) {
-				return childForm.getName();
-			}
-			@Override
-			public List<String> getChildValues() {
-				List<String> values = new ArrayList<String>();
-				for (int index = 0; index < 10; index++) {
-					values.add("OBJECT_TYPE_CONVERTER_" + index);
-				}
-				return values;
-			}
-			@Override
-			public String getNodeName() {
-				return ExternalObjectTypeConverter.OBJECT_TYPE_CONVERTER;
-			}
-			@Override
-			public void removeChild(ExternalORMConfiguration form, int index) {
-				form.removeObjectTypeConverter(index);
-			}
-		};
+		return ConverterTests.buildObjectTypeConverterTester();
 	}
 
 	private String buildOracleArrayTester() {
@@ -537,8 +501,7 @@
 		return new ExternalFormBuilder<ORMConfiguration>() {
 			@Override
 			public ORMConfiguration buildExternalForm() throws IOException {
-				ORMRepository repository = new ORMRepository();
-				return repository.buildORMConfiguration(null, defaultVersion());
+				return ORMConfigurationTests.buildExternalForm();
 			}
 			@Override
 			public int getDefaultAttributeCount() {
@@ -562,12 +525,12 @@
 	private TextNodeTester<ExternalORMConfiguration, String> buildPackageTester() {
 		return new TextNodeTester<ExternalORMConfiguration, String>() {
 			@Override
-			public boolean doesNodeExistAlready() {
+			public boolean doesNodeAlreadyExist() {
 				return false;
 			}
 			@Override
 			public String getDefaultValue() {
-				return null;
+				return "org.eclipse.persistence";
 			}
 			@Override
 			public String getNodeName() {
@@ -579,11 +542,11 @@
 			}
 			@Override
 			public String getValue1() {
-				return Vector.class.getPackage().getName();
+				return "org.test";
 			}
 			@Override
 			public String getValue2() {
-				return XMLConstants.class.getPackage().getName();
+				return "java.io";
 			}
 			@Override
 			public boolean isNullAllowed() {
@@ -656,12 +619,12 @@
 	private TextNodeTester<ExternalORMConfiguration, String> buildSchemaTester() {
 		return new TextNodeTester<ExternalORMConfiguration, String>() {
 			@Override
-			public boolean doesNodeExistAlready() {
+			public boolean doesNodeAlreadyExist() {
 				return false;
 			}
 			@Override
 			public String getDefaultValue() {
-				return null;
+				return "SCHEMA_DEFAULT";
 			}
 			@Override
 			public String getNodeName() {
@@ -705,6 +668,10 @@
 				return form.getSequenceGenerator(index);
 			}
 			@Override
+			public ExternalSequenceGenerator getChildForm(List<ExternalSequenceGenerator> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
 			public List<ExternalSequenceGenerator> getChildren(ExternalORMConfiguration form) {
 				return form.sequenceGenerators();
 			}
@@ -717,10 +684,14 @@
 				return childForm.getName();
 			}
 			@Override
-			public List<String> getChildValues() {
+			public String getExpectedChildValue(int index) {
+				return "SEQUENCE_GENERATOR_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
 				List<String> values = new ArrayList<String>();
 				for (int index = 0; index < 10; index++) {
-					values.add("SEQUENCE_GENERATOR_" + index);
+					values.add(getExpectedChildValue(index));
 				}
 				return values;
 			}
@@ -729,6 +700,10 @@
 				return ExternalSequenceGenerator.SEQUENCE_GENERATOR;
 			}
 			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
 			public void removeChild(ExternalORMConfiguration form, int index) {
 				form.removeSequenceGenerator(index);
 			}
@@ -750,6 +725,10 @@
 				return form.getSqlResultSetMapping(index);
 			}
 			@Override
+			public ExternalSQLResultSetMapping getChildForm(List<ExternalSQLResultSetMapping> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
 			public List<ExternalSQLResultSetMapping> getChildren(ExternalORMConfiguration form) {
 				return form.sqlResultSetMappings();
 			}
@@ -762,10 +741,14 @@
 				return childForm.getName();
 			}
 			@Override
-			public List<String> getChildValues() {
+			public String getExpectedChildValue(int index) {
+				return "SQL_RESULT_SET_MAPPING_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
 				List<String> values = new ArrayList<String>();
 				for (int index = 0; index < 10; index++) {
-					values.add("SQL_RESULT_SET_MAPPING_" + index);
+					values.add(getExpectedChildValue(index));
 				}
 				return values;
 			}
@@ -774,6 +757,10 @@
 				return ExternalSQLResultSetMapping.SQL_RESULT_SET_MAPPING;
 			}
 			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
 			public void removeChild(ExternalORMConfiguration form, int index) {
 				form.removeSqlResultSetMapping(index);
 			}
@@ -781,46 +768,7 @@
 	}
 
 	private ChildListNodeTester<ExternalORMConfiguration, ExternalStructConverter, String> buildStructConverterTester() {
-		return new ChildListNodeTester<ExternalORMConfiguration, ExternalStructConverter, String>() {
-			@Override
-			public ExternalStructConverter addChild(ExternalORMConfiguration form, String value) {
-				ExternalStructConverter childForm = form.addStructConverter();
-				childForm.setName(value);
-				return childForm;
-			}
-			@Override
-			public ExternalStructConverter getChild(ExternalORMConfiguration form, int index) {
-				return form.getStructConverter(index);
-			}
-			@Override
-			public List<ExternalStructConverter> getChildren(ExternalORMConfiguration form) {
-				return form.structConverters();
-			}
-			@Override
-			public int getChildrenSize(ExternalORMConfiguration form) {
-				return form.structConvertersSize();
-			}
-			@Override
-			public String getChildValue(ExternalStructConverter childForm) {
-				return childForm.getName();
-			}
-			@Override
-			public List<String> getChildValues() {
-				List<String> values = new ArrayList<String>();
-				for (int index = 0; index < 10; index++) {
-					values.add("STRUCT_CONVERTER_" + index);
-				}
-				return values;
-			}
-			@Override
-			public String getNodeName() {
-				return ExternalStructConverter.STRUCT_CONVERTER;
-			}
-			@Override
-			public void removeChild(ExternalORMConfiguration form, int index) {
-				form.removeStructConverter(index);
-			}
-		};
+		return ConverterTests.buildStructConverterTester();
 	}
 
 	private ChildListNodeTester<ExternalORMConfiguration, ExternalTableGenerator, String> buildTableGeneratorTester() {
@@ -834,6 +782,10 @@
 				return form.getTableGenerator(index);
 			}
 			@Override
+			public ExternalTableGenerator getChildForm(List<ExternalTableGenerator> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
 			public List<ExternalTableGenerator> getChildren(ExternalORMConfiguration form) {
 				return form.tableGenerators();
 			}
@@ -846,10 +798,14 @@
 				return childForm.getName();
 			}
 			@Override
-			public List<String> getChildValues() {
+			public String getExpectedChildValue(int index) {
+				return "TABLE_GENERATOR_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
 				List<String> values = new ArrayList<String>();
 				for (int index = 0; index < 10; index++) {
-					values.add("TABLE_GENERATOR_" + index);
+					values.add(getExpectedChildValue(index));
 				}
 				return values;
 			}
@@ -858,6 +814,10 @@
 				return ExternalTableGenerator.TABLE_GENERATOR;
 			}
 			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
 			public void removeChild(ExternalORMConfiguration form, int index) {
 				form.removeTableGenerator(index);
 			}
@@ -877,6 +837,10 @@
 				return form.getDiscriminatorColumn(index);
 			}
 			@Override
+			public ExternalTenantDiscriminatorColumn getChildForm(List<ExternalTenantDiscriminatorColumn> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
 			public List<ExternalTenantDiscriminatorColumn> getChildren(ExternalORMConfiguration form) {
 				return form.discriminatorColumns();
 			}
@@ -889,10 +853,14 @@
 				return childForm.getName();
 			}
 			@Override
-			public List<String> getChildValues() {
+			public String getExpectedChildValue(int index) {
+				return Integer.toString(index);
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
 				List<String> values = new ArrayList<String>();
 				for (int index = 0; index < 10; index++) {
-					values.add(Integer.toString(index));
+					values.add(getExpectedChildValue(index));
 				}
 				return values;
 			}
@@ -901,6 +869,10 @@
 				return ExternalTenantDiscriminatorColumn.TENANT_DISCRIMINATOR_COLUMN;
 			}
 			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
 			public void removeChild(ExternalORMConfiguration form, int index) {
 				form.removeDiscriminatorColumn(index);
 			}
@@ -908,46 +880,7 @@
 	}
 
 	private ChildListNodeTester<ExternalORMConfiguration, ExternalTypeConverter, String> buildTypeConverterTester() {
-		return new ChildListNodeTester<ExternalORMConfiguration, ExternalTypeConverter, String>() {
-			@Override
-			public ExternalTypeConverter addChild(ExternalORMConfiguration form, String value) {
-				ExternalTypeConverter childForm = form.addTypeConverter();
-				childForm.setName(value);
-				return childForm;
-			}
-			@Override
-			public ExternalTypeConverter getChild(ExternalORMConfiguration form, int index) {
-				return form.getTypeConverter(index);
-			}
-			@Override
-			public List<ExternalTypeConverter> getChildren(ExternalORMConfiguration form) {
-				return form.typeConverters();
-			}
-			@Override
-			public int getChildrenSize(ExternalORMConfiguration form) {
-				return form.typeConvertersSize();
-			}
-			@Override
-			public String getChildValue(ExternalTypeConverter childForm) {
-				return childForm.getName();
-			}
-			@Override
-			public List<String> getChildValues() {
-				List<String> values = new ArrayList<String>();
-				for (int index = 0; index < 10; index++) {
-					values.add("TYPE_CONVERTER_" + index);
-				}
-				return values;
-			}
-			@Override
-			public String getNodeName() {
-				return ExternalTypeConverter.TYPE_CONVERTER;
-			}
-			@Override
-			public void removeChild(ExternalORMConfiguration form, int index) {
-				form.removeTypeConverter(index);
-			}
-		};
+		return ConverterTests.buildTypeConverterTester();
 	}
 
 	private String buildUnionPartitioningTester() {
@@ -965,7 +898,7 @@
 	private AttributeNodeTester<ExternalORMConfiguration, ORMDocumentType> buildVersionTester() {
 		return new AttributeNodeTester<ExternalORMConfiguration, ORMDocumentType>() {
 			@Override
-			public boolean doesNodeExistAlready() {
+			public boolean doesNodeAlreadyExist() {
 				return true;
 			}
 			@Override
@@ -1003,10 +936,6 @@
 		};
 	}
 
-	private ORMDocumentType defaultVersion() {
-		return ORMDocumentType.ECLIPELINK_2_6;
-	}
-
 	/**
 	 * {@inheritDoc}
 	 */
@@ -1027,7 +956,7 @@
 		tester.addTextNode(buildAccessTester());
 		tester.addUnsupportedNode(buildAccessMethodsTester());                  // EclipseLink
 		tester.addListNodes(buildTenantDiscriminatorColumnTester());            // EclipseLink
-//		tester.addListNodes(buildConverterTester());                            // EclipseLink : mixed converter
+		tester.addListNodes(buildConverterTester());                            // EclipseLink : mixed converter
 		tester.addListNodes(buildTypeConverterTester());                        // EclipseLink
 		tester.addListNodes(buildObjectTypeConverterTester());                  // EclipseLink
 		tester.addUnsupportedNode(buildSerializedConverterTester());            // EclipseLink
@@ -1057,6 +986,6 @@
 		tester.addListNodes(buildMappedSuperclassTester());
 		tester.addListNodes(buildEntityTester());
 		tester.addListNodes(buildEmbeddableTester());
-		tester.addListNodes(buildConverterTester());
+//		tester.addListNodes(buildConverterTester());                            // Generic JPA, we'll assume EclipseLink
 	}
 }
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/PropertyTests.java b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/PropertyTests.java
new file mode 100644
index 0000000..78e2a52
--- /dev/null
+++ b/tools/org.eclipse.persistence.tools.mapping.tests/src/org/eclipse/persistence/tools/mapping/tests/dom/orm/PropertyTests.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2013 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *
+ ******************************************************************************/
+package org.eclipse.persistence.tools.mapping.tests.dom.orm;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.persistence.tools.mapping.ExternalProperty;
+import org.eclipse.persistence.tools.mapping.ExternalPropertyHolder;
+import org.eclipse.persistence.tools.mapping.tests.AbstractExternalFormTests.ChildListNodeTester;
+
+/**
+ * Defines the various testers for {@link ExternalPropertyHolder}.
+ *
+ * @version 2.6
+ */
+@SuppressWarnings("nls")
+public final class PropertyTests {
+
+	/**
+	 * Cannot instantiate a new <code>PropertyTests</code>.
+	 */
+	private PropertyTests() {
+		super();
+	}
+
+	public static <T extends ExternalPropertyHolder> ChildListNodeTester<T, ExternalProperty, String> buildPropertyTester() {
+		return new ChildListNodeTester<T, ExternalProperty, String>() {
+			@Override
+			public ExternalProperty addChild(T form, String value) {
+				return form.addProperty(value, null);
+			}
+			@Override
+			public ExternalProperty getChild(T form, int index) {
+				return form.getProperty(index);
+			}
+			@Override
+			public ExternalProperty getChildForm(List<ExternalProperty> childForms, int index) {
+				return childForms.get(index);
+			}
+			@Override
+			public List<ExternalProperty> getChildren(T form) {
+				return form.properties();
+			}
+			@Override
+			public int getChildrenSize(T form) {
+				return form.propertiesSize();
+			}
+			@Override
+			public String getChildValue(ExternalProperty childForm) {
+				return childForm.getName();
+			}
+			@Override
+			public String getExpectedChildValue(int index) {
+				return "PROPERTY_" + index;
+			}
+			@Override
+			public List<String> getExpectedChildValues() {
+				List<String> values = new ArrayList<String>();
+				for (int index = 0; index < 10; index++) {
+					values.add(getExpectedChildValue(index));
+				}
+				return values;
+			}
+			@Override
+			public String getNodeName() {
+				return ExternalProperty.PROPERTY;
+			}
+			@Override
+			public List<String> getNodeNames() {
+				return Collections.singletonList(getNodeName());
+			}
+			@Override
+			public void removeChild(T form, int index) {
+				form.removeProperty(index);
+			}
+		};
+	}
+}
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping/META-INF/MANIFEST.MF b/tools/org.eclipse.persistence.tools.mapping/META-INF/MANIFEST.MF
index 5cdb826..5d37073 100644
--- a/tools/org.eclipse.persistence.tools.mapping/META-INF/MANIFEST.MF
+++ b/tools/org.eclipse.persistence.tools.mapping/META-INF/MANIFEST.MF
@@ -3,9 +3,9 @@
 Bundle-Name: Mapping
 Bundle-SymbolicName: org.eclipse.persistence.tools.mapping
 Bundle-Version: 2.6.0.qualifier
-Require-Bundle: org.eclipse.persistence.core;bundle-version="2.4.0",
- javax.persistence;bundle-version="2.0.0",
- org.eclipse.persistence.tools.utility;bundle-version="2.6.0"
+Require-Bundle: javax.persistence;bundle-version="2.0.0",
+ org.eclipse.persistence.core;bundle-version="2.4.0",
+ org.eclipse.persistence.tools.utility;bundle-version="[2.6.0,2.7.0)"
 Export-Package: org.eclipse.persistence.tools.mapping,
  org.eclipse.persistence.tools.mapping.orm,
  org.eclipse.persistence.tools.mapping.orm.dom,
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/AbstractExternalForm.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/AbstractExternalForm.java
index b3b327a..d2c5f93 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/AbstractExternalForm.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/AbstractExternalForm.java
@@ -130,7 +130,7 @@
 			element = parent.addSelf();
 		}
 
-		return addChild(element, elementName);
+		return addChild(element, elementName, parent.getElementNamesOrder());
 	}
 
 	/**
@@ -227,112 +227,6 @@
 	}
 
 	/**
-	 * Adds a series of new children elements to the element represented by this external form. Each
-	 * child will be added to the previously added child.
-	 *
-	 *<pre><code>&lt;element&gt;
-	 *  |- &lt;child&gt; (index 0 in the given array)
-	 *       |- &lt;child&gt; (index 1 in the given array)
-	 *            |- ...
-	 *                 |- &lt;child&gt; (index n-1 in the given array)</code></pre>
-	 *
-	 * @param parent The parent of this external form used to retrieve the parent element
-	 * @param elementNamesOrder The list of element names used to determine the insertion point of
-	 * the first child node
-	 * @param elementNames The names of the new child elements to add
-	 * @return The deepest newly created child element
-	 */
-	public final Element addChildrenTree(AbstractExternalForm parent,
-	                                     List<String> elementNamesOrder,
-	                                     String... elementNames) {
-
-		return addChildrenTree(parent.getElement(), elementNamesOrder, elementNames);
-	}
-
-	/**
-	 * Adds a series of new children elements to the element represented by this external form. Each
-	 * child will be added to the previously added child.
-	 *
-	 *<pre><code>&lt;element&gt;
-	 *  |- &lt;child&gt; (index 0 in the given array)
-	 *       |- &lt;child&gt; (index 1 in the given array)
-	 *            |- ...
-	 *                 |- &lt;child&gt; (index n-1 in the given array)</code></pre>
-	 *
-	 * @param element The element from which to start adding child nodes
-	 * @param elementNamesOrder The list of element names used to determine the insertion point of
-	 * the first child node
-	 * @param elementNames The names of the new child elements to add
-	 * @return The deepest newly created child element
-	 */
-	public final Element addChildrenTree(Element element,
-	                                     List<String> elementNamesOrder,
-	                                     String... elementNames) {
-
-		ExternalFormHelper formHelper = getHelper();
-		Element childElement = element;
-
-		for (String elementName : elementNames) {
-
-			Element child = getChild(childElement, elementName);
-
-			if (child == null) {
-				childElement = formHelper.addChild(this, childElement, elementName, elementNamesOrder);
-			}
-			else {
-				childElement = child;
-			}
-
-			elementNamesOrder = Collections.emptyList();
-		}
-
-		return childElement;
-	}
-
-	/**
-	 * Adds a series of new children elements to the element represented by this external form. Each
-	 * child will be added to the previously added child.
-	 *
-	 *<pre><code>&lt;element&gt;
-	 *  |- &lt;child&gt; (index 0 in the given array)
-	 *       |- &lt;child&gt; (index 1 in the given array)
-	 *            |- ...
-	 *                 |- &lt;child&gt; (index n-1 in the given array)</code></pre>
-	 *
-	 * @param elementNamesOrder The list of element names used to determine the insertion point of
-	 * the first child node
-	 * @param elementNames The names of the new child elements to add
-	 * @return The deepest newly created child element
-	 */
-	public final Element addChildrenTree(List<String> elementNamesOrder, String... elementNames) {
-
-		Element element = getElement();
-
-		if (element == null) {
-			element = addSelf();
-		}
-
-		return addChildrenTree(element, elementNamesOrder, elementNames);
-	}
-
-	/**
-	 * Adds a series of new children elements to the element represented by this external form. Each
-	 * child will be added to the previously added child.
-	 *
-	 *<pre><code>&lt;element&gt;
-	 *  |- &lt;child&gt; (index 0 in the given array)
-	 *       |- &lt;child&gt; (index 1 in the given array)
-	 *            |- ...
-	 *                 |- &lt;child&gt; (index n-1 in the given array)</code></pre>
-	 *
-	 * @param elementNames The names of the new child elements to add
-	 * @return The deepest newly created child element
-	 */
-	public final Element addChildrenTree(String... elementNames) {
-		return addChildrenTree(getElementNamesOrder(), elementNames);
-	}
-
-	/**
 	 * Adds a child text node to the given parent element.
 	 *
 	 * @param element The element to which a new child element will be added
@@ -980,11 +874,11 @@
 
 		Element element = getChild(childName);
 
-		if (element == null) {
-			return null;
+		if (element != null) {
+			return getAttribute(element, attributeName);
 		}
 
-		return getAttribute(element, attributeName);
+		return null;
 	}
 
 	/**
@@ -1997,7 +1891,9 @@
 			NamedNodeMap attributes = element.getAttributes();
 
 			if (attributes != null) {
+
 				for (int index = attributes.getLength(); --index >= 0; ) {
+
 					Node node = attributes.item(index);
 					String localName = node.getNodeName();
 					String value = node.getNodeValue();
@@ -2291,7 +2187,7 @@
 	 * Determines whether the given element has a child with the given element name.
 	 *
 	 * @param element The element used to check if it has a child with the given name
-	 * @param index The position of the child element to check it's existence, which is only based on
+	 * @param index The position of the child element to check its existence, which is only based on
 	 * the count of children of the same type and to make sure the index is smaller than the children size
 	 * @param elementName The name of the element
 	 * @return <code>true</code> if a child with the given name was found; <code>false</code> otherwise
@@ -2321,7 +2217,7 @@
 	 * Determines whether the element represented by this external form has a child with the given element name.
 	 *
 	 * @param elementName The name of the element
-	 * @param index The position of the child element to check it's existence, which is only based on
+	 * @param index The position of the child element to check its existence, which is only based on
 	 * the count of children of the same type and to make sure the index is smaller than the children size
 	 * @return <code>true</code> if a child with the given name was found; <code>false</code> otherwise
 	 */
@@ -2402,7 +2298,7 @@
 	 * @param elementName The name of the new child element
 	 * @return The position of the given child
 	 */
-	protected int index(Element parent, Element child, String elementName) {
+	protected final int index(Element parent, Element child, String elementName) {
 		return getChildren(parent, elementName).indexOf(child);
 	}
 
@@ -2417,28 +2313,28 @@
 	/**
 	 * Returns true if node is non-null and is of type ATTRIBUTE_NODE.
 	 */
-	protected boolean isAttribute(Node node) {
+	protected final boolean isAttribute(Node node) {
 		return isNodeType(node, Node.ATTRIBUTE_NODE);
 	}
 
 	/**
 	 * Returns true if node is non-null and is of type ELEMENT_NODE.
 	 */
-	protected boolean isElement(Node node) {
+	protected final boolean isElement(Node node) {
 		return isNodeType(node, Node.ELEMENT_NODE);
 	}
 
 	/**
 	 * Wrapper around {@link Node#getNodeType} test that returns false for a <code>null</code> node.
 	 */
-	protected boolean isNodeType(Node node, int type) {
+	protected final boolean isNodeType(Node node, int type) {
 		return (node != null) && (node.getNodeType() == type);
 	}
 
 	/**
 	 * Returns true if node is non-null and is of type TEXT_NODE.
 	 */
-	protected boolean isText(Node node) {
+	protected final boolean isText(Node node) {
 		return isNodeType(node, Node.TEXT_NODE);
 	}
 
@@ -3249,7 +3145,7 @@
 		}
 
 		if (value != null) {
-			setAttribute(element, attributeName, value);
+			setAttribute(element, attributeName, value, Collections.<String>emptyList());
 		}
 		else if (element != null) {
 			removeChild(childName);
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/DefaultFormHelper.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/DefaultFormHelper.java
index 24a56dc..ebfca09 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/DefaultFormHelper.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/DefaultFormHelper.java
@@ -281,7 +281,7 @@
 			}
 				// This will insert the attribute at the end of the list of attributes
 			else {
-				element.setAttribute(attributeName, value);
+				element.setAttributeNode(newAttribute);
 			}
 		}
 	}
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalConverterProvider.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalConverterProvider.java
new file mode 100644
index 0000000..4916bfb
--- /dev/null
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalConverterProvider.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2013 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation
+ *
+ ******************************************************************************/
+package org.eclipse.persistence.tools.mapping.orm;
+
+import java.util.List;
+import org.eclipse.persistence.tools.mapping.ExternalForm;
+
+/**
+ * Defines an external ORM object that holds on to different flavor of converters.
+ * <p>
+ * Provisional API: This interface is part of an interim API that is still under development and
+ * expected to change significantly before reaching stability. It is available at this early stage
+ * to solicit feedback from pioneering adopters on the understanding that any code that uses this
+ * API will almost certainly be broken (repeatedly) as the API evolves.<p>
+ *
+ * @version 2.6
+ */
+public interface ExternalConverterProvider extends ExternalForm {
+
+	/**
+	 * Adds a converter to this entity.
+	 */
+	ExternalClassConverter addConverter(String name);
+
+	/**
+	 * Adds a object type converter to this entity.
+	 */
+	ExternalObjectTypeConverter addObjectTypeConverter(String name);
+
+	/**
+	 * Adds a struct converter to this entity.
+	 */
+	ExternalStructConverter addStructConverter(String name);
+
+	/**
+	 * Adds a type converter to this entity.
+	 */
+	ExternalTypeConverter addTypeConverter(String name);
+
+	/**
+	 * Returns a list of the converters defined for this entity.
+	 */
+	List<ExternalClassConverter> converters();
+
+	/**
+	 * Returns the count of converters defined for this entity.
+	 */
+	int convertersSize();
+
+	/**
+	 * Returns the converter at the given position.
+	 */
+	ExternalClassConverter getConverter(int index);
+
+	/**
+	 * Returns the object type converter at the given position.
+	 */
+	ExternalObjectTypeConverter getObjectTypeConverter(int index);
+
+	/**
+	 * Returns the struct type converter at the given position.
+	 */
+	ExternalStructConverter getStructConverter(int index);
+
+	/**
+	 * Returns the converter at the given position.
+	 */
+	ExternalTypeConverter getTypeConverter(int index);
+
+	/**
+	 * Returns a list of the object type converters defined for this entity.
+	 */
+	List<ExternalObjectTypeConverter> objectTypeConverters();
+
+	/**
+	 * Returns the count of the object type converters defined for this entity.
+	 */
+	int objectTypeConvertersSize();
+
+	/**
+	 * Removes the converter specified at the given position.
+	 */
+	void removeConverter(int index);
+
+	/**
+	 * Removes the object type converter specified at the given position.
+	 */
+	void removeObjectTypeConverter(int index);
+
+	/**
+	 * Removes the struct converter specified at the given position.
+	 */
+	void removeStructConverter(int index);
+
+	/**
+	 * Removes the type converter specified at the given position.
+	 */
+	void removeTypeConverter(int index);
+
+	/**
+	 * Returns a list of the struct converters defined for this entity.
+	 */
+	List<ExternalStructConverter> structConverters();
+
+	/**
+	 * Returns the count of converters defined for this entity.
+	 */
+	int structConvertersSize();
+
+	/**
+	 * Returns a list of the converters defined for this entity.
+	 */
+	List<ExternalTypeConverter> typeConverters();
+
+	/**
+	 * Returns the count of type converters defined for this entity.
+	 */
+	int typeConvertersSize();
+}
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalConvertibleMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalConvertibleMapping.java
index b7bd46f..5adce71 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalConvertibleMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalConvertibleMapping.java
@@ -35,11 +35,36 @@
 	String CONVERT = "convert";
 
 	/**
+	 * Sets the mapping to use this converter for its value converter.
+	 */
+	ExternalConverter addConverter();
+
+	/**
+	 * Sets the mapping to use this object type converter for its value converter.
+	 */
+	ExternalObjectTypeConverter addObjectTypeConverter();
+
+	/**
+	 * Sets the mapping to use this struct converter for its value converter.
+	 */
+	ExternalStructConverter addStructConverter();
+
+	/**
+	 * Sets the mapping to use this type converter for its value converter.
+	 */
+	ExternalTypeConverter addTypeConverter();
+
+	/**
 	 * Returns the converter string for this mapping.
 	 */
 	String getConvert();
 
 	/**
+	 * Returns the value converter for this mapping.
+	 */
+	ExternalClassConverter getConverter();
+
+	/**
 	 * Returns the {@link TextRange} for the converter string for this mapping.
 	 */
 	TextRange getConvertTextRange();
@@ -60,49 +85,24 @@
 	ExternalTypeConverter getTypeConverter();
 
 	/**
-	 * Returns the value converter for this mapping.
-	 */
-	ExternalClassConverter getValueConverter();
-
-	/**
 	 * Removes the value converter from mapping.
 	 */
-	void removeValueConverter();
+	void removeConverter();
 
 	/**
 	 * Removes the value object type converter from mapping.
 	 */
-	void removeValueObjectTypeConverter();
+	void removeObjectTypeConverter();
 
 	/**
 	 * Removes the value struct converter from mapping.
 	 */
-	void removeValueStructConverter();
+	void removeStructConverter();
 
 	/**
 	 * Removes the value type converter from mapping.
 	 */
-	void removeValueTypeConverter();
-
-	/**
-	 * Sets the mapping to use this converter for its value converter.
-	 */
-	void setAsValueConverter();
-
-	/**
-	 * Sets the mapping to use this object type converter for its value converter.
-	 */
-	void setAsValueObjectTypeConverter();
-
-	/**
-	 * Sets the mapping to use this struct converter for its value converter.
-	 */
-	void setAsValueStructConverter();
-
-	/**
-	 * Sets the mapping to use this type converter for its value converter.
-	 */
-	void setAsValueTypeConverter();
+	void removeTypeConverter();
 
 	/**
 	 * Sets the value converter string.
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEmbeddable.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEmbeddable.java
index 218d288..0da604a 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEmbeddable.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEmbeddable.java
@@ -34,7 +34,8 @@
  */
 @SuppressWarnings("nls")
 public interface ExternalEmbeddable extends ExternalAccessType,
-                                            ExternalPropertyHolder {
+                                            ExternalPropertyHolder,
+                                            ExternalConverterProvider {
 
 	/**
 	 * The element name used to store and retrieve the change-tracking child node.
@@ -73,6 +74,11 @@
 	String METADATA_COMPLETE = "metadata-complete";
 
 	/**
+	 * The attribute name used to store and retrieve the parent class name.
+	 */
+	String PARENT_CLASS = "parent-class";
+
+	/**
 	 * The attribute name used to store and retrieve the type child text node of the change-tracking child node.
 	 */
 	String TYPE = "type";
@@ -83,6 +89,16 @@
 	ExternalAccessMethods addAccessMethods(String getMethodName, String setMethodName);
 
 	/**
+	 * Adds a override with the given name.
+	 */
+	ExternalAssociationOverride addAssociationOverride(String name);
+
+	/**
+	 * Adds a override with the given name.
+	 */
+	ExternalAttributeOverride addAttributeOverride(String name);
+
+	/**
 	 * Adds a basic collection mapping with the given name.
 	 */
 	ExternalBasicCollectionMapping addBasicCollectionMapping(String name);
@@ -103,11 +119,6 @@
 	ExternalCloneCopyPolicy addCloneCopyPolicy();
 
 	/**
-	 * Adds a converter to this entity.
-	 */
-	ExternalClassConverter addConverter(String name);
-
-	/**
 	 * Adds copy policy to this entity
 	 */
 	ExternalCopyPolicy addCopyPolicy();
@@ -148,11 +159,6 @@
 	ExternalNoSql addNoSql();
 
 	/**
-	 * Adds a object type converter to this entity.
-	 */
-	ExternalObjectTypeConverter addObjectTypeConverter(String name);
-
-	/**
 	 * Adds a one-to-many mapping with the given name.
 	 */
 	ExternalOneToManyMapping addOneToManyMapping(String name);
@@ -163,29 +169,29 @@
 	ExternalOneToOneMapping addOneToOneMapping(String name);
 
 	/**
-	 * Adds a struct converter to this entity.
-	 */
-	ExternalStructConverter addStructConverter(String name);
-
-	/**
 	 * Adds a transient mapping with the given name.
 	 */
 	ExternalTransientMapping addTransientMapping(String name);
 
 	/**
-	 * Adds a type converter to this entity.
+	 * Returns a list of association overrides defined on this entity.
 	 */
-	ExternalTypeConverter addTypeConverter(String name);
+	List<ExternalAssociationOverride> associationOverrides();
 
 	/**
-	 * Returns a list of the converters defined for this entity.
+	 * Returns the count of association overrides defined on this entity.
 	 */
-	List<ExternalClassConverter> converters();
+	int associationOverridesSize();
 
 	/**
-	 * Returns the count of converters defined for this entity.
+	 * Returns a list of attribute overrides defined for this entity.
 	 */
-	int convertersSize();
+	List<ExternalAttributeOverride> attributeOverrides();
+
+	/**
+	 * Returns the count attribute overrides defined for this entity.
+	 */
+	int attributeOverridesSize();
 
 	/**
 	 * Returns the access methods for this mapping.
@@ -193,6 +199,16 @@
 	ExternalAccessMethods getAccessMethods();
 
 	/**
+	 * Returns the association override at the specified index.
+	 */
+	ExternalAssociationOverride getAssociationOverride(int index);
+
+	/**
+	 * Returns the association override at the specified index.
+	 */
+	ExternalAttributeOverride getAttributeOverride(int index);
+
+	/**
 	 * Returns the change tracking type for this entity
 	 */
 	ChangeTrackingType getChangeTrackingType();
@@ -223,11 +239,6 @@
 	ExternalCloneCopyPolicy getCloneCopyPolicy();
 
 	/**
-	 * Returns the converter at the given position.
-	 */
-	ExternalClassConverter getConverter(int index);
-
-	/**
 	 * Returns the copy policy for this entity.
 	 */
 	ExternalCopyPolicy getCopyPolicy();
@@ -266,7 +277,12 @@
 	ExternalInstantiationCopyPolicy getInstantiationCopyPolicy();
 
 	/**
-	 * Returns the mapping with the same name as the name parameter.
+	 * Returns the mapping at the specified position.
+	 */
+	ExternalMapping getMapping(int index);
+
+	/**
+	 * Returns the mapping with the given name.
 	 */
 	ExternalMapping getMapping(String name);
 
@@ -282,19 +298,39 @@
 	ExternalNoSql getNoSql();
 
 	/**
-	 * Returns the object type converter at the given position.
+	 * Returns the name of the parent class of this entity.
 	 */
-	ExternalObjectTypeConverter getObjectTypeConverter(int index);
+	String getParentClassName();
 
 	/**
-	 * Returns the struct type converter at the given position.
+	 * Returns the {@link TextRange} for the name of the parent class of this entity.
 	 */
-	ExternalStructConverter getStructConverter(int index);
+	TextRange getParentClassNameTextRange();
 
 	/**
-	 * Returns the converter at the given position.
+	 * Determines whether the access methods for this mapping is defined or not.
 	 */
-	ExternalTypeConverter getTypeConverter(int index);
+	boolean hasAccessMethods();
+
+	/**
+	 * Determines whether the clone copy policy for this entity is present or not.
+	 */
+	boolean hasCloneCopyPolicy();
+
+	/**
+	 * Determines whether the copy policy for this entity is present or not.
+	 */
+	boolean hasCopyPolicy();
+
+	/**
+	 * Determines whether the instantiation copy policy for this entity is present or not.
+	 */
+	boolean hasInstantiationCopyPolicy();
+
+	/**
+	 * Determines whether the external form of NoSql is present or not.
+	 */
+	boolean hasNoSql();
 
 	/**
 	 * Returns a list of the id mappings defined for this entity.
@@ -322,31 +358,26 @@
 	int mappingsSize();
 
 	/**
-	 * Returns a list of the object type converters defined for this entity.
-	 */
-	List<ExternalObjectTypeConverter> objectTypeConverters();
-
-	/**
-	 * Returns the count of the object type converters defined for this entity.
-	 */
-	int objectTypeConvertersSize();
-
-	/**
 	 * Removes the access methods element from the mapping.
 	 */
 	void removeAccessMethods();
 
 	/**
+	 * Removes the override named.
+	 */
+	void removeAssociationOverride(int index);
+
+	/**
+	 * Removes the override named.
+	 */
+	void removeAttributeOverride(int index);
+
+	/**
 	 * Removes the clone copy policy from this entity.
 	 */
 	void removeCloneCopyPolicy();
 
 	/**
-	 * Removes the converter specified at the given position.
-	 */
-	void removeConverter(int index);
-
-	/**
 	 * Removes the copy policy from this entity.
 	 */
 	void removeCopyPolicy();
@@ -357,7 +388,12 @@
 	void removeInstantiationCopyPolicy();
 
 	/**
-	 * Removes the mapping specified at the given position.
+	 * Removes the mapping at the given position.
+	 */
+	void removeMapping(int index);
+
+	/**
+	 * Removes the mapping with the given name.
 	 */
 	void removeMapping(String name);
 
@@ -367,21 +403,6 @@
 	void removeNoSql();
 
 	/**
-	 * Removes the object type converter specified at the given position.
-	 */
-	void removeObjectTypeConverter(int index);
-
-	/**
-	 * Removes the struct converter specified at the given position.
-	 */
-	void removeStructConverter(int index);
-
-	/**
-	 * Removes the type converter specified at the given position.
-	 */
-	void removeTypeConverter(int index);
-
-	/**
 	 * Sets the change tracking type for this entity.
 	 */
 	void setChangeTrackingType(ChangeTrackingType type);
@@ -412,22 +433,7 @@
 	void setMetadataComplete(Boolean metaDataComplete);
 
 	/**
-	 * Returns a list of the struct converters defined for this entity.
+	 * Sets the name of the parent class of this entity.
 	 */
-	List<ExternalStructConverter> structConverters();
-
-	/**
-	 * Returns the count of converters defined for this entity.
-	 */
-	int structConvertersSize();
-
-	/**
-	 * Returns a list of the converters defined for this entity.
-	 */
-	List<ExternalTypeConverter> typeConverters();
-
-	/**
-	 * Returns the count of type converters defined for this entity.
-	 */
-	int typeConvertersSize();
+	void setParentClassName(String className);
 }
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEntity.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEntity.java
index 797572f..8d6481b 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEntity.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEntity.java
@@ -58,31 +58,11 @@
 	String STRATEGY = "strategy";
 
 	/**
-	 * Adds a override with the given name.
-	 */
-	ExternalAssociationOverride addAssociationOverride(String name);
-
-	/**
-	 * Adds a override with the given name.
-	 */
-	ExternalAttributeOverride addAttributeOverride(String name);
-
-	/**
 	 * Creates a new discriminator column definition replacing the old one.
 	 */
 	ExternalDiscriminatorColumn addDiscriminatorColumn(String columnName);
 
 	/**
-	 * Adds a named query with the given name.
-	 */
-	ExternalNamedQuery addNamedQuery(String name);
-
-	/**
-	 * Adds a native query with the given name.
-	 */
-	ExternalNativeQuery addNativeQuery(String name);
-
-	/**
 	 * Adds a primary key join column with the given name.
 	 */
 	ExternalPrimaryKeyJoinColumn addPrimaryKeyJoinColumn(String name);
@@ -103,41 +83,6 @@
 	ExternalSQLResultSetMapping addSqlResultSetMapping(String name);
 
 	/**
-	 * Adds a stored procedure query with the given name.
-	 */
-	ExternalNamedStoredProcedureQuery addStoredProcedureQuery(String name, String procedureName);
-
-	/**
-	 * Returns a list of association overrides defined on this entity.
-	 */
-	List<ExternalAssociationOverride> associationOverrides();
-
-	/**
-	 * Returns the count of association overrides defined on this entity.
-	 */
-	int associationOverridesSize();
-
-	/**
-	 * Returns a list of attribute overrides defined for this entity.
-	 */
-	List<ExternalAttributeOverride> attributeOverrides();
-
-	/**
-	 * Returns the count attribute overrides defined for this entity.
-	 */
-	int attributeOverridesSize();
-
-	/**
-	 * Returns the association override at the specified index.
-	 */
-	ExternalAssociationOverride getAssociationOverride(int index);
-
-	/**
-	 * Returns the association override at the specified index.
-	 */
-	ExternalAttributeOverride getAttributeOverride(int index);
-
-	/**
 	 * Returns the class extractor class name defined for this entity.
 	 */
 	String getClassExtractorClassName();
@@ -178,31 +123,11 @@
 	String getName();
 
 	/**
-	 * Returns a named query with the given name.
-	 */
-	ExternalBasicNamedQuery getNamedQuery(int index);
-
-	/**
-	 * Returns a named query with the given name.
-	 */
-	ExternalBasicNamedQuery getNamedQuery(int index, String name);
-
-	/**
 	 * Returns the {@link TextRange} for the name of the entity.
 	 */
 	TextRange getNameTextRange();
 
 	/**
-	 * Returns a native query with the given name.
-	 */
-	ExternalNativeQuery getNativeQuery(int index);
-
-	/**
-	 * Returns a native query with the given name.
-	 */
-	ExternalNativeQuery getNativeQuery(int index, String name);
-
-	/**
 	 * Returns a primary key join column with the given name.
 	 */
 	ExternalPrimaryKeyJoinColumn getPrimaryKeyJoinColumn(int index);
@@ -223,34 +148,9 @@
 	ExternalSQLResultSetMapping getSqlResultSetMapping(int index);
 
 	/**
-	 * Returns the stored procedure query at the index.
+	 * Determines whether the primary table definition for this entity is defined or not.
 	 */
-	ExternalNamedStoredProcedureQuery getStoredProcedureQuery(int index);
-
-	/**
-	 * Returns the stored procedure query with the given name.
-	 */
-	ExternalNamedStoredProcedureQuery getStoredProcedureQuery(int index, String name);
-
-	/**
-	 * Returns a list of named queries defined for this entity.
-	 */
-	List<ExternalNamedQuery> namedQueries();
-
-	/**
-	 * Returns the count of named queried defined for this entity.
-	 */
-	int namedQueriesSize();
-
-	/**
-	 * Returns a list of native queries defined on this entity.
-	 */
-	List<ExternalNativeQuery> nativeQueries();
-
-	/**
-	 * Returns the count of native queries defined on this entity.
-	 */
-	int nativeQueriesSize();
+	boolean hasPrimaryTable();
 
 	/**
 	 * Returns a list of the primary key join columns.
@@ -263,26 +163,6 @@
 	int primaryKeyJoinColumnsSize();
 
 	/**
-	 * Removes the override named.
-	 */
-	void removeAssociationOverride(int index);
-
-	/**
-	 * Removes the override named.
-	 */
-	void removeAttributeOverride(int index);
-
-	/**
-	 * Removes the named query named.
-	 */
-	void removeNamedQuery(int index);
-
-	/**
-	 * Removes the native query named.
-	 */
-	void removeNativeQuery(int index);
-
-	/**
 	 * Removes the primary key join column named.
 	 */
 	void removePrimaryKeyJoinColumn(int index);
@@ -303,11 +183,6 @@
 	void removeSqlResultSetMapping(int index);
 
 	/**
-	 * Removes the stored procedure query named.
-	 */
-	void removeStoredProcedureQuery(int index);
-
-	/**
 	 * Returns a list of the secondary table definitions for this entity.
 	 */
 	List<ExternalSecondaryTable> secondaryTables();
@@ -346,14 +221,4 @@
 	 * Returns the count of SQL result set mappings defined on this entity.
 	 */
 	int sqlResultSetMappingsSize();
-
-	/**
-	 * Returns a list of named stored procedure queries defined for this entity.
-	 */
-	List<ExternalNamedStoredProcedureQuery> storedProcedureQueries();
-
-	/**
-	 * Returns the count of named stored procedure queried defined for this entity.
-	 */
-	int storedProcedureQueriesSize();
 }
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEntityTable.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEntityTable.java
index aff0052..55deaf0 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEntityTable.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalEntityTable.java
@@ -52,6 +52,11 @@
 	String SCHEMA = "schema";
 
 	/**
+	 * The node name used to store and retrieve the element encapsulated by this external form.
+	 */
+	String TABLE = "table";
+
+	/**
 	 * Adds unique constraint with the provided column names.
 	 */
 	ExternalUniqueConstraint addUniqueConstraint(ListIterable<String> columnNames);
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalMappedSuperClass.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalMappedSuperClass.java
index 9f4a267..2590d58 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalMappedSuperClass.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalMappedSuperClass.java
@@ -88,11 +88,6 @@
 	String OPTIMISTIC_LOCKING = "optimistic-locking";
 
 	/**
-	 * The element name used to store and retrieve the parent-class child node.
-	 */
-	String PARENT_CLASS = "parent-class";
-
-	/**
 	 * The element name used to store and retrieve the post-load child node.
 	 */
 	String POST_LOAD = "post-load";
@@ -158,6 +153,16 @@
 	ExternalMultitenancyPolicy addMultitenancy();
 
 	/**
+	 * Adds a named query with the given name.
+	 */
+	ExternalNamedQuery addNamedQuery(String name);
+
+	/**
+	 * Adds a native query with the given name.
+	 */
+	ExternalNativeQuery addNativeQuery(String name);
+
+	/**
 	 * Create new Optimistic locking for this entity replacing the old one.
 	 */
 	ExternalOptimisticLocking addOptimisticLocking();
@@ -173,6 +178,11 @@
 	ExternalSequenceGenerator addSequenceGenerator();
 
 	/**
+	 * Adds a stored procedure query with the given name.
+	 */
+	ExternalNamedStoredProcedureQuery addStoredProcedureQuery(String name);
+
+	/**
 	 * Creates a new table generator for this entity.
 	 */
 	ExternalTableGenerator addTableGenerator();
@@ -225,12 +235,12 @@
 	/**
 	 * Returns the {@link TextRange} of the excludes class listeners value.
 	 */
-	TextRange getExcludesClassListenersTextRange();
+	TextRange getExcludesDefaultListenersTextRange();
 
 	/**
 	 * Returns the {@link TextRange} for the excludes superclass listeners value.
 	 */
-	TextRange getExcludesSuperClassListenersTextRange();
+	TextRange getExcludesSuperclassListenersTextRange();
 
 	/**
 	 * Returns the existence type for this entity
@@ -265,12 +275,22 @@
 	/**
 	 * Returns the multitenancy policy for this entity.
 	 */
-	ExternalMultitenancyPolicy getMultitenant();
+	ExternalMultitenancyPolicy getMultitenancy();
 
 	/**
 	 * Returns the {@link TextRange} for the multitenant of this entity.
 	 */
-	TextRange getMultitenantTextRange();
+	TextRange getMultitenancyTextRange();
+
+	/**
+	 * Returns a named query with the given name.
+	 */
+	ExternalBasicNamedQuery getNamedQuery(int index);
+
+	/**
+	 * Returns a native query with the given name.
+	 */
+	ExternalNativeQuery getNativeQuery(int index);
 
 	/**
 	 * Returns the optimistic locking definition for this entity.
@@ -278,16 +298,6 @@
 	ExternalOptimisticLocking getOptimisticLocking();
 
 	/**
-	 * Returns the name of the parent class of this entity.
-	 */
-	String getParentClassName();
-
-	/**
-	 * Returns the {@link TextRange} for the name of the parent class of this entity.
-	 */
-	TextRange getParentClassNameTextRange();
-
-	/**
 	 * Returns the primary key definition for this entity.
 	 */
 	ExternalPrimaryKey getPrimaryKey();
@@ -303,26 +313,76 @@
 	ExternalSequenceGenerator getSequenceGenerator();
 
 	/**
+	 * Returns the stored procedure query at the index.
+	 */
+	ExternalNamedStoredProcedureQuery getStoredProcedureQuery(int index);
+
+	/**
 	 * Returns the table generator for this entity if one exists.
 	 */
 	ExternalTableGenerator getTableGenerator();
 
 	/**
+	 * Determines whether the cache for this entity is defined or not.
+	 */
+	boolean hasCache();
+
+	/**
+	 * Determines whether the multitenancy policy for this entity is defined or not.
+	 */
+	boolean hasMultitenancy();
+
+	/**
+	 * Determines whether the optimistic locking definition for this entity is defined or not.
+	 */
+	boolean hasOptimisticLocking();
+
+	/**
+	 * Determines whether the primary key definition for this entity is defined or not.
+	 */
+	boolean hasPrimaryKey();
+
+	/**
+	 * Determines whether the sequence generator for this entity is defined or not.
+	 */
+	boolean hasSequenceGenerator();
+
+	/**
+	 * Determines whether the table generator for this entity is defined or not.
+	 */
+	boolean hasTableGenerator();
+
+	/**
 	 * Returns whether this entity is cacheable.
 	 */
 	Boolean isCacheable();
 
 	/**
-	 * Returns whether this entity has multitenant.
-	 */
-	Boolean isMultitenant();
-
-	/**
 	 * Returns whether this entity is read only.
 	 */
 	Boolean isReadOnly();
 
 	/**
+	 * Returns a list of named queries defined for this entity.
+	 */
+	List<ExternalNamedQuery> namedQueries();
+
+	/**
+	 * Returns the count of named queried defined for this entity.
+	 */
+	int namedQueriesSize();
+
+	/**
+	 * Returns a list of native queries defined on this entity.
+	 */
+	List<ExternalNativeQuery> nativeQueries();
+
+	/**
+	 * Returns the count of native queries defined on this entity.
+	 */
+	int nativeQueriesSize();
+
+	/**
 	 * Removes the cache from this entity if it exists.
 	 */
 	void removeCache();
@@ -338,6 +398,16 @@
 	void removeMultiTenancy();
 
 	/**
+	 * Removes the named query named.
+	 */
+	void removeNamedQuery(int index);
+
+	/**
+	 * Removes the native query named.
+	 */
+	void removeNativeQuery(int index);
+
+	/**
 	 * Removes the optimistic locking from this entity if it exists.
 	 */
 	void removeOptimisticLocking();
@@ -348,6 +418,21 @@
 	void removePrimaryKey();
 
 	/**
+	 * Removes the sequence generator from this entity.
+	 */
+	void removeSequenceGenerator();
+
+	/**
+	 * Removes the stored procedure query named.
+	 */
+	void removeStoredProcedureQuery(int index);
+
+	/**
+	 * Removes the table generator from this entity.
+	 */
+	void removeTableGenerator();
+
+	/**
 	 * Sets whether this entity is cacheable or not.
 	 */
 	void setCacheable(Boolean cacheable);
@@ -360,12 +445,12 @@
 	/**
 	 * Sets if this entity should exclude default class listener methods.
 	 */
-	void setExcludesClassListeners(Boolean excludeClassListeners);
+	void setExcludesDefaultListeners(boolean excludeDefaultListeners);
 
 	/**
 	 * Sets if this entity has declared to exclude listener methods defined on mapped superclasses.
 	 */
-	void setExcludesSuperClassListeners(Boolean excludesSuperClassListeners);
+	void setExcludesSuperclassListeners(boolean excludesSuperclassListeners);
 
 	/**
 	 * Sets the existence checking type for this entity.
@@ -383,11 +468,6 @@
 	void setMappingsDescription(String description);
 
 	/**
-	 * Sets the name of the parent class of this entity.
-	 */
-	void setParentClassName(String className);
-
-	/**
 	 * Sets whether this entity is read only.
 	 */
 	void setReadOnly(Boolean readOnly);
@@ -395,10 +475,20 @@
 	/**
 	 * Returns if this entity has declared to exclude default listener methods.
 	 */
-	Boolean shouldExcludesClassListeners();
+	boolean shouldExcludesDefaultListeners();
 
 	/**
 	 * Returns if this entity has declared to exclude listener methods defined on mapped superclasses.
 	 */
-	Boolean shouldExcludesSuperClassListeners();
+	boolean shouldExcludesSuperclassListeners();
+
+	/**
+	 * Returns a list of named stored procedure queries defined for this entity.
+	 */
+	List<ExternalNamedStoredProcedureQuery> storedProcedureQueries();
+
+	/**
+	 * Returns the count of named stored procedure queried defined for this entity.
+	 */
+	int storedProcedureQueriesSize();
 }
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalORMConfiguration.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalORMConfiguration.java
index 4c58849..96c460c 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalORMConfiguration.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalORMConfiguration.java
@@ -35,7 +35,8 @@
  */
 @SuppressWarnings("nls")
 public interface ExternalORMConfiguration extends ExternalTenantDiscriminatorColumnProvider,
-                                                  ExternalAccessType {
+                                                  ExternalAccessType,
+                                                  ExternalConverterProvider {
 
 	/**
 	 * The element name of the child text node for the default catalog name.
@@ -63,11 +64,6 @@
 	String SCHEMA = "schema";
 
 	/**
-	 * Adds a new converter.
-	 */
-	ExternalClassConverter addConverter();
-
-	/**
 	 * Adds a embedded entity with the given name.
 	 */
 	ExternalEmbeddable addEmbeddable(String embeddableClassName);
@@ -98,11 +94,6 @@
 	ExternalNamedStoredProcedureQuery addNamedStoredProcedureQuery(String name);
 
 	/**
-	 * Adds an object type converter.
-	 */
-	ExternalObjectTypeConverter addObjectTypeConverter();
-
-	/**
 	 * Creates new persistence unit representing this ORM's persistence unit metadata.
 	 */
 	ExternalPersistenceUnit addPersistenceUnitMetaData();
@@ -118,31 +109,11 @@
 	ExternalSQLResultSetMapping addSqlResultSetMapping(String name);
 
 	/**
-	 * Adds a new struct converter.
-	 */
-	ExternalStructConverter addStructConverter();
-
-	/**
 	 * Adds a table generator with the given name
 	 */
 	ExternalTableGenerator addTableGenerator(String name);
 
 	/**
-	 * Adds a new type converter.
-	 */
-	ExternalTypeConverter addTypeConverter();
-
-	/**
-	 * Returns a list of all converters defined globally for this ORM configuration.
-	 */
-	List<ExternalClassConverter> converters();
-
-	/**
-	 * Returns the count of all converters defined globally for this ORM configuration.
-	 */
-	int convertersSize();
-
-	/**
 	 * Returns a list of all embedded entities associated with this ORM configuration.
 	 */
 	List<ExternalEmbeddable> embeddables();
@@ -180,11 +151,6 @@
 	TextRange getCatalogNameTextRange();
 
 	/**
-	 * Returns the converter with at the given index.
-	 */
-	ExternalClassConverter getConverter(int index);
-
-	/**
 	 * Returns the description noted in the ORM.xml.
 	 */
 	String getDescription();
@@ -257,11 +223,6 @@
 	ExternalNamedStoredProcedureQuery getNamedStoredProcedureQuery(int index);
 
 	/**
-	 * Returns the object type converter with at the given index.
-	 */
-	ExternalObjectTypeConverter getObjectTypeConverter(int index);
-
-	/**
 	 * Returns the default package name to be applied to all entities.
 	 */
 	String getPackageName();
@@ -307,21 +268,11 @@
 	ExternalSQLResultSetMapping getSqlResultSetMapping(int index);
 
 	/**
-	 * Returns the struct converter with at the given position.
-	 */
-	ExternalStructConverter getStructConverter(int index);
-
-	/**
 	 * Returns the table generator at the given position.
 	 */
 	ExternalTableGenerator getTableGenerator(int index);
 
 	/**
-	 * Returns the type converter at the given position.
-	 */
-	ExternalTypeConverter getTypeConverter(int index);
-
-	/**
 	 * Derives and returns the XML representation of this configuration.
 	 */
 	String getXML();
@@ -362,21 +313,6 @@
 	int namedQueriesSize();
 
 	/**
-	 * Returns a list of all converters defined globally for this ORM configuration.
-	 */
-	List<ExternalObjectTypeConverter> objectTypeConverters();
-
-	/**
-	 * Returns the count of all converters defined globally for this ORM configuration.
-	 */
-	int objectTypeConvertersSize();
-
-	/**
-	 * Removes the converter at the given position.
-	 */
-	void removeConverter(int index);
-
-	/**
 	 * Removes the embedded at the given position.
 	 */
 	void removeEmbeddable(int index);
@@ -412,11 +348,6 @@
 	void removeNativeQuery(int index);
 
 	/**
-	 * Removes the converter at the given position.
-	 */
-	void removeObjectTypeConverter(int index);
-
-	/**
 	 * Removes the persistence unit representing this ORM's persistence unit metadata.
 	 */
 	void removePersistenceUnitMetaData();
@@ -437,21 +368,11 @@
 	void removeStoredProcedureQuery(int index);
 
 	/**
-	 * Removes the converter at the given position.
-	 */
-	void removeStructConverter(int index);
-
-	/**
 	 * Removes the table generator at the given position.
 	 */
 	void removeTableGenerator(int index);
 
 	/**
-	 * Removes the converter at the given position.
-	 */
-	void removeTypeConverter(int index);
-
-	/**
 	 * Returns a list of all sequence generators defined globally for this ORM configuration.
 	 */
 	List<ExternalSequenceGenerator> sequenceGenerators();
@@ -507,16 +428,6 @@
 	int storedProcedureQueriesSize();
 
 	/**
-	 * Returns a list of all converters defined globally for this ORM configuration.
-	 */
-	List<ExternalStructConverter> structConverters();
-
-	/**
-	 * Returns the count of all converters defined globally for this ORM configuration.
-	 */
-	int structConvertersSize();
-
-	/**
 	 * Returns a list of all table generators defined globally for this ORM configuration.
 	 */
 	List<ExternalTableGenerator> tableGenerators();
@@ -525,14 +436,4 @@
 	 * Returns the count of all table generators defined globally for this ORM configuration.
 	 */
 	int tableGeneratorsSize();
-
-	/**
-	 * Returns a list of all converters defined globally for this ORM configuration.
-	 */
-	List<ExternalTypeConverter> typeConverters();
-
-	/**
-	 * Returns the count of all converters defined globally for this ORM configuration.
-	 */
-	int typeConvertersSize();
 }
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalTenantDiscriminatorColumn.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalTenantDiscriminatorColumn.java
index f6a0ad3..987d945 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalTenantDiscriminatorColumn.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/ExternalTenantDiscriminatorColumn.java
@@ -69,8 +69,7 @@
 	String TABLE = "table";
 
 	/**
-	 * The node name used to store and retrieve the element
-	 * encapsulated by this external form.
+	 * The node name used to store and retrieve the element encapsulated by this external form.
 	 */
 	String TENANT_DISCRIMINATOR_COLUMN = "tenant-discriminator-column";
 
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/AttributeOverride.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/AttributeOverride.java
index d5f13db..7ddc191 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/AttributeOverride.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/AttributeOverride.java
@@ -69,7 +69,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/BasicMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/BasicMapping.java
index 4aaa789..3a9909c 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/BasicMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/BasicMapping.java
@@ -394,14 +394,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void setAttributeType(String attributeType) {
-		setAttribute(ATTRIBUTE_TYPE, attributeType);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public void setColumn(String columnName) {
 
 		removeChild(EntityColumn.COLUMN);
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Cache.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Cache.java
index b5339d8..7777b29 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Cache.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Cache.java
@@ -39,7 +39,7 @@
 	 *
 	 * @param parent The parent of this external form
 	 */
-	Cache(MappedSuperClassEntity parent) {
+	Cache(MappedSuperclass parent) {
 		super(parent);
 	}
 
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ColumnResult.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ColumnResult.java
index 1b39702..098d829 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ColumnResult.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ColumnResult.java
@@ -48,7 +48,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ConversionValue.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ConversionValue.java
index 54de7b9..e288e92 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ConversionValue.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ConversionValue.java
@@ -62,7 +62,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ConvertibleMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ConvertibleMapping.java
index 8f9794d..7b96333 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ConvertibleMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ConvertibleMapping.java
@@ -45,6 +45,66 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public final ExternalClassConverter addConverter() {
+
+		removeChild(TypeConverter.TYPE_CONVERTER);
+		removeChild(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
+		removeChild(StructConverter.STRUCT_CONVERTER);
+
+		ClassConverter converter = buildConverter();
+		converter.addSelf();
+		return converter;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final ExternalObjectTypeConverter addObjectTypeConverter() {
+
+		removeChild(TypeConverter.TYPE_CONVERTER);
+		removeChild(ClassConverter.CONVERTER);
+		removeChild(StructConverter.STRUCT_CONVERTER);
+
+		ObjectTypeConverter converter = buildObjectTypeConverter();
+		converter.addSelf();
+		return converter;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final ExternalStructConverter addStructConverter() {
+
+		removeChild(TypeConverter.TYPE_CONVERTER);
+		removeChild(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
+		removeChild(ClassConverter.CONVERTER);
+
+		StructConverter converter = buildStructConverter();
+		converter.addSelf();
+		return converter;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final ExternalTypeConverter addTypeConverter() {
+
+		removeChild(ClassConverter.CONVERTER);
+		removeChild(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
+		removeChild(StructConverter.STRUCT_CONVERTER);
+
+		TypeConverter converter = buildTypeConverter();
+		converter.addSelf();
+		return converter;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	protected List<String> buildAttributeNamesOrder() {
 		List<String> names = new ArrayList<String>();
 		names.add(NAME);
@@ -96,6 +156,19 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public final ExternalClassConverter getConverter() {
+
+		if (hasChild(ClassConverter.CONVERTER)) {
+			return buildConverter();
+		}
+
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final TextRange getConvertTextRange() {
 		return getChildTextNodeTextRange(CONVERT);
 	}
@@ -143,20 +216,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final ExternalClassConverter getValueConverter() {
-
-		if (hasChild(ClassConverter.CONVERTER)) {
-			return buildConverter();
-		}
-
-		return null;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public final void removeValueConverter() {
+	public final void removeConverter() {
 		removeChild(ClassConverter.CONVERTER);
 	}
 
@@ -164,7 +224,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final void removeValueObjectTypeConverter() {
+	public final void removeObjectTypeConverter() {
 		removeChild(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
 	}
 
@@ -172,7 +232,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final void removeValueStructConverter() {
+	public final void removeStructConverter() {
 		removeChild(StructConverter.STRUCT_CONVERTER);
 	}
 
@@ -180,7 +240,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final void removeValueTypeConverter() {
+	public final void removeTypeConverter() {
 		removeChild(TypeConverter.TYPE_CONVERTER);
 	}
 
@@ -188,62 +248,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final void setAsValueConverter() {
-
-		removeChild(TypeConverter.TYPE_CONVERTER);
-		removeChild(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
-		removeChild(StructConverter.STRUCT_CONVERTER);
-
-		ClassConverter valueConverter = buildConverter();
-		valueConverter.addSelf();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public final void setAsValueObjectTypeConverter() {
-
-		removeChild(TypeConverter.TYPE_CONVERTER);
-		removeChild(ClassConverter.CONVERTER);
-		removeChild(StructConverter.STRUCT_CONVERTER);
-
-		ObjectTypeConverter valueConverter = buildObjectTypeConverter();
-		valueConverter.addSelf();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public final void setAsValueStructConverter() {
-
-		removeChild(TypeConverter.TYPE_CONVERTER);
-		removeChild(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
-		removeChild(ClassConverter.CONVERTER);
-
-		StructConverter valueConverter = buildStructConverter();
-		valueConverter.addSelf();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public final void setAsValueTypeConverter() {
-
-		removeChild(ClassConverter.CONVERTER);
-		removeChild(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
-		removeChild(StructConverter.STRUCT_CONVERTER);
-
-		TypeConverter valueConverter = buildTypeConverter();
-		valueConverter.addSelf();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public void setConvert(String value) {
 		updateChildTextNode(CONVERT, value);
 	}
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/DiscriminatorClass.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/DiscriminatorClass.java
index 40e7c8f..30643f3 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/DiscriminatorClass.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/DiscriminatorClass.java
@@ -62,7 +62,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ElementCollectionMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ElementCollectionMapping.java
index adc1598..efad47f 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ElementCollectionMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ElementCollectionMapping.java
@@ -914,14 +914,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void setAttributeType(String attributeType) {
-		setAttribute(ATTRIBUTE_TYPE, attributeType);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public void setColumn(String columnName) {
 		EntityColumn column = buildColumn(EntityColumn.COLUMN);
 		column.addSelf();
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Embeddable.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Embeddable.java
index 7db8bd1..263a0e8 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Embeddable.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Embeddable.java
@@ -21,6 +21,8 @@
 import org.eclipse.persistence.tools.mapping.ExternalProperty;
 import org.eclipse.persistence.tools.mapping.orm.AccessType;
 import org.eclipse.persistence.tools.mapping.orm.ExternalAccessMethods;
+import org.eclipse.persistence.tools.mapping.orm.ExternalAssociationOverride;
+import org.eclipse.persistence.tools.mapping.orm.ExternalAttributeOverride;
 import org.eclipse.persistence.tools.mapping.orm.ExternalBasicCollectionMapping;
 import org.eclipse.persistence.tools.mapping.orm.ExternalBasicMapMapping;
 import org.eclipse.persistence.tools.mapping.orm.ExternalBasicMapping;
@@ -54,6 +56,7 @@
  *
  * @version 2.6
  */
+@SuppressWarnings("nls")
 class Embeddable extends AbstractExternalForm
                  implements ExternalEmbeddable {
 
@@ -94,6 +97,28 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public ExternalAssociationOverride addAssociationOverride(String name) {
+		AssociationOverride associationOverride = buildAssociationOverride(-1);
+		associationOverride.addSelf();
+		associationOverride.setName(name);
+		return associationOverride;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public ExternalAttributeOverride addAttributeOverride(String name) {
+		AttributeOverride attributeOverride = buildAttributeOverride(-1);
+		attributeOverride.addSelf();
+		attributeOverride.setName(name);
+		return attributeOverride;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final ExternalBasicCollectionMapping addBasicCollectionMapping(String name) {
 		BasicCollectionMapping mapping = buildBasicCollectionMapping();
 		mapping.addSelf();
@@ -183,7 +208,7 @@
 	 */
 	@Override
 	public ExternalIDMapping addIdMapping(String name) {
-		throw new UnsupportedOperationException();
+		throw new UnsupportedOperationException("An ID mapping is not supported on an embeddable.");
 	}
 
 	/**
@@ -306,10 +331,62 @@
 		return converter;
 	}
 
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public List<ExternalAssociationOverride> associationOverrides() {
+
+		int count = associationOverridesSize();
+		List<ExternalAssociationOverride> associationOverrides = new ArrayList<ExternalAssociationOverride>(count);
+
+		for (int index = 0; index < count; index++) {
+			associationOverrides.add(buildAssociationOverride(index));
+		}
+
+		return associationOverrides;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public int associationOverridesSize() {
+		return getChildrenSize(AssociationOverride.ASSOCIATION_OVERRIDE);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public List<ExternalAttributeOverride> attributeOverrides() {
+
+		int count = attributeOverridesSize();
+		List<ExternalAttributeOverride> attributeOverrides = new ArrayList<ExternalAttributeOverride>(count);
+
+		for (int index = 0; index < count; index++) {
+			attributeOverrides.add(buildAttributeOverride(index));
+		}
+
+		return attributeOverrides;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public int attributeOverridesSize() {
+		return getChildrenSize(AttributeOverride.ATTRIBUTE_OVERRIDE);
+	}
+
 	private AccessMethods buildAccessMethods() {
 		return new AccessMethods(this);
 	}
 
+	private AssociationOverride buildAssociationOverride(int index) {
+		return new AssociationOverride(this, index);
+	}
+
 	/**
 	 * {@inheritDoc}
 	 */
@@ -317,12 +394,17 @@
 	protected List<String> buildAttributeNamesOrder() {
 		List<String> names = new ArrayList<String>();
 		names.add(CLASS);
+		names.add(PARENT_CLASS);
 		names.add(ACCESS);
 		names.add(METADATA_COMPLETE);
 		names.add(EXCLUDE_DEFAULT_MAPPINGS);
 		return names;
 	}
 
+	private AttributeOverride buildAttributeOverride(int index) {
+		return new AttributeOverride(this, index);
+	}
+
 	private BasicCollectionMapping buildBasicCollectionMapping() {
 		return new BasicCollectionMapping(this);
 	}
@@ -351,6 +433,7 @@
 		return new ElementCollectionMapping(this);
 	}
 
+
 	/**
 	 * {@inheritDoc}
 	 */
@@ -362,15 +445,23 @@
 		names.add(AccessMethods.ACCESS_METHODS);
 		names.add(CUSTOMIZER);
 		names.add(CHANGE_TRACKING);
+		names.add("struct");
 		names.add(NoSql.NO_SQL);
 		names.add(ClassConverter.CONVERTER);
 		names.add(TypeConverter.TYPE_CONVERTER);
 		names.add(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
+		names.add("serialized-converter");
 		names.add(StructConverter.STRUCT_CONVERTER);
-		names.add(Property.PROPERTY);
 		names.add(CopyPolicy.COPY_POLICY);
 		names.add(InstantiationCopyPolicy.INSTANTIATION_COPY_POLICY);
 		names.add(CloneCopyPolicy.CLONE_COPY_POLICY);
+		names.add("oracle-object");
+		names.add("oracle-array");
+		names.add("plsql-record");
+		names.add("plsql-table");
+		names.add(Property.PROPERTY);
+		names.add(ExternalAttributeOverride.ATTRIBUTE_OVERRIDE);
+		names.add(ExternalAssociationOverride.ASSOCIATION_OVERRIDE);
 		names.add(Mapping.ATTRIBUTES);
 		return names;
 	}
@@ -451,9 +542,10 @@
 	 *
 	 * @return The mapping names
 	 */
-	List<String> buildMappingElementNamesOrder() {
+	final List<String> buildMappingElementNamesOrder() {
 
 		List<String> names = new ArrayList<String>();
+		names.add(DESCRIPTION);
 		names.add(IdMapping.ID);
 		names.add(EmbeddedIDMapping.EMBEDDED_ID);
 		names.add(BasicMapping.BASIC);
@@ -469,10 +561,29 @@
 		names.add(EmbeddedMapping.EMBEDDED);
 		names.add(TransformationMapping.TRANSFORMATION);
 		names.add(TransientMapping.TRANSIENT);
-
+		names.add("structure");
+		names.add("array");
 		return names;
 	}
 
+	private List<ExternalMapping> buildMappings(Element element) {
+
+		List<ExternalMapping> mappings = new ArrayList<ExternalMapping>();
+
+		for (Element childElement : getChildren(element)) {
+
+			String elementName = getNodeName(childElement);
+			Mapping mapping = buildMapping(elementName);
+
+			if (mapping != null) {
+				mapping.calculateInsertionIndex(element, childElement, elementName);
+				mappings.add(mapping);
+			}
+		}
+
+		return mappings;
+	}
+
 	private NoSql buildNoSql() {
 		return new NoSql(this);
 	}
@@ -510,7 +621,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
@@ -570,6 +683,32 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public ExternalAssociationOverride getAssociationOverride(int index) {
+
+		if (hasChild(AssociationOverride.ASSOCIATION_OVERRIDE, index)) {
+			return buildAssociationOverride(index);
+		}
+
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public ExternalAttributeOverride getAttributeOverride(int index) {
+
+		if (hasChild(AttributeOverride.ATTRIBUTE_OVERRIDE, index)) {
+			return buildAttributeOverride(index);
+		}
+
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final ChangeTrackingType getChangeTrackingType() {
 		return getChildEnumAttribute(CHANGE_TRACKING, TYPE, ChangeTrackingType.class);
 	}
@@ -724,12 +863,41 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final Mapping getMapping(String name) {
+	public final Mapping getMapping(int index) {
 
-		// TODO: Speed up by creating a helper method that will retrieve the node directly
-		for (ExternalMapping mapping : mappings()) {
-			if (ObjectTools.equals(name, mapping.getName())) {
-				return (Mapping) mapping;
+		Element element = getChild(ExternalMapping.ATTRIBUTES);
+
+		if (element != null) {
+			Element childElement = getChild(element, index);
+
+			if (childElement != null) {
+				String elementName = getNodeName(childElement);
+
+				Mapping mapping = buildMapping(elementName);
+				mapping.calculateInsertionIndex(element, childElement, elementName);
+				return mapping;
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final ExternalMapping getMapping(String name) {
+
+		Element element = getChild(ExternalMapping.ATTRIBUTES);
+
+		if (element != null) {
+
+			for (Element mappingNode : getChildren(element)) {
+				String mappingName = getAttribute(mappingNode, ExternalMapping.NAME);
+
+				if (mappingName.equals(name)) {
+					return buildMapping(getNodeName(mappingNode));
+				}
 			}
 		}
 
@@ -737,7 +905,7 @@
 	}
 
 	protected List<String> getMappingElementNamesOrder() {
-		return this.mappingElementNamesOrder;
+		return mappingElementNamesOrder;
 	}
 
 	/**
@@ -778,6 +946,22 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public final String getParentClassName() {
+		return getAttribute(PARENT_CLASS);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public TextRange getParentClassNameTextRange() {
+		return getAttributeTextRange(PARENT_CLASS);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final List<ExternalProperty> getProperties(String name) {
 
 		List<ExternalProperty> properties = new ArrayList<ExternalProperty>();
@@ -948,6 +1132,46 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public final boolean hasAccessMethods() {
+		return hasChild(ExternalAccessMethods.ACCESS_METHODS);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final boolean hasCloneCopyPolicy() {
+		return hasChild(ExternalCloneCopyPolicy.CLONE_COPY_POLICY);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final boolean hasCopyPolicy() {
+		return hasChild(ExternalCopyPolicy.COPY_POLICY);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final boolean hasInstantiationCopyPolicy() {
+		return hasChild(ExternalInstantiationCopyPolicy.INSTANTIATION_COPY_POLICY);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final boolean hasNoSql() {
+		return hasChild(ExternalNoSql.NO_SQL);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final List<ExternalIDMapping> idMappings() {
 
 		List<ExternalIDMapping> idMappings = new ArrayList<ExternalIDMapping>();
@@ -996,30 +1220,12 @@
 		Element element = getChild(Mapping.ATTRIBUTES);
 
 		if (element != null) {
-			return mappings(element);
+			return buildMappings(element);
 		}
 
 		return Collections.emptyList();
 	}
 
-	private List<ExternalMapping> mappings(Element element) {
-
-		List<ExternalMapping> mappings = new ArrayList<ExternalMapping>();
-
-		for (Element childElement : getChildren(element)) {
-
-			String elementName = getNodeName(childElement);
-			Mapping mapping = buildMapping(elementName);
-
-			if (mapping != null) {
-				mapping.calculateInsertionIndex(element, childElement, elementName);
-				mappings.add(mapping);
-			}
-		}
-
-		return mappings;
-	}
-
 	/**
 	 * {@inheritDoc}
 	 */
@@ -1112,6 +1318,24 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public void removeAssociationOverride(int index) {
+		AssociationOverride associationOverride = buildAssociationOverride(index);
+		associationOverride.removeSelf();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void removeAttributeOverride(int index) {
+		AttributeOverride attributeOverride = buildAttributeOverride(index);
+		attributeOverride.removeSelf();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final void removeCloneCopyPolicy() {
 		CloneCopyPolicy policy = buildCloneCopyPolicy();
 		policy.removeSelf();
@@ -1148,9 +1372,9 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final void removeMapping(String name) {
+	public final void removeMapping(int index) {
 
-		Mapping mapping = getMapping(name);
+		Mapping mapping = getMapping(index);
 
 		if (mapping != null) {
 			mapping.removeSelf();
@@ -1161,6 +1385,27 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public final void removeMapping(String name) {
+
+		Element element = getChild(ExternalMapping.ATTRIBUTES);
+
+		if (element != null) {
+
+			for (Element mappingNode : getChildren(element)) {
+				String mappingName = getAttribute(mappingNode, ExternalMapping.NAME);
+
+				if (mappingName.equals(name)) {
+					remove(element, mappingNode);
+					break;
+				}
+			}
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final void removeNoSql() {
 		NoSql noSql = buildNoSql();
 		noSql.removeSelf();
@@ -1288,6 +1533,14 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public final void setParentClassName(String className) {
+		setAttribute(PARENT_CLASS, className);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final List<ExternalStructConverter> structConverters() {
 
 		int count = structConvertersSize();
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EmbeddedIDMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EmbeddedIDMapping.java
index 2917bfe..150ad88 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EmbeddedIDMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EmbeddedIDMapping.java
@@ -33,7 +33,7 @@
 	 *
 	 * @param parent The parent of this external form
 	 */
-	EmbeddedIDMapping(MappedSuperClassEntity parent) {
+	EmbeddedIDMapping(MappedSuperclass parent) {
 		super(parent);
 	}
 
@@ -116,12 +116,4 @@
 		AttributeOverride attributeOverride = buildAttributeOverride(index);
 		attributeOverride.removeSelf();
 	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void setAttributeType(String attributeType) {
-		setAttribute(ATTRIBUTE_TYPE, attributeType);
-	}
 }
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EmbeddedMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EmbeddedMapping.java
index d71fbf5..147a79c 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EmbeddedMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EmbeddedMapping.java
@@ -217,14 +217,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void setAttributeType(String attributeType) {
-		setAttribute(ATTRIBUTE_TYPE, attributeType);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public void setNoSqlField(String field) {
 		ExternalNoSqlField noSqlField = buildNoSqlField();
 		noSqlField.setName(field);
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Entity.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Entity.java
index 9568fa8..2eb04d2 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Entity.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Entity.java
@@ -16,20 +16,15 @@
 import java.util.ArrayList;
 import java.util.List;
 import javax.persistence.InheritanceType;
-import org.eclipse.persistence.tools.mapping.orm.ExternalAssociationOverride;
-import org.eclipse.persistence.tools.mapping.orm.ExternalAttributeOverride;
-import org.eclipse.persistence.tools.mapping.orm.ExternalBasicNamedQuery;
+import org.eclipse.persistence.tools.mapping.orm.ExternalAccessMethods;
 import org.eclipse.persistence.tools.mapping.orm.ExternalDiscriminatorColumn;
 import org.eclipse.persistence.tools.mapping.orm.ExternalEmbeddable;
 import org.eclipse.persistence.tools.mapping.orm.ExternalEntity;
 import org.eclipse.persistence.tools.mapping.orm.ExternalEntityTable;
-import org.eclipse.persistence.tools.mapping.orm.ExternalNamedQuery;
-import org.eclipse.persistence.tools.mapping.orm.ExternalNativeQuery;
+import org.eclipse.persistence.tools.mapping.orm.ExternalMultitenancyPolicy;
 import org.eclipse.persistence.tools.mapping.orm.ExternalPrimaryKeyJoinColumn;
 import org.eclipse.persistence.tools.mapping.orm.ExternalSQLResultSetMapping;
 import org.eclipse.persistence.tools.mapping.orm.ExternalSecondaryTable;
-import org.eclipse.persistence.tools.mapping.orm.ExternalNamedStoredProcedureQuery;
-import org.eclipse.persistence.tools.utility.ObjectTools;
 import org.eclipse.persistence.tools.utility.TextRange;
 import org.w3c.dom.Element;
 
@@ -40,7 +35,8 @@
  *
  * @version 2.6
  */
-final class Entity extends MappedSuperClassEntity
+@SuppressWarnings("nls")
+final class Entity extends MappedSuperclass
                    implements ExternalEntity {
 
 	/**
@@ -57,28 +53,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalAssociationOverride addAssociationOverride(String name) {
-		AssociationOverride associationOverride = buildAssociationOverride(-1);
-		associationOverride.addSelf();
-		associationOverride.setName(name);
-		return associationOverride;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public ExternalAttributeOverride addAttributeOverride(String name) {
-		AttributeOverride attributeOverride = buildAttributeOverride(-1);
-		attributeOverride.addSelf();
-		attributeOverride.setName(name);
-		return attributeOverride;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public ExternalDiscriminatorColumn addDiscriminatorColumn(String columnName) {
 
 		DiscriminatorColumn column = getDiscriminatorColumn();
@@ -96,28 +70,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalNamedQuery addNamedQuery(String name) {
-		NamedQuery namedQuery = buildNamedQuery(-1);
-		namedQuery.addSelf();
-		namedQuery.setName(name);
-		return namedQuery;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public ExternalNativeQuery addNativeQuery(String name) {
-		NamedNativeQuery namedNativeQuery = buildNamedNativeQuery(-1);
-		namedNativeQuery.addSelf();
-		namedNativeQuery.setName(name);
-		return namedNativeQuery;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public ExternalPrimaryKeyJoinColumn addPrimaryKeyJoinColumn(String name) {
 		PrimaryKeyJoinColumn pkJoinColumn = buildPrimaryKeyJoinColumn(-1);
 		pkJoinColumn.addSelf();
@@ -164,88 +116,20 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalNamedStoredProcedureQuery addStoredProcedureQuery(String name, String procedureName) {
-		NamedStoredProcedureQuery storedProcedureQuery = buildStoredProcedureQuery(-1);
-		storedProcedureQuery.addSelf();
-		storedProcedureQuery.setName(name);
-		storedProcedureQuery.setProcedureName(procedureName);
-		return storedProcedureQuery;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public List<ExternalAssociationOverride> associationOverrides() {
-
-		int count = associationOverridesSize();
-		List<ExternalAssociationOverride> associationOverrides = new ArrayList<ExternalAssociationOverride>(count);
-
-		for (int index = 0; index < count; index++) {
-			associationOverrides.add(buildAssociationOverride(index));
-		}
-
-		return associationOverrides;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public int associationOverridesSize() {
-		return getChildrenSize(AttributeOverride.ATTRIBUTE_OVERRIDE);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public List<ExternalAttributeOverride> attributeOverrides() {
-
-		int count = attributeOverridesSize();
-		List<ExternalAttributeOverride> attributeOverrides = new ArrayList<ExternalAttributeOverride>(count);
-
-		for (int index = 0; index < count; index++) {
-			attributeOverrides.add(buildAttributeOverride(index));
-		}
-
-		return attributeOverrides;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public int attributeOverridesSize() {
-		return getChildrenSize(AssociationOverride.ASSOCIATION_OVERRIDE);
-	}
-
-	private AssociationOverride buildAssociationOverride(int index) {
-		return new AssociationOverride(this, index);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	protected List<String> buildAttributeNamesOrder() {
 		List<String> names = new ArrayList<String>();
 		names.add(NAME);
 		names.add(ExternalEmbeddable.CLASS);
-		names.add(PARENT_CLASS);
+		names.add(PARENT_CLASS);             // EclipseLink
 		names.add(ACCESS);
 		names.add(CACHEABLE);
 		names.add(METADATA_COMPLETE);
-		names.add(READ_ONLY);
-		names.add(EXISTENCE_CHECKING);
-		names.add(EXCLUDE_DEFAULT_MAPPINGS);
+		names.add(READ_ONLY);                // EclipseLink
+		names.add(EXISTENCE_CHECKING);       // EclipseLink
+		names.add(EXCLUDE_DEFAULT_MAPPINGS); // EclipseLink
 		return names;
 	}
 
-	private AttributeOverride buildAttributeOverride(int index) {
-		return new AttributeOverride(this, index);
-	}
-
 	private DiscriminatorColumn buildDiscriminatorColumn() {
 		return new DiscriminatorColumn(this);
 	}
@@ -257,12 +141,19 @@
 	protected List<String> buildElementNamesOrder() {
 		List<String> names = new ArrayList<String>();
 		names.add(ExternalEmbeddable.DESCRIPTION);
+		names.add(ExternalAccessMethods.ACCESS_METHODS);
+		names.add(ExternalMultitenancyPolicy.MULTITENANT);
+		names.add("additional-criteria");
 		names.add(CUSTOMIZER);
 		names.add(CHANGE_TRACKING);
 		names.add(PrimaryTable.TABLE);
 		names.add(SecondaryTable.SECONDARY_TABLE);
+		names.add("struct");
 		names.add(PrimaryKeyJoinColumn.PRIMARY_KEY_JOIN_COLUMN);
+		names.add("primary-key-foreign-key");
 		names.add(NoSql.NO_SQL);
+		names.add("cascade-on-delete");
+		names.add("index");
 		names.add(ID_CLASS);
 		names.add(PrimaryKey.PRIMARY_KEY);
 		names.add(INHERITANCE);
@@ -271,19 +162,42 @@
 		names.add(CLASS_EXTRACTOR);
 		names.add(OptimisticLocking.OPTIMISTIC_LOCKING);
 		names.add(Cache.CACHE);
+		names.add(CACHE_INTERCEPTOR);
+		names.add("cache-index");
+		names.add(FetchGroup.FETCH_GROUP);
 		names.add(ClassConverter.CONVERTER);
 		names.add(TypeConverter.TYPE_CONVERTER);
 		names.add(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
+		names.add("serialized-converter");
 		names.add(StructConverter.STRUCT_CONVERTER);
 		names.add(CopyPolicy.COPY_POLICY);
 		names.add(InstantiationCopyPolicy.INSTANTIATION_COPY_POLICY);
 		names.add(CloneCopyPolicy.CLONE_COPY_POLICY);
+		names.add("serialized-object");
 		names.add(SequenceGenerator.SEQUENCE_GENERATOR);
 		names.add(TableGenerator.TABLE_GENERATOR);
+		names.add("uuid-generator");
+		names.add("partitioning");
+		names.add("replication-partitioning");
+		names.add("round-robin-partitioning");
+		names.add("pinned-partitioning");
+		names.add("range-partitioning");
+		names.add("value-partitioning");
+		names.add("hash-partitioning");
+		names.add("union-partitioning");
+		names.add("partitioned");
 		names.add(NamedQuery.NAMED_QUERY);
 		names.add(NamedNativeQuery.NAMED_NATIVE_QUERY);
 		names.add(NamedStoredProcedureQuery.NAMED_STORED_PROCEDURE_QUERY);
+		names.add("named-stored-function-query");
+		names.add("named-plsql-stored-procedure-query");
+		names.add("named-plsql-stored-function-query");
+		names.add("oracle-object");
+		names.add("oracle-array");
+		names.add("plsql-record");
+		names.add("plsql-table");
 		names.add(SQLResultSetMapping.SQL_RESULT_SET_MAPPING);
+		names.add("query-redirectors");
 		names.add(EXCLUDE_DEFAULT_LISTENERS);
 		names.add(EXCLUDE_SUPERCLASS_LISTENERS);
 		names.add(AbstractEntityListener.ENTITY_LISTENERS);
@@ -297,18 +211,12 @@
 		names.add(Property.PROPERTY);
 		names.add(AttributeOverride.ATTRIBUTE_OVERRIDE);
 		names.add(AssociationOverride.ASSOCIATION_OVERRIDE);
+		names.add("convert");
+		names.add("named-entity-graph");
 		names.add(Mapping.ATTRIBUTES);
 		return names;
 	}
 
-	private NamedNativeQuery buildNamedNativeQuery(int index) {
-		return new NamedNativeQuery(this, index);
-	}
-
-	private NamedQuery buildNamedQuery(int index) {
-		return new NamedQuery(this, index);
-	}
-
 	private PrimaryKeyJoinColumn buildPrimaryKeyJoinColumn(int index) {
 		return new PrimaryKeyJoinColumn(this, index);
 	}
@@ -325,36 +233,6 @@
 		return new SQLResultSetMapping(this, index);
 	}
 
-	private NamedStoredProcedureQuery buildStoredProcedureQuery(int index) {
-		return new NamedStoredProcedureQuery(this, index);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public ExternalAssociationOverride getAssociationOverride(int index) {
-
-		if (hasChild(AssociationOverride.ASSOCIATION_OVERRIDE, index)) {
-			return buildAssociationOverride(index);
-		}
-
-		return null;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public ExternalAttributeOverride getAttributeOverride(int index) {
-
-		if (hasChild(AttributeOverride.ATTRIBUTE_OVERRIDE, index)) {
-			return buildAttributeOverride(index);
-		}
-
-		return null;
-	}
-
 	/**
 	 * {@inheritDoc}
 	 */
@@ -443,38 +321,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalBasicNamedQuery getNamedQuery(int index) {
-
-		if (hasChild(NamedQuery.NAMED_QUERY, index)) {
-			return buildNamedQuery(index);
-		}
-
-		return null;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public ExternalBasicNamedQuery getNamedQuery(int index, String name) {
-
-		ExternalBasicNamedQuery namedQuery = getNamedQuery(index);
-
-		if (namedQuery == null) {
-			return null;
-		}
-
-		if (ObjectTools.notEquals(name, namedQuery.getName())) {
-			namedQuery = null;
-		}
-
-		return namedQuery;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public TextRange getNameTextRange() {
 		return getAttributeTextRange(NAME);
 	}
@@ -483,38 +329,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalNativeQuery getNativeQuery(int index) {
-
-		if (hasChild(NamedNativeQuery.NAMED_NATIVE_QUERY, index)) {
-			return buildNamedNativeQuery(index);
-		}
-
-		return null;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public ExternalNativeQuery getNativeQuery(int index, String name) {
-
-		ExternalNativeQuery nativeQuery = getNativeQuery(index);
-
-		if (nativeQuery == null) {
-			return null;
-		}
-
-		if (ObjectTools.notEquals(name, nativeQuery.getName())) {
-			nativeQuery = null;
-		}
-
-		return nativeQuery;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public ExternalPrimaryKeyJoinColumn getPrimaryKeyJoinColumn(int index) {
 
 		if (hasChild(PrimaryKeyJoinColumn.PRIMARY_KEY_JOIN_COLUMN, index)) {
@@ -530,7 +344,7 @@
 	@Override
 	public ExternalEntityTable getPrimaryTable() {
 
-		if (hasChild(PrimaryTable.TABLE)) {
+		if (hasPrimaryTable()) {
 			return buildPrimaryTable();
 		}
 
@@ -567,80 +381,8 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalNamedStoredProcedureQuery getStoredProcedureQuery(int index) {
-
-		if (hasChild(NamedStoredProcedureQuery.NAMED_STORED_PROCEDURE_QUERY, index)) {
-			return buildStoredProcedureQuery(index);
-		}
-
-		return null;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public ExternalNamedStoredProcedureQuery getStoredProcedureQuery(int index, String name) {
-
-		ExternalNamedStoredProcedureQuery storedProcedureQuery = getStoredProcedureQuery(index);
-
-		if (storedProcedureQuery == null) {
-			return null;
-		}
-
-		if (ObjectTools.notEquals(name, storedProcedureQuery.getName())) {
-			storedProcedureQuery = null;
-		}
-
-		return storedProcedureQuery;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public List<ExternalNamedQuery> namedQueries() {
-
-		int count = namedQueriesSize();
-		List<ExternalNamedQuery> namedQueries = new ArrayList<ExternalNamedQuery>(count);
-
-		for (int index = 0; index < count; index++) {
-			namedQueries.add(buildNamedQuery(index));
-		}
-
-		return namedQueries;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public int namedQueriesSize() {
-		return getChildrenSize(NamedQuery.NAMED_QUERY);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public List<ExternalNativeQuery> nativeQueries() {
-
-		int count = nativeQueriesSize();
-		List<ExternalNativeQuery> nativeQueries = new ArrayList<ExternalNativeQuery>(count);
-
-		for (int index = 0; index < count; index++) {
-			nativeQueries.add(buildNamedNativeQuery(index));
-		}
-
-		return nativeQueries;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public int nativeQueriesSize() {
-		return getChildrenSize(NamedNativeQuery.NAMED_NATIVE_QUERY);
+	public boolean hasPrimaryTable() {
+		return hasChild(PrimaryTable.TABLE);
 	}
 
 	/**
@@ -671,42 +413,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void removeAssociationOverride(int index) {
-		AssociationOverride associationOverride = buildAssociationOverride(index);
-		associationOverride.removeSelf();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void removeAttributeOverride(int index) {
-		AttributeOverride attributeOverride = buildAttributeOverride(index);
-		attributeOverride.removeSelf();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void removeNamedQuery(int index) {
-		NamedQuery namedQuery = buildNamedQuery(index);
-		namedQuery.removeSelf();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public void removeNativeQuery(int index) {
-		NamedNativeQuery namedNativeQuery = buildNamedNativeQuery(index);
-		namedNativeQuery.removeSelf();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public void removePrimaryKeyJoinColumn(int index) {
 		PrimaryKeyJoinColumn pkJoinColumn = buildPrimaryKeyJoinColumn(index);
 		pkJoinColumn.removeSelf();
@@ -743,15 +449,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void removeStoredProcedureQuery(int index) {
-		NamedStoredProcedureQuery storedProcedureQuery = buildStoredProcedureQuery(index);
-		storedProcedureQuery.removeSelf();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public List<ExternalSecondaryTable> secondaryTables() {
 
 		int count = secondaryTablesSize();
@@ -827,28 +524,4 @@
 	public int sqlResultSetMappingsSize() {
 		return getChildrenSize(SQLResultSetMapping.SQL_RESULT_SET_MAPPING);
 	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public List<ExternalNamedStoredProcedureQuery> storedProcedureQueries() {
-
-		int count = storedProcedureQueriesSize();
-		List<ExternalNamedStoredProcedureQuery> storedProcedureQueries = new ArrayList<ExternalNamedStoredProcedureQuery>(count);
-
-		for (int index = 0; index < count; index++) {
-			storedProcedureQueries.add(buildStoredProcedureQuery(index));
-		}
-
-		return storedProcedureQueries;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public int storedProcedureQueriesSize() {
-		return getChildrenSize(NamedStoredProcedureQuery.NAMED_STORED_PROCEDURE_QUERY);
-	}
 }
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityColumn.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityColumn.java
index 5782c23..9f676f2 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityColumn.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityColumn.java
@@ -80,7 +80,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityEntityListener.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityEntityListener.java
index a3baeac..549cc9b 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityEntityListener.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityEntityListener.java
@@ -13,6 +13,7 @@
  ******************************************************************************/
 package org.eclipse.persistence.tools.mapping.orm.dom;
 
+import java.util.Collections;
 import java.util.List;
 import org.w3c.dom.Element;
 
@@ -31,7 +32,7 @@
 	 * @param parent The parent of this external form
 	 * @param index The position of the element within the list of children with the same type owned by the parent
 	 */
-	EntityEntityListener(MappedSuperClassEntity parent, int index) {
+	EntityEntityListener(MappedSuperclass parent, int index) {
 		super(parent, index);
 	}
 
@@ -40,7 +41,14 @@
 	 */
 	@Override
 	public Element addSelf(String elementName, List<String> elementNamesOrder) {
-		return getParent().addChildrenTree(ENTITY_LISTENERS, ENTITY_LISTENER);
+
+		Element element = getParent().getChild(ENTITY_LISTENERS);
+
+		if (element == null) {
+			element = getParent().addChild(ENTITY_LISTENERS);
+		}
+
+		return addChild(element, elementName, Collections.<String>emptyList());
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityResult.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityResult.java
index e6f3830..14e9c2b 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityResult.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/EntityResult.java
@@ -78,7 +78,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/FetchGroup.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/FetchGroup.java
index 04ad49d..90eeeaf 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/FetchGroup.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/FetchGroup.java
@@ -13,6 +13,7 @@
  ******************************************************************************/
 package org.eclipse.persistence.tools.mapping.orm.dom;
 
+import java.util.ArrayList;
 import java.util.List;
 import org.eclipse.persistence.tools.mapping.AbstractExternalForm;
 import org.eclipse.persistence.tools.mapping.orm.ExternalFetchGroup;
@@ -50,7 +51,7 @@
 	 */
 	@Override
 	protected List<String> buildAttributeNamesOrder() {
-		List<String> names = super.buildAttributeNamesOrder();
+		List<String> names = new ArrayList<String>();
 		names.add(NAME);
 		names.add(LOAD);
 		return names;
@@ -61,7 +62,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
@@ -84,6 +87,14 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	protected Element getElement() {
+		return getChild(getParent(), getElementName(), index);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	protected String getElementName() {
 		return FETCH_GROUP;
 	}
@@ -108,13 +119,8 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final void removeSelf() {
-		if (index == -1) {
-			super.removeSelf();
-		}
-		else {
-			removeChild(getParent(), getElementName(), index);
-		}
+	public void removeSelf() {
+		removeChild(getParent(), getElementName(), index);
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/FieldResult.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/FieldResult.java
index 86899b7..e75ba9b 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/FieldResult.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/FieldResult.java
@@ -62,7 +62,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/IdMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/IdMapping.java
index 1f83bec..bedd496 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/IdMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/IdMapping.java
@@ -39,7 +39,7 @@
 	 *
 	 * @param parent The parent of this external form
 	 */
-	IdMapping(MappedSuperClassEntity parent) {
+	IdMapping(MappedSuperclass parent) {
 		super(parent);
 	}
 
@@ -280,14 +280,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void setAttributeType(String attributeType) {
-		setAttribute(ATTRIBUTE_TYPE, attributeType);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	@SuppressWarnings("null")
 	public void setColumn(String columnName) {
 
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/JoinColumn.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/JoinColumn.java
index ef4d4cd..4741334 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/JoinColumn.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/JoinColumn.java
@@ -79,7 +79,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/MappedSuperClassEntity.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/MappedSuperclass.java
similarity index 70%
rename from tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/MappedSuperClassEntity.java
rename to tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/MappedSuperclass.java
index 5482e9c..8296357 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/MappedSuperClassEntity.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/MappedSuperclass.java
@@ -16,6 +16,10 @@
 import java.util.ArrayList;
 import java.util.List;
 import org.eclipse.persistence.annotations.ExistenceType;
+import org.eclipse.persistence.tools.mapping.orm.ExternalAccessMethods;
+import org.eclipse.persistence.tools.mapping.orm.ExternalAssociationOverride;
+import org.eclipse.persistence.tools.mapping.orm.ExternalAttributeOverride;
+import org.eclipse.persistence.tools.mapping.orm.ExternalBasicNamedQuery;
 import org.eclipse.persistence.tools.mapping.orm.ExternalCache;
 import org.eclipse.persistence.tools.mapping.orm.ExternalEmbeddable;
 import org.eclipse.persistence.tools.mapping.orm.ExternalEmbeddedIDMapping;
@@ -24,8 +28,12 @@
 import org.eclipse.persistence.tools.mapping.orm.ExternalIDMapping;
 import org.eclipse.persistence.tools.mapping.orm.ExternalMappedSuperClass;
 import org.eclipse.persistence.tools.mapping.orm.ExternalMultitenancyPolicy;
+import org.eclipse.persistence.tools.mapping.orm.ExternalNamedQuery;
+import org.eclipse.persistence.tools.mapping.orm.ExternalNamedStoredProcedureQuery;
+import org.eclipse.persistence.tools.mapping.orm.ExternalNativeQuery;
 import org.eclipse.persistence.tools.mapping.orm.ExternalOptimisticLocking;
 import org.eclipse.persistence.tools.mapping.orm.ExternalPrimaryKey;
+import org.eclipse.persistence.tools.mapping.orm.ExternalSQLResultSetMapping;
 import org.eclipse.persistence.tools.mapping.orm.ExternalSequenceGenerator;
 import org.eclipse.persistence.tools.mapping.orm.ExternalTableGenerator;
 import org.eclipse.persistence.tools.mapping.orm.ExternalTransformationMapping;
@@ -42,16 +50,17 @@
  *
  * @version 2.6
  */
-class MappedSuperClassEntity extends Embeddable
-                             implements ExternalMappedSuperClass {
+@SuppressWarnings("nls")
+class MappedSuperclass extends Embeddable
+                       implements ExternalMappedSuperClass {
 
 	/**
-	 * Creates a new <code>MappedSuperClassEntity</code>.
+	 * Creates a new <code>MappedSuperclass</code>.
 	 *
 	 * @param parent The parent of this external form
 	 * @param index The position of the element within the list of children with the same type owned by the parent
 	 */
-	MappedSuperClassEntity(ORMConfiguration parent, int index) {
+	MappedSuperclass(ORMConfiguration parent, int index) {
 		super(parent, index);
 	}
 
@@ -114,7 +123,7 @@
 	 */
 	@Override
 	public final ExternalMultitenancyPolicy addMultitenancy() {
-		MultitenancyPolicy multitenant = buildMultitenant();
+		MultitenancyPolicy multitenant = buildMultitenancyPolicy();
 		multitenant.addSelf();
 		return multitenant;
 	}
@@ -123,6 +132,28 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public final ExternalNamedQuery addNamedQuery(String name) {
+		NamedQuery namedQuery = buildNamedQuery(-1);
+		namedQuery.addSelf();
+		namedQuery.setName(name);
+		return namedQuery;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final ExternalNativeQuery addNativeQuery(String name) {
+		NamedNativeQuery namedNativeQuery = buildNamedNativeQuery(-1);
+		namedNativeQuery.addSelf();
+		namedNativeQuery.setName(name);
+		return namedNativeQuery;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final ExternalOptimisticLocking addOptimisticLocking() {
 		OptimisticLocking optimisticLocking = buildOptimisticLocking();
 		optimisticLocking.addSelf();
@@ -143,7 +174,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalSequenceGenerator addSequenceGenerator() {
+	public final ExternalSequenceGenerator addSequenceGenerator() {
 		SequenceGenerator sequenceGenerator = buildSequenceGenerator();
 		sequenceGenerator.addSelf();
 		return sequenceGenerator;
@@ -153,7 +184,18 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalTableGenerator addTableGenerator() {
+	public final ExternalNamedStoredProcedureQuery addStoredProcedureQuery(String name) {
+		NamedStoredProcedureQuery storedProcedureQuery = buildStoredProcedureQuery(-1);
+		storedProcedureQuery.addSelf();
+		storedProcedureQuery.setName(name);
+		return storedProcedureQuery;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final ExternalTableGenerator addTableGenerator() {
 		TableGenerator tableGenerator = buildTableGenerator();
 		tableGenerator.addSelf();
 		return tableGenerator;
@@ -220,6 +262,9 @@
 	protected List<String> buildElementNamesOrder() {
 		List<String> names = new ArrayList<String>();
 		names.add(ExternalEmbeddable.DESCRIPTION);
+		names.add(ExternalAccessMethods.ACCESS_METHODS);
+		names.add(ExternalMultitenancyPolicy.MULTITENANT);
+		names.add("additional-criteria");
 		names.add(CUSTOMIZER);
 		names.add(CHANGE_TRACKING);
 		names.add(ID_CLASS);
@@ -227,16 +272,41 @@
 		names.add(OptimisticLocking.OPTIMISTIC_LOCKING);
 		names.add(Cache.CACHE);
 		names.add(CACHE_INTERCEPTOR);
+		names.add("cache-index");
 		names.add(FetchGroup.FETCH_GROUP);
 		names.add(ClassConverter.CONVERTER);
 		names.add(TypeConverter.TYPE_CONVERTER);
 		names.add(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
+		names.add("serialized-converter");
 		names.add(StructConverter.STRUCT_CONVERTER);
 		names.add(CopyPolicy.COPY_POLICY);
 		names.add(InstantiationCopyPolicy.INSTANTIATION_COPY_POLICY);
 		names.add(CloneCopyPolicy.CLONE_COPY_POLICY);
+		names.add("serialized-object");
 		names.add(SequenceGenerator.SEQUENCE_GENERATOR);
 		names.add(TableGenerator.TABLE_GENERATOR);
+		names.add("uuid-generator");
+		names.add("partitioning");
+		names.add("replication-partitioning");
+		names.add("round-robin-partitioning");
+		names.add("pinned-partitioning");
+		names.add("range-partitioning");
+		names.add("value-partitioning");
+		names.add("hash-partitioning");
+		names.add("union-partitioning");
+		names.add("partitioned");
+		names.add(ExternalBasicNamedQuery.NAMED_QUERY);;
+		names.add(ExternalNativeQuery.NAMED_NATIVE_QUERY);;
+		names.add(ExternalNamedStoredProcedureQuery.NAMED_STORED_PROCEDURE_QUERY);
+		names.add("named-stored-function-query");
+		names.add("named-plsql-stored-procedure-query");
+		names.add("named-plsql-stored-function-query");
+		names.add("oracle-object");
+		names.add("oracle-array");
+		names.add("plsql-record");
+		names.add("plsql-table");
+		names.add(ExternalSQLResultSetMapping.SQL_RESULT_SET_MAPPING);
+		names.add("query-redirectors");
 		names.add(EXCLUDE_DEFAULT_LISTENERS);
 		names.add(EXCLUDE_SUPERCLASS_LISTENERS);
 		names.add(AbstractEntityListener.ENTITY_LISTENERS);
@@ -248,6 +318,10 @@
 		names.add(POST_UPDATE);
 		names.add(POST_LOAD);
 		names.add(Property.PROPERTY);
+		names.add(ExternalAttributeOverride.ATTRIBUTE_OVERRIDE);
+		names.add(ExternalAssociationOverride.ASSOCIATION_OVERRIDE);
+		names.add("convert");
+		names.add("named-entity-graph");
 		names.add(Mapping.ATTRIBUTES);
 		return names;
 	}
@@ -302,10 +376,18 @@
 		return super.buildMapping(elementName);
 	}
 
-	private MultitenancyPolicy buildMultitenant() {
+	private MultitenancyPolicy buildMultitenancyPolicy() {
 		return new MultitenancyPolicy(this);
 	}
 
+	private NamedNativeQuery buildNamedNativeQuery(int index) {
+		return new NamedNativeQuery(this, index);
+	}
+
+	private NamedQuery buildNamedQuery(int index) {
+		return new NamedQuery(this, index);
+	}
+
 	private OptimisticLocking buildOptimisticLocking() {
 		return new OptimisticLocking(this);
 	}
@@ -318,6 +400,10 @@
 		return new SequenceGenerator(this, -1);
 	}
 
+	private NamedStoredProcedureQuery buildStoredProcedureQuery(int index) {
+		return new NamedStoredProcedureQuery(this, index);
+	}
+
 	private TableGenerator buildTableGenerator() {
 		return new TableGenerator(this, -1);
 	}
@@ -395,7 +481,7 @@
 	@Override
 	public final ExternalCache getCache() {
 
-		if (hasChild(Cache.CACHE)) {
+		if (hasCache()) {
 			return buildCache();
 		}
 
@@ -406,7 +492,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getCacheableTextRange() {
+	public final TextRange getCacheableTextRange() {
 		return getAttributeTextRange(CACHEABLE);
 	}
 
@@ -422,7 +508,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getCacheInterceptorClassNameTextRange() {
+	public final TextRange getCacheInterceptorClassNameTextRange() {
 		return getChildAttributeTextRange(CACHE_INTERCEPTOR, ExternalEmbeddable.CLASS);
 	}
 
@@ -459,7 +545,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getExcludesClassListenersTextRange() {
+	public final TextRange getExcludesDefaultListenersTextRange() {
 		return getChildTextRange(EXCLUDE_DEFAULT_LISTENERS);
 	}
 
@@ -467,7 +553,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getExcludesSuperClassListenersTextRange() {
+	public final TextRange getExcludesSuperclassListenersTextRange() {
 		return getChildTextRange(EXCLUDE_SUPERCLASS_LISTENERS);
 	}
 
@@ -483,7 +569,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getExistenceCheckingTypeTextRange() {
+	public final TextRange getExistenceCheckingTypeTextRange() {
 		return getAttributeTextRange(EXISTENCE_CHECKING);
 	}
 
@@ -512,7 +598,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getIdClassNameTextRange() {
+	public final TextRange getIdClassNameTextRange() {
 		return getChildAttributeTextRange(ID_CLASS, ExternalEmbeddable.CLASS);
 	}
 
@@ -528,10 +614,10 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalMultitenancyPolicy getMultitenant() {
+	public final ExternalMultitenancyPolicy getMultitenancy() {
 
 		if (hasChild(MultitenancyPolicy.MULTITENANT)) {
-			return buildMultitenant();
+			return buildMultitenancyPolicy();
 		}
 
 		return null;
@@ -541,7 +627,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getMultitenantTextRange() {
+	public final TextRange getMultitenancyTextRange() {
 		return getChildTextRange(MULTITENANT);
 	}
 
@@ -549,9 +635,35 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public final ExternalBasicNamedQuery getNamedQuery(int index) {
+
+		if (hasChild(NamedQuery.NAMED_QUERY, index)) {
+			return buildNamedQuery(index);
+		}
+
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final ExternalNativeQuery getNativeQuery(int index) {
+
+		if (hasChild(NamedNativeQuery.NAMED_NATIVE_QUERY, index)) {
+			return buildNamedNativeQuery(index);
+		}
+
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final ExternalOptimisticLocking getOptimisticLocking() {
 
-		if (hasChild(OptimisticLocking.OPTIMISTIC_LOCKING)) {
+		if (hasOptimisticLocking()) {
 			return buildOptimisticLocking();
 		}
 
@@ -562,22 +674,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final String getParentClassName() {
-		return getAttribute(PARENT_CLASS);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public TextRange getParentClassNameTextRange() {
-		return getAttributeTextRange(PARENT_CLASS);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public final String getPostLoadMethod() {
 		return getChildAttribute(POST_LOAD, METHOD_NAME);
 	}
@@ -594,7 +690,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getPostLoadMethodTextRange() {
+	public final TextRange getPostLoadMethodTextRange() {
 		return getChildTextNodeTextRange(POST_LOAD, ExternalEmbeddable.DESCRIPTION);
 	}
 
@@ -618,7 +714,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getPostPersistMethodTextRange() {
+	public final TextRange getPostPersistMethodTextRange() {
 		return getChildTextNodeTextRange(POST_PERSIST, ExternalEmbeddable.DESCRIPTION);
 	}
 
@@ -642,7 +738,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getPostRemoveMethodTextRange() {
+	public final TextRange getPostRemoveMethodTextRange() {
 		return getChildTextNodeTextRange(POST_REMOVE, ExternalEmbeddable.DESCRIPTION);
 	}
 
@@ -666,7 +762,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getPostUpdateMethodTextRange() {
+	public final TextRange getPostUpdateMethodTextRange() {
 		return getChildTextNodeTextRange(POST_UPDATE, ExternalEmbeddable.DESCRIPTION);
 	}
 
@@ -690,7 +786,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getPrePersistMethodTextRange() {
+	public final TextRange getPrePersistMethodTextRange() {
 		return getChildTextNodeTextRange(PRE_PERSIST, ExternalEmbeddable.DESCRIPTION);
 	}
 
@@ -714,7 +810,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getPreRemoveMethodTextRange() {
+	public final TextRange getPreRemoveMethodTextRange() {
 		return getChildTextNodeTextRange(PRE_REMOVE, ExternalEmbeddable.DESCRIPTION);
 	}
 
@@ -738,7 +834,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getPreUpdateMethodTextRange() {
+	public final TextRange getPreUpdateMethodTextRange() {
 		return getChildTextNodeTextRange(PRE_UPDATE, ExternalEmbeddable.DESCRIPTION);
 	}
 
@@ -748,7 +844,7 @@
 	@Override
 	public final ExternalPrimaryKey getPrimaryKey() {
 
-		if (hasChild(PrimaryKey.PRIMARY_KEY)) {
+		if (hasPrimaryKey()) {
 			return buildPrimaryKey();
 		}
 
@@ -759,7 +855,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getReadOnlyTextRange() {
+	public final TextRange getReadOnlyTextRange() {
 		return getAttributeTextRange(READ_ONLY);
 	}
 
@@ -767,9 +863,9 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public SequenceGenerator getSequenceGenerator() {
+	public final SequenceGenerator getSequenceGenerator() {
 
-		if (hasChild(SequenceGenerator.SEQUENCE_GENERATOR)) {
+		if (hasSequenceGenerator()) {
 			return buildSequenceGenerator();
 		}
 
@@ -780,9 +876,22 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TableGenerator getTableGenerator() {
+	public final ExternalNamedStoredProcedureQuery getStoredProcedureQuery(int index) {
 
-		if (hasChild(TableGenerator.TABLE_GENERATOR)) {
+		if (hasChild(NamedStoredProcedureQuery.NAMED_STORED_PROCEDURE_QUERY, index)) {
+			return buildStoredProcedureQuery(index);
+		}
+
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final TableGenerator getTableGenerator() {
+
+		if (hasTableGenerator()) {
 			return buildTableGenerator();
 		}
 
@@ -793,6 +902,54 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public final boolean hasCache() {
+		return hasChild(Cache.CACHE);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final boolean hasMultitenancy() {
+		return hasChild(MULTITENANT);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final boolean hasOptimisticLocking() {
+		return hasChild(OptimisticLocking.OPTIMISTIC_LOCKING);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final boolean hasPrimaryKey() {
+		return hasChild(PrimaryKey.PRIMARY_KEY);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final boolean hasSequenceGenerator() {
+		return hasChild(SequenceGenerator.SEQUENCE_GENERATOR);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final boolean hasTableGenerator() {
+		return hasChild(TableGenerator.TABLE_GENERATOR);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final Boolean isCacheable() {
 		return getBooleanAttribute(CACHEABLE);
 	}
@@ -801,16 +958,56 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public Boolean isMultitenant() {
-		return hasChild(MULTITENANT);
+	public final Boolean isReadOnly() {
+		return getBooleanAttribute(READ_ONLY);
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final Boolean isReadOnly() {
-		return getBooleanAttribute(READ_ONLY);
+	public final List<ExternalNamedQuery> namedQueries() {
+
+		int count = namedQueriesSize();
+		List<ExternalNamedQuery> namedQueries = new ArrayList<ExternalNamedQuery>(count);
+
+		for (int index = 0; index < count; index++) {
+			namedQueries.add(buildNamedQuery(index));
+		}
+
+		return namedQueries;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final int namedQueriesSize() {
+		return getChildrenSize(NamedQuery.NAMED_QUERY);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final List<ExternalNativeQuery> nativeQueries() {
+
+		int count = nativeQueriesSize();
+		List<ExternalNativeQuery> nativeQueries = new ArrayList<ExternalNativeQuery>(count);
+
+		for (int index = 0; index < count; index++) {
+			nativeQueries.add(buildNamedNativeQuery(index));
+		}
+
+		return nativeQueries;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final int nativeQueriesSize() {
+		return getChildrenSize(NamedNativeQuery.NAMED_NATIVE_QUERY);
 	}
 
 	/**
@@ -844,8 +1041,8 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void removeMultiTenancy() {
-		MultitenancyPolicy multitenant = buildMultitenant();
+	public final void removeMultiTenancy() {
+		MultitenancyPolicy multitenant = buildMultitenancyPolicy();
 		multitenant.removeSelf();
 	}
 
@@ -853,6 +1050,24 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public final void removeNamedQuery(int index) {
+		NamedQuery namedQuery = buildNamedQuery(index);
+		namedQuery.removeSelf();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final void removeNativeQuery(int index) {
+		NamedNativeQuery namedNativeQuery = buildNamedNativeQuery(index);
+		namedNativeQuery.removeSelf();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final void removeOptimisticLocking() {
 		OptimisticLocking optimisticLocking = buildOptimisticLocking();
 		optimisticLocking.removeSelf();
@@ -871,6 +1086,33 @@
 	 * {@inheritDoc}
 	 */
 	@Override
+	public final void removeSequenceGenerator() {
+		SequenceGenerator generator = buildSequenceGenerator();
+		generator.removeSelf();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final void removeStoredProcedureQuery(int index) {
+		NamedStoredProcedureQuery storedProcedureQuery = buildStoredProcedureQuery(index);
+		storedProcedureQuery.removeSelf();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final void removeTableGenerator() {
+		TableGenerator generator = buildTableGenerator();
+		generator.removeSelf();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
 	public final void setCacheable(Boolean isCacheable) {
 		setAttribute(CACHEABLE, isCacheable);
 	}
@@ -887,8 +1129,8 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final void setExcludesClassListeners(Boolean excludeClassListeners) {
-		if (excludeClassListeners == Boolean.TRUE) {
+	public final void setExcludesDefaultListeners(boolean excludeDefaultListeners) {
+		if (excludeDefaultListeners) {
 			addChild(EXCLUDE_DEFAULT_LISTENERS);
 		}
 		else {
@@ -900,8 +1142,8 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final void setExcludesSuperClassListeners(Boolean excludesSuperClassListeners) {
-		if (excludesSuperClassListeners == Boolean.TRUE) {
+	public final void setExcludesSuperclassListeners(boolean excludesSuperClassListeners) {
+		if (excludesSuperClassListeners) {
 			addChild(EXCLUDE_SUPERCLASS_LISTENERS);
 		}
 		else {
@@ -937,14 +1179,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final void setParentClassName(String className) {
-		setAttribute(PARENT_CLASS, className);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public final void setPostLoadMethod(String value) {
 		updateChildAttribute(POST_LOAD, METHOD_NAME, value);
 	}
@@ -1065,7 +1299,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final Boolean shouldExcludesClassListeners() {
+	public final boolean shouldExcludesDefaultListeners() {
 		return hasChild(EXCLUDE_DEFAULT_LISTENERS);
 	}
 
@@ -1073,7 +1307,31 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public final Boolean shouldExcludesSuperClassListeners() {
+	public final boolean shouldExcludesSuperclassListeners() {
 		return hasChild(EXCLUDE_SUPERCLASS_LISTENERS);
 	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final List<ExternalNamedStoredProcedureQuery> storedProcedureQueries() {
+
+		int count = storedProcedureQueriesSize();
+		List<ExternalNamedStoredProcedureQuery> storedProcedureQueries = new ArrayList<ExternalNamedStoredProcedureQuery>(count);
+
+		for (int index = 0; index < count; index++) {
+			storedProcedureQueries.add(buildStoredProcedureQuery(index));
+		}
+
+		return storedProcedureQueries;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public final int storedProcedureQueriesSize() {
+		return getChildrenSize(NamedStoredProcedureQuery.NAMED_STORED_PROCEDURE_QUERY);
+	}
 }
\ No newline at end of file
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Mapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Mapping.java
index 983e822..5069b94 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Mapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Mapping.java
@@ -237,7 +237,7 @@
 		Element element = getChild(getParent(), ATTRIBUTES);
 
 		if (element != null) {
-			removeChild(element, index);
+			removeChild(element, getElementName(), index);
 
 			if (!hasAnyChildren(element)) {
 				remove(getParentElement(), element);
@@ -249,7 +249,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void setAttributeType(String attributeType) {
+	public final void setAttributeType(String attributeType) {
 		setAttribute(ATTRIBUTE_TYPE, attributeType);
 
 	}
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/MultitenancyPolicy.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/MultitenancyPolicy.java
index 7a79c04..a783a28 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/MultitenancyPolicy.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/MultitenancyPolicy.java
@@ -36,7 +36,7 @@
 	 *
 	 * @param parent The parent of this external form
 	 */
-	public MultitenancyPolicy(MappedSuperClassEntity parent) {
+	public MultitenancyPolicy(MappedSuperclass parent) {
 		super(parent);
 	}
 
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/NoSqlJoinField.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/NoSqlJoinField.java
index cad3bf5..6d6c8ca 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/NoSqlJoinField.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/NoSqlJoinField.java
@@ -47,7 +47,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/NonTransientMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/NonTransientMapping.java
index 59e964b..024f153 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/NonTransientMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/NonTransientMapping.java
@@ -316,7 +316,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void removeProperty(String name) {
+	public final void removeProperty(String name) {
 		Property property = (Property) getProperty(name);
 		property.removeSelf();
 	}
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ORMConfiguration.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ORMConfiguration.java
index d32e339..e6095d8 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ORMConfiguration.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ORMConfiguration.java
@@ -75,9 +75,10 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalClassConverter addConverter() {
+	public ExternalClassConverter addConverter(String name) {
 		ClassConverter converter = buildConverter(-1);
 		converter.addSelf();
+		converter.setName(name);
 		return converter;
 	}
 
@@ -118,7 +119,7 @@
 	 */
 	@Override
 	public ExternalMappedSuperClass addMappedSuperClass(String className) {
-		MappedSuperClassEntity mappedSuperclass = buildMappedSuperclass(-1);
+		MappedSuperclass mappedSuperclass = buildMappedSuperclass(-1);
 		mappedSuperclass.addSelf();
 		mappedSuperclass.setClassName(className);
 		return mappedSuperclass;
@@ -161,9 +162,10 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalObjectTypeConverter addObjectTypeConverter() {
+	public ExternalObjectTypeConverter addObjectTypeConverter(String name) {
 		ObjectTypeConverter converter = buildObjectTypeConverter(-1);
 		converter.addSelf();
+		converter.setName(name);
 		return converter;
 	}
 
@@ -219,9 +221,10 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalStructConverter addStructConverter() {
+	public ExternalStructConverter addStructConverter(String name) {
 		StructConverter converter = buildStructConverter(-1);
 		converter.addSelf();
+		converter.setName(name);
 		return converter;
 	}
 
@@ -240,9 +243,10 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public ExternalTypeConverter addTypeConverter() {
+	public ExternalTypeConverter addTypeConverter(String name) {
 		TypeConverter converter = buildTypeConverter(-1);
 		converter.addSelf();
+		converter.setName(name);
 		return converter;
 	}
 
@@ -267,19 +271,39 @@
 		names.add(SCHEMA);
 		names.add(CATALOG);
 		names.add(ACCESS);
-		names.add(ClassConverter.CONVERTER);
-		names.add(TypeConverter.TYPE_CONVERTER);
-		names.add(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);
-		names.add(StructConverter.STRUCT_CONVERTER);
-		names.add(SequenceGenerator.SEQUENCE_GENERATOR);
-		names.add(TableGenerator.TABLE_GENERATOR);
+		names.add("access-methods");                                              // EclipseLink
+		names.add(ExternalTenantDiscriminatorColumn.TENANT_DISCRIMINATOR_COLUMN); // EclipseLink
+		names.add(ClassConverter.CONVERTER);                                      // EclipseLink - mixed converter
+		names.add(TypeConverter.TYPE_CONVERTER);                                  // EclipseLink
+		names.add(ObjectTypeConverter.OBJECT_TYPE_CONVERTER);                     // EclipseLink
+		names.add("serialized-converter");                                        // EclipseLink
+		names.add(StructConverter.STRUCT_CONVERTER);                              // EclipseLink
+		names.add(SequenceGenerator.SEQUENCE_GENERATOR);                          // EclipseLink
+		names.add(TableGenerator.TABLE_GENERATOR);                                // EclipseLink
+		names.add("uuid-generator");                                              // EclipseLink
+		names.add("partitioning");                                                // EclipseLink
+		names.add("replication-partitioning");                                    // EclipseLink
+		names.add("round-robin-partitioning");                                    // EclipseLink
+		names.add("pinned-partitioning");                                         // EclipseLink
+		names.add("range-partitioning");                                          // EclipseLink
+		names.add("value-partitioning");                                          // EclipseLink
+		names.add("hash-partitioning");                                           // EclipseLink
+		names.add("union-partitioning");                                          // EclipseLink
 		names.add(NamedQuery.NAMED_QUERY);
 		names.add(NamedNativeQuery.NAMED_NATIVE_QUERY);
-		names.add(NamedStoredProcedureQuery.NAMED_STORED_PROCEDURE_QUERY);
+		names.add(NamedStoredProcedureQuery.NAMED_STORED_PROCEDURE_QUERY);        // EclipseLink
+		names.add("named-stored-function-query");                                 // EclipseLink
+		names.add("named-plsql-stored-procedure-query");                          // EclipseLink
+		names.add("named-plsql-stored-function-query");                           // EclipseLink
+		names.add("oracle-object");                                               // EclipseLink
+		names.add("oracle-array");                                                // EclipseLink
+		names.add("plsql-record");                                                // EclipseLink
+		names.add("plsql-table");                                                 // EclipseLink
 		names.add(SQLResultSetMapping.SQL_RESULT_SET_MAPPING);
-		names.add(MappedSuperClassEntity.MAPPED_SUPERCLASS);
+		names.add(MappedSuperclass.MAPPED_SUPERCLASS);
 		names.add(Entity.ENTITY);
 		names.add(Embeddable.EMBEDDABLE);
+//		names.add(ClassConverter.CONVERTER);                                      // Generic JPA, we'll assume EclipseLink
 		return names;
 	}
 
@@ -291,8 +315,8 @@
 		return new Entity(this, index);
 	}
 
-	private MappedSuperClassEntity buildMappedSuperclass(int index) {
-		return new MappedSuperClassEntity(this, index);
+	private MappedSuperclass buildMappedSuperclass(int index) {
+		return new MappedSuperclass(this, index);
 	}
 
 	private NamedNativeQuery buildNamedNativeQuery(int index) {
@@ -617,7 +641,7 @@
 	@Override
 	public ExternalMappedSuperClass getMappedSuperClass(int index) {
 
-		if (hasChild(MappedSuperClassEntity.MAPPED_SUPERCLASS, index)) {
+		if (hasChild(MappedSuperclass.MAPPED_SUPERCLASS, index)) {
 			return buildMappedSuperclass(index);
 		}
 
@@ -906,7 +930,7 @@
 	 */
 	@Override
 	public int mappedSuperClassesSize() {
-		return getChildrenSize(MappedSuperClassEntity.MAPPED_SUPERCLASS);
+		return getChildrenSize(MappedSuperclass.MAPPED_SUPERCLASS);
 	}
 
 	/**
@@ -1035,7 +1059,7 @@
 	 */
 	@Override
 	public void removeMappedSuperClass(int index) {
-		MappedSuperClassEntity entity = buildMappedSuperclass(index);
+		MappedSuperclass entity = buildMappedSuperclass(index);
 		entity.removeSelf();
 	}
 
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ObjectCollectionMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ObjectCollectionMapping.java
index bd307de..8a7dd80 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ObjectCollectionMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/ObjectCollectionMapping.java
@@ -406,14 +406,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void setAttributeType(String attributeType) {
-		setAttribute(ATTRIBUTE_TYPE, attributeType);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public void setMapKey(String mapKey) {
 
 		if (mapKey == null) {
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/OptimisticLocking.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/OptimisticLocking.java
index b6eafc5..3dd4791 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/OptimisticLocking.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/OptimisticLocking.java
@@ -36,7 +36,7 @@
 	 *
 	 * @param parent The parent of this external form
 	 */
-	OptimisticLocking(MappedSuperClassEntity parent) {
+	OptimisticLocking(MappedSuperclass parent) {
 		super(parent);
 	}
 
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PersistenceUnitEntityListener.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PersistenceUnitEntityListener.java
index 92c3c6c..e7aecf5 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PersistenceUnitEntityListener.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PersistenceUnitEntityListener.java
@@ -13,6 +13,7 @@
  ******************************************************************************/
 package org.eclipse.persistence.tools.mapping.orm.dom;
 
+import java.util.Collections;
 import java.util.List;
 import org.w3c.dom.Element;
 
@@ -39,11 +40,20 @@
 	 */
 	@Override
 	public Element addSelf(String elementName, List<String> elementNamesOrder) {
-		return getParent().addChildrenTree(
-			PersistenceUnit.PERSISTENCE_UNIT_DEFAULTS,
-			ENTITY_LISTENERS,
-			ENTITY_LISTENER
-		);
+
+		Element parentElement = getParent().getChild(PersistenceUnit.PERSISTENCE_UNIT_DEFAULTS);
+
+		if (parentElement == null) {
+			parentElement = getParent().addChild(PersistenceUnit.PERSISTENCE_UNIT_DEFAULTS);
+		}
+
+		Element element = getChild(parentElement, ENTITY_LISTENERS);
+
+		if (element == null) {
+			element = addChild(parentElement, ENTITY_LISTENERS);
+		}
+
+		return addChild(element, elementName, Collections.<String>emptyList());
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryKey.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryKey.java
index 9222165..82cf042 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryKey.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryKey.java
@@ -37,7 +37,7 @@
 	 *
 	 * @param parent The parent of this external form
 	 */
-	PrimaryKey(MappedSuperClassEntity parent) {
+	PrimaryKey(MappedSuperclass parent) {
 		super(parent);
 	}
 
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryKeyJoinColumn.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryKeyJoinColumn.java
index 0ed2a61..a864287 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryKeyJoinColumn.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryKeyJoinColumn.java
@@ -65,7 +65,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryTable.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryTable.java
index dca999a..51269d1 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryTable.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/PrimaryTable.java
@@ -20,15 +20,9 @@
  *
  * @version 2.6
  */
-@SuppressWarnings("nls")
 final class PrimaryTable extends Table {
 
 	/**
-	 * The node name used to store and retrieve the element encapsulated by this external form.
-	 */
-	static final String TABLE = "table";
-
-	/**
 	 * Creates a new <code>EntityTable</code>.
 	 *
 	 * @param parent The parent of this external form
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Property.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Property.java
index 2490d2a..86abf47 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Property.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/Property.java
@@ -63,7 +63,17 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	protected Element getElement() {
+		return getChild(getParent(), getElementName(), index);
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/QueryHint.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/QueryHint.java
index 70aa0ea..90b2837 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/QueryHint.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/QueryHint.java
@@ -61,7 +61,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/RelationshipMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/RelationshipMapping.java
index 09d24d4..22d758d 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/RelationshipMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/RelationshipMapping.java
@@ -190,7 +190,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getCascadeTypeTextRange() {
+	public final TextRange getCascadeTypeTextRange() {
 		return getChildTextRange(CASCADE);
 	}
 
@@ -206,7 +206,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getFetchTypeTextRange() {
+	public final TextRange getFetchTypeTextRange() {
 		return getAttributeTextRange(FETCH);
 	}
 
@@ -222,7 +222,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getJoinFetchTypeTextRange() {
+	public final TextRange getJoinFetchTypeTextRange() {
 		return getChildTextNodeTextRange(JOIN_FETCH);
 	}
 
@@ -243,8 +243,8 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getOptionalTextRange() {
-		return null;
+	public final TextRange getOptionalTextRange() {
+		return getAttributeTextRange(OPTIONAL);
 	}
 
 	/**
@@ -259,7 +259,7 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public TextRange getTargetEntityNameTextRange() {
+	public final TextRange getTargetEntityNameTextRange() {
 		return getAttributeTextRange(TARGET_ENTITY);
 	}
 
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/SQLResultSetMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/SQLResultSetMapping.java
index d5e4d2f..6020702 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/SQLResultSetMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/SQLResultSetMapping.java
@@ -96,7 +96,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/SecondaryTable.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/SecondaryTable.java
index 33e3b9e..1edd6a2 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/SecondaryTable.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/SecondaryTable.java
@@ -76,7 +76,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/StoredProcedureParameter.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/StoredProcedureParameter.java
index 82a379b..c8e5611 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/StoredProcedureParameter.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/StoredProcedureParameter.java
@@ -68,7 +68,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/TransformationMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/TransformationMapping.java
index 3a53464..50a533e 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/TransformationMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/TransformationMapping.java
@@ -201,14 +201,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void setAttributeType(String attributeType) {
-		setAttribute(ATTRIBUTE_TYPE, attributeType);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	public void setFetchType(FetchType type) {
 		setAttribute(FETCH, type);
 	}
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/UniqueConstraint.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/UniqueConstraint.java
index 6f270c9..41ba7dd 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/UniqueConstraint.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/UniqueConstraint.java
@@ -51,7 +51,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/VersionMapping.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/VersionMapping.java
index d730fb5..249ee55 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/VersionMapping.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/VersionMapping.java
@@ -35,7 +35,7 @@
 	 *
 	 * @param parent The parent of this external form
 	 */
-	VersionMapping(MappedSuperClassEntity parent) {
+	VersionMapping(MappedSuperclass parent) {
 		super(parent);
 	}
 
@@ -158,14 +158,6 @@
 	 * {@inheritDoc}
 	 */
 	@Override
-	public void setAttributeType(String attributeType) {
-		setAttribute(ATTRIBUTE_TYPE, attributeType);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
 	@SuppressWarnings("null")
 	public void setColumn(String columnName) {
 
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/WriteTransfomer.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/WriteTransfomer.java
index db695a6..d0a4414 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/WriteTransfomer.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/orm/dom/WriteTransfomer.java
@@ -84,7 +84,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/persistence/dom/PersistenceUnit.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/persistence/dom/PersistenceUnit.java
index 317659b..eaf428d 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/persistence/dom/PersistenceUnit.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/persistence/dom/PersistenceUnit.java
@@ -92,7 +92,9 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		index = index(parent, child, elementName);
+		if (elementName == getElementName()) {
+			index = index(parent, child, elementName);
+		}
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/persistence/dom/Property.java b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/persistence/dom/Property.java
index 03a99fd..d5bc297 100644
--- a/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/persistence/dom/Property.java
+++ b/tools/org.eclipse.persistence.tools.mapping/src/org/eclipse/persistence/tools/mapping/persistence/dom/Property.java
@@ -13,6 +13,7 @@
  ******************************************************************************/
 package org.eclipse.persistence.tools.mapping.persistence.dom;
 
+import java.util.Collections;
 import java.util.List;
 import org.eclipse.persistence.tools.mapping.AbstractExternalForm;
 import org.eclipse.persistence.tools.mapping.ExternalProperty;
@@ -52,7 +53,14 @@
 	 */
 	@Override
 	public Element addSelf(String elementName, List<String> elementNamesOrder) {
-		return addChildrenTree(getParent(), elementNamesOrder, ExternalPropertyHolder.PROPERTIES, PROPERTY);
+
+		Element element = getParent().getChild(ExternalPropertyHolder.PROPERTIES);
+
+		if (element == null) {
+			element = getParent().addChild(ExternalPropertyHolder.PROPERTIES);
+		}
+
+		return addChild(element, elementName, Collections.<String>emptyList());
 	}
 
 	/**
@@ -60,7 +68,7 @@
 	 */
 	@Override
 	protected void calculateInsertionIndex(Element parent, Element child, String elementName) {
-		if (elementName == PROPERTY) {
+		if (elementName == getElementName()) {
 			index = index(parent, child, elementName);
 		}
 	}
diff --git a/tools/org.eclipse.persistence.tools.utility/src/org/eclipse/persistence/tools/utility/ClassTools.java b/tools/org.eclipse.persistence.tools.utility/src/org/eclipse/persistence/tools/utility/ClassTools.java
index f3f4f1b..2f7fe2c 100644
--- a/tools/org.eclipse.persistence.tools.utility/src/org/eclipse/persistence/tools/utility/ClassTools.java
+++ b/tools/org.eclipse.persistence.tools.utility/src/org/eclipse/persistence/tools/utility/ClassTools.java
@@ -282,14 +282,14 @@
 	 * Return its result.
 	 * Useful for invoking private, package, or protected methods.
 	 */
-	public static Object execute(Class<?> javaClass, String methodName) {
+	public static <T> T execute(Class<?> javaClass, String methodName) {
 		return execute(javaClass, methodName, EMPTY_ARRAY, ObjectTools.EMPTY_OBJECT_ARRAY);
 	}
 
 	/**
 	 * @see #execute(Class, String)
 	 */
-	public static Object execute_(Class<?> javaClass, String methodName)
+	public static <T> T execute_(Class<?> javaClass, String methodName)
 		throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
 	{
 		return execute_(javaClass, methodName, EMPTY_ARRAY, ObjectTools.EMPTY_OBJECT_ARRAY);
@@ -300,14 +300,14 @@
 	 * Return its result.
 	 * Useful for invoking private, package, or protected methods.
 	 */
-	public static Object execute(Class<?> javaClass, String methodName, Class<?> parameterType, Object argument) {
+	public static <T> T execute(Class<?> javaClass, String methodName, Class<?> parameterType, Object argument) {
 		return execute(javaClass, methodName, new Class[] {parameterType}, new Object[] {argument});
 	}
 
 	/**
 	 * @see #execute(Class, String, Class, Object)
 	 */
-	public static Object execute_(Class<?> javaClass, String methodName, Class<?> parameterType, Object argument)
+	public static <T> T execute_(Class<?> javaClass, String methodName, Class<?> parameterType, Object argument)
 		throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
 	{
 		return execute_(javaClass, methodName, new Class[] {parameterType}, new Object[] {argument});
@@ -318,7 +318,7 @@
 	 * Return its result.
 	 * Useful for invoking private, package, or protected methods.
 	 */
-	public static Object execute(Class<?> javaClass, String methodName, Class<?>[] parameterTypes, Object[] arguments) {
+	public static <T> T execute(Class<?> javaClass, String methodName, Class<?>[] parameterTypes, Object[] arguments) {
 		try {
 			return execute_(javaClass, methodName, parameterTypes, arguments);
 		} catch (NoSuchMethodException ex) {
@@ -333,10 +333,11 @@
 	/**
 	 * @see #execute(Class, String, Class[], Object[])
 	 */
-	public static Object execute_(Class<?> javaClass, String methodName, Class<?>[] parameterTypes, Object[] arguments)
+	@SuppressWarnings("unchecked")
+	public static <T> T execute_(Class<?> javaClass, String methodName, Class<?>[] parameterTypes, Object[] arguments)
 		throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
 	{
-		return staticMethod_(javaClass, methodName, parameterTypes).invoke(null, arguments);
+		return (T) staticMethod_(javaClass, methodName, parameterTypes).invoke(null, arguments);
 	}
 
 	/**
diff --git a/tools/org.eclipse.persistence.tools.utility/src/org/eclipse/persistence/tools/utility/ObjectTools.java b/tools/org.eclipse.persistence.tools.utility/src/org/eclipse/persistence/tools/utility/ObjectTools.java
index 80380ba..9cd7dde 100644
--- a/tools/org.eclipse.persistence.tools.utility/src/org/eclipse/persistence/tools/utility/ObjectTools.java
+++ b/tools/org.eclipse.persistence.tools.utility/src/org/eclipse/persistence/tools/utility/ObjectTools.java
@@ -258,7 +258,7 @@
 	 * Useful for accessing private, package, or protected fields.
 	 * @see Field#get(Object)
 	 */
-	public static Object get(Object object, String fieldName) {
+	public static <T> T get(Object object, String fieldName) {
 		try {
 			return get_(object, fieldName);
 		} catch (NoSuchFieldException ex) {
@@ -271,10 +271,11 @@
 	/**
 	 * @see #get(Object, String)
 	 */
-	public static Object get_(Object object, String fieldName)
+	@SuppressWarnings("unchecked")
+	public static <T> T get_(Object object, String fieldName)
 		throws NoSuchFieldException, IllegalAccessException
 	{
-		return field_(object, fieldName).get(object);
+		return (T) field_(object, fieldName).get(object);
 	}
 
 	/**
@@ -337,7 +338,7 @@
 	 * Return its result.
 	 * Useful for invoking private, package, or protected methods.
 	 */
-	public static Object execute(Object object, String methodName) {
+	public static <T> T execute(Object object, String methodName) {
 		return execute(object, methodName, ClassTools.EMPTY_ARRAY, EMPTY_OBJECT_ARRAY);
 	}
 
@@ -362,7 +363,7 @@
 	/**
 	 * @see #execute(Object, String, Class, Object)
 	 */
-	public static Object execute_(Object object, String methodName, Class<?> parameterType, Object argument)
+	public static <T> T execute_(Object object, String methodName, Class<?> parameterType, Object argument)
 		throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
 	{
 		return execute_(object, methodName, new Class[] {parameterType}, new Object[] {argument});
@@ -373,7 +374,7 @@
 	 * Return its result.
 	 * Useful for invoking private, package, or protected methods.
 	 */
-	public static Object execute(Object object, String methodName, Class<?>[] parameterTypes, Object[] arguments) {
+	public static <T> T execute(Object object, String methodName, Class<?>[] parameterTypes, Object[] arguments) {
 		return execute(object, method(object, methodName, parameterTypes), arguments);
 	}
 
@@ -382,9 +383,10 @@
 	 * Return its result.
 	 * Useful for invoking cached methods.
 	 */
-	public static Object execute(Object receiver, Method method, Object[] arguments) {
+	@SuppressWarnings("unchecked")
+	public static <T> T execute(Object receiver, Method method, Object[] arguments) {
 		try {
-			return method.invoke(receiver, arguments);
+			return (T) method.invoke(receiver, arguments);
 		} catch (IllegalAccessException ex) {
 			throw new RuntimeException(ex + StringTools.CR + method, ex);
 		} catch (InvocationTargetException ex) {
@@ -395,10 +397,11 @@
 	/**
 	 * @see #execute(Object, String, Class[], Object[])
 	 */
-	public static Object execute_(Object object, String methodName, Class<?>[] parameterTypes, Object[] arguments)
+	@SuppressWarnings("unchecked")
+	public static <T> T execute_(Object object, String methodName, Class<?>[] parameterTypes, Object[] arguments)
 		throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
 	{
-		return method_(object, methodName, parameterTypes).invoke(object, arguments);
+		return (T) method_(object, methodName, parameterTypes).invoke(object, arguments);
 	}
 
 	/**