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);
 	}
 
 	/**
